Saltstack快速入门简单汇总


Posted in Python onMarch 01, 2016

saltstack是使用python编写的开源自动化部署与管理工具,拥有良好的扩展性以及优秀的执行效率,配置简单,可以工作在多平台上,经常被描述为 Func加强版+Puppet精简版。

saltsatck优点:首先,速度快,基于消息队列+线程,跑完多台设备,都是毫秒级别的;其次,非常灵活,源码是python,方便理解和自定义模块;最后,命令简单,功能强大。

前言:在很久以前,只有几台主机的时候当然不需要什么自动糊工具,但是随着硬件成本越来越低廉的今天,随随便便就好几十台服务器,靠手工不是搞不定,但是反复的重复着没有太多技术的操作一定会让人抓狂的的,所以有必要选择一个可以批量操作部署的自动化工具,诸如Pupet,ansible,rundeck,faric之类的工具不少少,碍于水平有限,暂时就saltstack稍微溜一点,简单汇总一下基本的概念,操作等。

参考环境centos6.5

安装:

rpm -Uvh http://mirror.pnl.gov/epel/6/x86_64/epel-release-6-8.noarch.rpm

最新的似乎是2015.8.1,如果用pip安装的话

master安装

yum install salt-master -y

chkconfig salt-master on

sed -i "s/# interface: 0.0.0.0/ interface: MasterIP地址/" /etc/salt/master ###绑定master端IP地址

service salt-master start ###启动salt-master

Minion安装

yum install salt-minion ?y

chkconfig salt-minion on

sed -i "s/#master: salt/ master: MasterIP地址/" /etc/salt/minion ###传入Master端IP地址

service salt-minion start ###启动salt-minion

如果开启防火墙的话,需要配置防火墙,参考https://docs.saltstack.com/en/latest/topics/tutorials/firewall.html#iptables

# Allow Minions from these networks

-I INPUT -s 10.1.2.0/24 -p tcp -m multiport --dports 4505,4506 -j ACCEPT

-I INPUT -s 10.1.3.0/24 -p tcp -m multiport --dports 4505,4506 -j ACCEPT

# Allow Salt to communicate with Master on the loopback interface

-A INPUT -i lo -p tcp -m multiport --dports 4505,4506 -j ACCEPT

# Reject everything else

-A INPUT -p tcp -m multiport --dports 4505,4506 -j REJECT

在master,minion分别启动后会minion端会到master这里申请认证

master执行:

salt-key ?L ##列出所有认证的客户端

Accepted Keys:(已经接受的)

minion-id-1

Denied Keys:(未被允许的)

Unaccepted Keys:(未接受的)

minion-id-2

Rejected Keys:(拒绝的)

# salt-key ?A ##接受所有

每个minion客户端的都有一个minion_id 即上面的minion-id-1 minion-id-2 就是客户端的minion_id 默认是取得客户端的主机名,而minion-id是不能重复的!!!

注:如需更改需要在客户端修改/etc/salt/minion_id配置文件,此文件只有在salt-minion启动后才会生成

Salt-key常用命令

salt-key ?a 接受某个客户端请求

salt-key ?A 接受所有客户端请求

salt-key ?d 删除单个客户端

salt-key ?D 删除所有客户端

注:删除之后,如需重新认证,重启客户端即可

Salt配置文件

两个重要的配置参数是file_roots(定义环境的目录),nodegroups(定义组)

主要配置文件在/etc/salt/master(master端)

/etc/salt/minion(minion端)

注:master端配置文件默认是会加载所有/etc/salt/master.d/(此目录默认不存在,需自己创建)目录下的所有以.conf结尾的配置文件,为了更易阅读,我将所有的自定义参数每个单一的创建一个配置文件,如环境变量,可以分别设置生产,测试,开发环境,在往下分就是主机的应用级别分类,根据具体环境,具体设置。

/etc/salt/master.d/env.conf

file_roots:

base:

- /data/salt/base

- /data/salt/base/sls

apache:

- /data/salt/apache

- /data/salt/apache/confsls

nginx:

- /data/salt/tomcat

- /data/salt/nginx/confsls

mysql:

- /data/salt/mysql

如上述配置所述,一共定义了四个个环境,分别是base,apache,nginx,mysql等,环境变量的作用在下面会说到,主要是配合sls文件使用

不同环境的sls配置文件的目录分别放在对应的目录,比如base环境的sls文件,既可以放在/data/salt/base 也可以放在/data/salt/base/sls,其中sls文件是什么会在后面说到

接下来配置所有minion的分组信息,按照用途或者不同ip等分类信息分别定义组名

/etc/salt/master.d/groups.conf

nodegroups:

redis: 'redis*'

mysql: 'mysql*'

apache: 'tomcat* not apache-[1][3-4]'

nottom: '* not tomcat*'

如上所述上面一共定义了四个组

注:注意上面的格式,salt几乎所有的配置文件遵循两个空格为一个递进的方式(即file_root下面空两个的都是它的参数,二它参数下面空两格的又是它参数的参数,后面写配置文件会更全面的介绍),而且不能用tab键补全!!!

Salt常用命令:

Salt语法

salt [客户端id,即目标] [模块名,如state,cmd。其实都是salt的模块] [动作]

接触saltstack的第一个salt命令一定是test.ping,主要用于探测客户端的存活状态

注:常用的两个模块主要是state,cmd两个模块,分别对应的功能就是state(状态,在后面会详细叙述,什么是状态),以及cmd(远程执行,而用到此模块的方法一般就是cmd.run)

首先介绍target,目标,或者说客户端id的匹配方式

[root@master~]# salt \* test.ping

minion-1:

True

minion-2:

True

minion-3:

True

minion-4:

True

True代表正常,没有响应当然代表客户端没有启动或者没有认证成功之类的。

指定目标主要有五种方式

一: Global,即salt默认的匹配方式,能识别终端常用的通配符,如*代表所有

如,salt '*' test.ping

二: List,列表,需-L指定。

如,salt -L 'foo,bar' test.ping 其中foo,bar是完整的minion_id

三:正则表达式,需-E指定。

如,salt -E 'pre[1-7]' test.ping 会匹配pre1,pre2..pre7,并且匹配到左右minion_id里面含有1-7的,如pre-11,pre7也会匹配到,如果只匹配1-7可使用参照下面

如,salt -E ^pre[1-7]$ test.ping或者 salt pre[1-7] test.ping

四:混合模式,需-C指定。里面可以既有正则表达式也有列表等

salt -C "apache* or E@ngin*" test.ping 匹配所有tomcat开头,或者mon开头的

五:分组,需要-N指定,其中组名就是上面/etc/salt/master.d/groups.conf文件里面配置的配置信息。

如,salt -N apache test.ping

然后是模块,主要介绍state,cmd,cp模块

注:想了解某个模块的功能或者具体参数可以

salt \* sys.doc [模块名,如cmd]

即salt \* sys.doc cmd 就会列出相关操作及示例了

远程命令执行

远程命令执行大概是最常用的操作的,比如获取所有minion端的ip地址,查看同一个目录下的文件,全部增加一条环境变量到/etc/profile文件里并刷新环境变量等等操作

cmd模块

主要用此模块的run方法,即cmd.run

使用方式如下,

salt \* cmd.run 'ls /root'

如上所示,选择了所有的客户端,master端用cmd.run模块,把''里面的'ls /root'命令全部分发下去,其中单引号''也可以用双引号""代替,引号的作用就是把被引号的命令传给salt-master,然后master分发给所有的minion执行,上述命令就会列出所有minion端/root目录下的文件

注:引号里面的命令跟在任何一台机器上的命令没有任何区别,唯一的区别就是salt执行的命令默认用的是sh,而我们常用的shell是bash,比如bash中ll是ls ?l的别名,而sh里面是没有做ll的别名的,所以引号里面的命令如果用ll命令会提示找不到此命的

cmd有几个有用的参数,在可以着重介绍一下

cwd 定义命令所在的目录,即工作目录,在哪个目录执行操作
如:

Salt \* cmd.run cwd=/opt ‘pwd'

minion-id-1:

/opt

runas,定义执行此条命令的用户,使用哪个用户执行这条命令
如:

Salt \* cmd.run runas=nobody ‘touch /tmp/file'

然后去客户端就会发现,在/tmp/目录下有一个file文件,拥有者是nobody

然后就state模块了

主要用到的几个方法是sls,highstate,show_sls

在讲state模块的时候首先得了解sls文件。

Sls文件用.sls结尾,放在指定的环境目录下,即提到的/data/salt/base /data/salt/base/sls或者/data/salt/apache/sls等目录

注:假如在这两个目录下有两个一样的sls文件,那么会file_root配置的第一个环境目录,即

比如环境:

base:

/data/salt/base

/data/salt/base/sls

会执行/data/salt/base里的sls文件,因为它在前一行

sls文件基本格式如下:

例子一

/tmp/ttt20:

file.managed:

- source: salt://files/tst

- mode: 700

- backup: minion

- makedirs: True

例子二

testfile:

file.managed:

- name: /tmp/ttt20

- source: salt://files/tst

- mode: 700

- backup: minion

- makedirs: True

如上所示,其实例子一与例子二是达成了一样的效果,只不过写法不一样
像例子一,因为没有- name: /tmp/ttt20所以,它会去第一行的标识作为name
,而例子二的testfile可以任意起名,只要不与该文件中的其他标识一样即可。

上面的例子达到的功能就是,将/srv/salt/files/tst文件复制到客户端的/tmp/ttt20位置,如果存在则替换,如果已存在且一样则提示is correct state,即已经是正确的状态了。

然后就是top.sls

在每个独立的salt环境下有且只能有一个top.sls文件,这个文件为该环境的入口文件,里面记录了目标主机对应的sls文件
如:

base:

minion-id-1:
- test1
- test2

minion-id-2:
- test1
- test3

以tomcat-1为例

它匹配了

- test1
- test2

上面一共是一个2个sls配置文件,即匹配该环境下的test11.sls,test2.sls文件
所以在执行state模块的时候,它会去检索这些对应的配置文件并执行该配置文件里的内容。
注:在前面提到过,这些参数前面的空格不能用tab键补全或者少写,不然会报错,再者就是如果配置文件为xxxx.sls 在调用这个配置文件的时候只要写xxxx,即它的文件名,没有后缀

以test1为例

/tmp/testfile.txt:

file.managed:

- source: salt://test.txt

- mode: 700

- user: root

- mode: 644

- makedirs: True

功能就是调用file模块,将salt://test.txt(其中,salt://对于该环境的file_root目录,即/data/salt/base)与目标的/tmp/testfile.txt文件做比对,如不一致则更新。

并且此文件的拥有者为root mask码为644,如果目标文件目录不存在就创建

现在回到highstate,sls,show_sls方法

执行如下

salt \* state.sls test

salt \* state.highstate 

salt \* state.show_sls test

上面的意思依次是

1.在当前环境下寻找test.sls文件并执行

2.匹配当前环境的top.sls文件所有的sls文件并执行

3.查看当前环境test.sls文件的执行内容,但是不在客户端执行。

注:上面特别提到了是在当前环境,默认情况下,salt只会查找执行base环境下的sls文件,不会执行其他环境的配置文件,所以在不同环境下,需要指定要执行的配置环境,比如apache环境,只是执行apache的sls文件的话,则需声明saltenv=apache,如下

salt \* state.sls test saltenv=apache

salt \* state.highstate saltenv=apache

salt \* state.show_sls test saltenv=apache
Python 相关文章推荐
Python的Django框架中自定义模版标签的示例
Jul 20 Python
python 实现提取某个索引中某个时间段的数据方法
Feb 01 Python
pycharm配置git(图文教程)
Aug 16 Python
django使用xadmin的全局配置详解
Nov 15 Python
keras小技巧——获取某一个网络层的输出方式
May 23 Python
面向新手解析python Beautiful Soup基本用法
Jul 11 Python
Python3爬虫带上cookie的实例代码
Jul 28 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
Jan 05 Python
python 自动识别并连接串口的实现
Jan 19 Python
python pygame入门教程
Jun 01 Python
python库Tsmoothie模块数据平滑化异常点抓取
Jun 10 Python
使用opencv-python如何打开USB或者笔记本前置摄像头
Jun 21 Python
通过Python使用saltstack生成服务器资产清单
Mar 01 #Python
Python解析json文件相关知识学习
Mar 01 #Python
使用简单工厂模式来进行Python的设计模式编程
Mar 01 #Python
Python文件处理
Feb 29 #Python
python 默认参数问题的陷阱
Feb 29 #Python
简要讲解Python编程中线程的创建与锁的使用
Feb 28 #Python
Python中time模块和datetime模块的用法示例
Feb 28 #Python
You might like
php 正确解码javascript中通过escape编码后的字符
2010/01/28 PHP
php 按指定元素值去除数组元素的实现方法
2011/11/04 PHP
php函数与传递参数实例分析
2014/11/15 PHP
php实现encode64编码类实例
2015/03/24 PHP
Thinkphp实现自动验证和自动完成
2015/12/19 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
2020/11/22 PHP
简单通用的JS滑动门代码
2008/12/19 Javascript
常见的jQuery选择器汇总
2014/11/24 Javascript
javascript实现回车键提交表单方法总结
2015/01/10 Javascript
Backbone.js的Hello World程序实例
2015/06/19 Javascript
利用js获取下拉框中所选的值
2016/12/01 Javascript
微信小程序 MD5的方法详解及实例代码
2017/03/10 Javascript
postman+json+springmvc测试批量添加实例
2018/03/31 Javascript
antd组件Upload实现自己上传的实现示例
2018/12/18 Javascript
如何在postman中添加cookie信息步骤解析
2020/06/30 Javascript
[15:15]教你分分钟做大人:狙击手
2014/10/30 DOTA
Python实现简单字典树的方法
2016/04/29 Python
Python 装饰器深入理解
2017/03/16 Python
python3.5 email实现发送邮件功能
2018/05/22 Python
python pcm音频添加头转成Wav格式文件的方法
2019/01/09 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
2019/01/23 Python
新年快乐! python实现绚烂的烟花绽放效果
2019/01/30 Python
[机器视觉]使用python自动识别验证码详解
2019/05/16 Python
详细分析Python垃圾回收机制
2020/07/01 Python
CSS3基础(RGBa、text-shadow、box-shadow、border-radius)
2012/11/13 HTML / CSS
Invicta手表官方商店:百年制表历史的瑞士腕表品牌
2019/09/26 全球购物
2019年分享net面试的经历和题目
2016/08/07 面试题
法学专业求职信
2014/07/15 职场文书
邀请函格式范文
2015/02/02 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
工程催款通知书
2015/04/17 职场文书
开展警示教育活动总结
2015/05/09 职场文书
保护环境建议书作文300字
2015/09/14 职场文书
调解协议书范本
2016/03/21 职场文书
Nginx四层负载均衡的配置指南
2021/06/11 Servers