Contents
19.7. Saltstack安装使用入门(自己总结)¶
19.7.1. 安装部署篇:¶
salt-master启动时会自动监听两个端口4505和4506
4506的作用:Salt Master Ret接口:支持认证、文件服务、结果收集等功能
4505的作用:Salt Master pub接口,提供远程执行命令发送功能
Salt minion启动时会从配置文件中获取master的地址,如果是域名会进行解析,解析完成之后,会连接master的4506(Ret接口)
进行key认证,认证通过会获取到master的publish_port(4505) 然后连接publist_port订阅来自master pub接口的任务,
当master下发操作指令时,所有的 minion都能接收到, 然后 minion会检查本机是否匹配。如果匹配,则执行。
执行完毕后把结果发生到master的4506(Ret接口),由 master进行处理。命令发送通信完全是异步的。命令包很小。命令都
通过maqpack进行数据压缩,所以Salt的网络负载非常低。
19.7.2. 快速入门SaltStack快速入门SaltStack¶
1.Master:控制中心,salt命令运行和资源状态管理
2.Minion : 需要管理的客户端机器,会主动去连接Mater端,并从Master端得到资源状态
信息,同步资源管理信息
3.States:配置管理的指令集
4.Modules:在命令行中和配置文件中使用的指令模块,可以在命令行中运行
5.Grains:minion端的变量,静态的
6.Pillar:minion端的变量,动态的比较私密的变量,可以通过配置文件实现同步minions定义
7.highstate:为minion端下发永久添加状态,从sls配置文件读取.即同步状态配置
8.salt_schedule:会自动保持客户端配置
19.7.3. 默认以CentOS6、7为例,采用yum安装¶
还有其它安装方式,如pip、源码、salt-bootstrap
19.7.4. 安装EPEL¶
由于目前RHEL官网yum源还没有Saltstack的安装包支持,因此先
安装EPEL作为部署Saltstack的默认yum源。
·RHEL(CentOS)5版本:rpm-Uvh下载地址:
http://mirror.pnl.gov/epel/5/i386/epel-release-5-4.noarch.rpm
·RHEL(CentOS)6版本:rpm-Uvh下载地址:
http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm
mkdir /home/saltstack
wget http://mirrors.ustc.edu.cn/fedora/epel//epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm
或者
rpm -ivh http://mirrors.ustc.edu.cn/fedora/epel//epel-release-latest-7.noarch.rpm
19.7.5. 修改主机名和域名解析¶
#修改主机名
vim /etc/hostname
master
vim /etc/hostname
minion-one
#修改主机名和IP解析
vim /etc/hosts两台主机hosts文件后面分别加上:
192.168.200.128 master
192.168.200.129 minion-one
#使用命令添加
cat > /etc/hosts <<EOF
192.168.200.128 master
192.168.200.129 minion-one
EOF
19.7.6. 服务器端安装¶
salt-master安装:
yum install salt-master
chkconfig salt-master on
master端的配置文件是在 /etc/salt/master #配置文件的:后面一定要加上空格!!!!!!!
对于此配置文件的详细配置可以查看 http://docs.saltstack.org/en/latest/ref/configuration/master.html
[root@ip-172-31-21-197 salt]# cat /etc/salt/master| grep -v "^$" | grep -v "#"
[root@hujianli-linux hujianli]# sed -e '/^$/d;/^#/d' /etc/salt/master
interface: 0.0.0.0 #绑定Master通信IP;
auto_accept: True #自动认证,避免手动运行salt-key来确认证书信任;不需要手动执行 salt-key -A -y
file_roots: #指定Saltstack文件根目录位置
base:
- /etc/salt/base/init
test:
- /etc/salt/test
prod:
- /etc/salt/prod
dev:
- /etc/salt/dev
log_file: /var/log/salt/master
key_logfile: /var/log/salt/key
salt-master配置
更改配置
注意格式! 冒号后一定要空格!别问我怎么知道的
vim /etc/salt/master
interface: 127.0.0.1
//冒号后一定要空格!!
//master节点的外部ip
user: root
//运行Salt进程用户
conf_file: /etc/salt/master
//主配置文件路径
pki_dir: /etc/salt/pki/master
//存储pki身份验证密钥的目录 默认即可
cachedir: /data/cache/salt/master
//缓存路径指定空间较大目录下 默认即可
keep_jobs: 4
//设置保留旧作业信息的小时数。请注意,设置此选项可0禁用缓存清理程序,如果mimion节点超过1000建议此配置设置小
gather_job_timeout: 10
//客户端请求有关正在运行的作业的信息时等待的秒数
job_cache: True
//缓存文件到本地
worker_threads: 25
//开启的线程数,根据主机资源而定
auto_accept: Flase
//此设置是否自动接受来自minion的所有传入公钥
hash_type: sha256
//hash_type是在主服务器上发现文件的哈希时使用的哈希。默认值为sha256,但也支持md5,sha1,sha224,sha384和sha512
log_file: /data/log/salt/master
key_logfile: /data/log/salt/key
syndic_master: 127.0.0.1
//super master 服务器ip地址
//可以调度master节点的master
syndic_master_port: 4506
//master 端口号
syndic_log_file: /data/log/salt/syndic
syndic_wait: 15
配置开机启动:
/etc/init.d/salt-maser master
chkconfig salt-master on
19.7.7. centos 6/7 启动/重启/停止命令¶
#启动/重启/停止salt-master命令
systemctl start salt-master
systemctl restart salt-master
systemctl stop salt-master
* centos 6
service salt-master start
注:需要iptables开启master端4505、4506端口
19.7.8. Saltstack防火墙配置¶
在主控端添加TCP 4505、TCP 4506的规则,而在被控端无须配置
防火墙,原理是被控端直接与主控端的zeromq建立长链接,接收广播到
的任务信息并执行,具体操作是添加两条iptables规则:
iptables -I INPUT -m state --state new -m tcp -p tcp --dport 4505 -j ACCEPT
iptables -I INPUT -m state --state new -m tcp -p tcp --dport 4506 -j ACCEPT
19.7.9. 客户端minion程序安装¶
salt-minion安装:
yum install salt-minion
chkconfig salt-minion on
#重启:
salt-minion -d
#停止/启动/重启salt-minion
systemctl stop/start/restart salt-minion
#minion端的配置文件是在 /etc/salt/minion
对于此配置文件的详细配置可以查看 http://docs.saltstack.org/en/latest/ref/configuration/minion.html
#指定master主机IP地址
master: 192.168.1.20
#修改被控端主机识别id,建议使用操作系统主机名来配置
id: SN2013-08-021
#查看客户端agent监听情况,看日志输出
tail -f /var/log/salt/minion
19.7.10. 查看自动认证状况¶
·salt-key–L,显示已经或未认证的被控端id,Accepted Keys为已认
证清单,Unaccepted Keys为未认证清单;
·salt-key–D,删除所有认证主机id证书;
·salt-key-d id,删除单个id证书;
·salt-key–A,接受所有id证书请求;
·salt-key-a id,接受单个id证书请求。
salt-key -L #查看当前证书签证情况
Accepted Keys:
Unaccepted Keys:
10.252.137.141
Rejected Keys:
salt-key -A -y ########同意签证所有没有接受的签证情况
The following keys are going to be accepted:
Unaccepted Keys:
10.252.137.141
Key for minion 10.252.137.141 accepted.
salt-key -L #查看证书签证的接收情况
Accepted Keys:
10.252.137.141
Unaccepted Keys:
Rejected Keys:
[root@hujianli-linux salt]# salt-key -f minion-one #master上查看秘钥指纹
Accepted Keys:
minion-one: a3:be:e8:7c:ac:64:44:2b:ab:70:f1:b0:77:9b:de:ce
[root@web01 ~]# salt-call --local key.finger #主控端查看秘钥指纹
local:
a3:be:e8:7c:ac:64:44:2b:ab:70:f1:b0:77:9b:de:ce
19.7.11. 使用基础¶
salt后主机名称支持正则,支持列表
* : #表示任意字符串,也可以是空字符串
? : #表示一个字符,不可以为空
[...]: #字符集合,[a~z]表示任何一个小写字母,[0~9]代表数字
一般字符: #匹配自身
.: #匹配任意换行字符'\n'外的字符
\: #转义字符
\d: #数字[0~9]
\D: #非数字[^\d]
\s: #空白字符[<空格>\t\n\r\f\v]
\S: #非空白字符[^\s]
\w: #单词字符:[A-Za-Z0-9_]
\W: #非单词字符:[^\w]
+: #匹配字符1次或者无限次
{m}: #匹配前一个字母m次
-E,--pcre, #通过正则表达式进行匹配。示例:控测SN2013字符开头的主机id名是否连通,命令:salt -E'^SN2013.*'test.ping
-L,--list, #以主机id名列表的形式进行过滤,格式与Python的列表相似,即不同主机id名称使用逗号分隔。示例:获取主机id名为
SN2013-08-021、SN2013-08-022;
#获取完整操作系统发行版名称,命令:salt -L 'SN2013-08-021,SN2013-08-022' grains.item osfullname
[root@hujianli-linux salt]# salt -L 'minion-one' test.ping
minion-one:
True
[root@hujianli-linux salt]# salt -L 'minion-one,minion-two,minion-three' test.ping
minion-one:
True
-N,--nodegroup, #根据主控端master配置文件中的分组名称进行过滤。使用配置文件里面的分组方式进行匹配
-C,--compound, #根据条件运算符not、and、or去匹配不同规则的主机信息
-S,--ipcidr, #根据被控主机的IP地址或IP子网进行匹配,示例
如下:
salt -S 192.168.0.0/16 test.ping
[root@hujianli-linux salt]# salt -E '^minion-.*' test.ping
minion-one:
True
[root@hujianli-linux salt]# salt -E 'minion-(one)?' test.ping
minion-one:
True
[root@hujianli-linux salt]# salt -E '.*-one$' test.ping
minion-one:
True
19.7.12. salt-master上常用的命令:¶
#所有主机ping包测试
[root@ip-172-31-21-197 salt]# salt '*' test.ping
ip-172-31-17-191.us-east-2.compute.internal:
True
#查看test模块包含的其他函数
[root@hujianli-linux salt]# salt 'minion-one' sys.list_functions test
minion-one:
- test.arg
- test.arg_repr
- test.arg_type
- test.assertion
- test.attr_call
- test.collatz
- test.conf_test
- test.cross_test
- test.echo
- test.exception
- test.fib
- test.get_opts
- test.kwarg
- test.module_report
- test.not_loaded
- test.opts_pkg
- test.outputter
- test.ping
- test.provider
- test.providers
- test.rand_sleep
- test.rand_str
- test.retcode
- test.sleep
- test.stack
- test.try_
- test.tty
- test.version
- test.versions_information
- test.versions_report
#获取所有的状态模块,
salt "*" sys.list_modules
salt "*" sys.list_modules| grep acl
#列举状态模块中的所有函数
salt "*" sys.list_state_functions pkg
ip-172-31-17-191.us-east-2.compute.internal:
- pkg.installed
- pkg.latest
- pkg.mod_aggregate
- pkg.mod_init
- pkg.purged
- pkg.removed
- pkg.uptodate
#查看所有主机的内存状态
[root@ip-172-31-21-197 salt]# salt "*" cmd.run "free -m"
ip-172-31-17-191.us-east-2.compute.internal:
total used free shared buff/cache available
Mem: 990 131 208 12 650 658
Swap: 0 0 0
19.7.13. 所有主机查看系统¶
salt '*' grains.get os
或者
[root@hujianli-linux salt]# salt '*' grains.item osfullname
minion-one:
----------
osfullname:
CentOS Linux
grains查看minion本身固有属性的静态数据
[root@hujianli-linux salt]# salt 'minion-one' grains.item os
minion-one:
----------
os:
CentOS
开启命令的详细描述 -v 或者 -verbose
[root@hujianli-linux salt]# salt --verbose "*" cmd.run_all "echo my salt"
Executing job with jid 20181018213058967893
-------------------------------------------
minion-one:
----------
pid:
1929
retcode:
0
stderr:
stdout:
my salt
--summary 显示一条命令的概要
[root@hujianli-linux salt]# salt --summary '*' cmd.run_all "echo my salt"
minion-one:
----------
pid:
1936
retcode:
0
stderr:
stdout:
my salt
Summary -—————————————— # of Minions Targeted: 1 # of Minions Returned: 1 # of Minions Did Not Return: 0 -——————————————
--out=json 控制命令的输出,以json格式输出 --out=yaml #以yaml格式输出
[root@hujianli-linux salt]# salt --out=json "*" cmd.run_all "echo my salt"
{
"minion-one": {
"pid": 1942,
"retcode": 0,
"stderr": "",
"stdout": "my salt"
}
}
[root@hujianli-linux salt]# salt --out=yaml "*" cmd.run_all "echo my salt"
minion-one:
pid: 1948
retcode: 0
stderr: ''
stdout: my salt
19.7.14. 查看所有节点名称¶
salt '*' grains.get nodename
19.7.15. 查询所有主机salt的版本号是多少?¶
salt '*' grains.get saltversion
salt '*' grains.item saltversion
19.7.16. 远程执行模块¶
命令执行模块cmd¶
salt '*' cmd.run "ps aux | wc -l"
#查看详细信息的函数
salt '*' cmd.run_all "ps aux | wc -l"
使用pkg.install来安装程序包¶
salt '*' pkg.install "lrzsz"
salt '*' pkg.install "httpd"
查看已安装软件的版本信息¶
salt '*' pkg.version 'httpd'
salt '*' pkg.install "lsof"
删除已安装的软件包¶
[root@hujianli-linux salt]# salt 'minion-one' pkg.remove 'httpd'
查看服务状态¶
[root@ip-172-31-21-197 base]# salt '*' service.status httpd
ip-172-31-17-191.us-east-2.compute.internal:
True
#如果是True表示服务启动正常,如果是False表示服务启动失败
[root@ip-172-31-21-197 base]# salt '*' service.status mysql
ip-172-31-17-191.us-east-2.compute.internal:
False
停止远程服务¶
[root@ip-172-31-21-197 base]# salt '*' service.stop httpd
ip-172-31-17-191.us-east-2.compute.internal:
True
#启动远程服务
[root@ip-172-31-21-197 base]# salt '*' service.start httpd
ip-172-31-17-191.us-east-2.compute.internal:
True
使用命令查看远程服务启动状态¶
[root@hujianli-linux salt]# salt "*" cmd.run "ps aux| grep httpd| grep -v grep"
minion-one:
root 2190 0.1 0.5 224020 5024 ? Ss 06:02 0:00 /usr/sbin/httpd -DFOREGROUND
apache 2191 0.0 0.2 224020 2956 ? S 06:02 0:00 /usr/sbin/httpd -DFOREGROUND
apache 2192 0.0 0.2 224020 2956 ? S 06:02 0:00 /usr/sbin/httpd -DFOREGROUND
apache 2195 0.0 0.2 224020 2956 ? S 06:02 0:00 /usr/sbin/httpd -DFOREGROUND
apache 2196 0.0 0.2 224020 2956 ? S 06:02 0:00 /usr/sbin/httpd -DFOREGROUND
apache 2197 0.0 0.2 224020 2956 ? S 06:02 0:00 /usr/sbin/httpd -DFOREGROUND
19.7.17. 用户管理模块¶
添加用户¶
[root@ip-172-31-21-197 salt]# salt '*' user.add 'xiaojian'
[root@hujianli-linux salt]# salt 'minion-one' user.add 'hujianli2'
#删除用户
[root@ip-172-31-21-197 salt]# salt '*' user.delete 'xiaojian'
[root@hujianli-linux salt]# salt 'minion-one' user.delete 'hujianli2'
查看用户信息¶
[root@ip-172-31-21-197 salt]# salt '*' user.info root
19.7.18. cron模块¶
功能:实现被控主机的crontab操作。
#查看所有主机的cron [root@ip-172-31-21-197 salt]# salt '*' cron.raw_cron root ip-172-31-17-191.us-east-2.compute.internal: 20 15 * * * `cd /home/rzrk//server/pyScripts; /usr/bin/python calcManageFee.py` #为所有主机添加计划任务 [root@ip-172-31-21-197 salt]# salt '*' cron.set_job root '*' '*' '*' '*' 1 /usr/local/weekly ip-172-31-17-191.us-east-2.compute.internal: new #删除所有主机上的计划任务 [root@ip-172-31-21-197 salt]# salt '*' cron.rm_job root /usr/local/weekly ip-172-31-17-191.us-east-2.compute.internal: removed
19.7.19. cp模块¶
#功能:实现远程文件、目录的复制,以及下载URL文件等操作。
#将指定被控主机的/etc/hosts文件复制到被控主机本地的salt cache目录
(/var/cache/salt/minion/localfiles/);
salt '*' cp.cache_local_file /etc/hosts
#将主服务器file_roots指定位置下的目录复制到被控主机
salt '*' cp.get_dir salt://path/to/dir/ /minion/dest
#将主服务器file_roots指定位置下的文件复制到被控主机
salt '*' cp.get_file salt://path/to/file /minion/dest
#下载URL内容到被控主机指定位置
salt '*' cp.get_url http://www.slashdot.org /tmp/index.html
19.7.20. dnsutil模块¶
#功能:实现被控主机通用DNS相关操作。
#添加指定被控主机hosts的主机配置项
salt '*' dnsutil.hosts_append /etc/hosts 127.0.0.1 ad1.yuk.com,
ad2.yuk.com
#删除指定被控主机hosts的主机配置项
salt '*' dnsutil.hosts_remove /etc/hosts ad1.yuk.com
19.7.21. file模块¶
#查看文件状态
[root@ip-172-31-21-197 salt]# salt '*' file.stats /etc/yum.conf
#文件属组修改
[root@ip-172-31-21-197 salt]# salt '*' file.chown /etc/passwd root root
ip-172-31-17-191.us-east-2.compute.internal:
None
#功能:被控主机文件常见操作,包括文件读写、权限、查找、校验等。
#校验所有被控主机/etc/fstab文件的md5是否为6254e84e2f6ffa54e0c8d9cb230f5505,一致
则返回True
salt '*' file.check_hash /etc/fstab md5=6254e84e2f6ffa54e0c8d9cb230f5505
#校验所有被控主机文件的加密信息、支持md5、sha1、sha224、sha256、sha384、sha512加密算
法
salt '*' file.get_sum /etc/passwd md5
#修改所有被控主机/etc/passwd文件的属组、用户权限,等价于chown root:root
/etc/passwd
salt '*' file.chown /etc/passwd root root
#复制所有被控主机本地/path/to/src文件到本地的/path/to/dst文件
salt '*' file.copy /path/to/src /path/to/dst
#检查所有被控主机/etc目录是否存在,存在则返回True,检查文件是否存在使用
file.file_exists方法
salt '*' file.directory_exists /etc
#获取所有被控主机/etc/passwd的stats信息
salt '*' file.stats /etc/passwd
#获取所有被控主机/etc/passwd的权限mode,如755、644
salt '*' file.get_mode /etc/passwd
#修改所有被控主机/etc/passwd的权限mode为0644
salt '*' file.set_mode /etc/passwd 0644
#在所有被控主机创建/opt/test目录
salt '*' file.mkdir /opt/test
#将所有被控主机/etc/httpd/httpd.conf文件的LogLevel参数的warn值修改成info
salt '*' file.sed /etc/httpd/httpd.conf 'LogLevel warn' 'LogLevel info'
#给所有被控主机的/tmp/test/test.conf文件追加内容"maxclient 100"
salt '*' file.append /tmp/test/test.conf "maxclient 100"
#删除所有被控主机的/tmp/foo文件
salt '*' file.remove /tmp/foo
19.7.22. iptables模块¶
#功能:被控主机iptables支持。
#在所有被控端主机追加(append)、插入(insert)iptables规则,其中INPUT为输入链
salt '*' iptables.append filter INPUT rule='-m state --state RELATED,
ESTABLISHED -j ACCEPT'
salt '*' iptables.insert filter INPUT position=3 rule='-m state --state
RELATED,ESTABLISHED -j ACCEPT'
#在所有被控端主机删除指定链编号为3(position=3)或指定存在的规则
salt '*' iptables.delete filter INPUT position=3
salt '*' iptables.delete filter INPUT rule='-m state --state RELATED,
ESTABLISHED -j ACCEPT'
#保存所有被控端主机规则到本地硬盘(/etc/sysconfig/iptables)
salt '*' iptables.save /etc/sysconfig/iptables
19.7.23. netwrok模块¶
#返回被控主机网络信息。
#在指定被控主机'SN2013-08-022'获取dig、ping、traceroute目录域名信息
salt 'SN2013-08-022' network.dig www.qq.com
salt 'SN2013-08-022' network.ping www.qq.com
salt 'SN2013-08-022' network.traceroute www.qq.com
#获取指定被控主机'SN2013-08-022'的MAC地址
salt 'SN2013-08-022' network.hwaddr eth0
#检测指定被控主机'SN2013-08-022'是否属于10.0.0.0/16子网范围,属于则返回True
salt 'SN2013-08-022' network.in_subnet 10.0.0.0/16
#获取指定被控主机'SN2013-08-022'的网卡配置信息
salt 'SN2013-08-022' network.interfaces
#获取指定被控主机'SN2013-08-022'的IP地址配置信息
salt 'SN2013-08-022' network.ip_addrs
#获取指定被控主机'SN2013-08-022'的子网信息
salt 'SN2013-08-022' network.subnets
19.7.24. pkg包管理模块¶
#功能:被控主机程序包管理,如yum、apt-get等
#为所有被控主机安装PHP环境,根据不同系统发行版调用不同安装工具进行部署,如redhat平台的yum,等价于yum -y install php
salt '*' pkg.install php
#卸载所有被控主机的PHP环境
salt '*' pkg.remove php
#升级所有被控主机的软件包
salt '*' pkg.upgrade
19.7.25. Service服务模块¶
#功能:被控主机程序包服务管理。
#开启(enable)、禁用(disable)nginx开机自启动服务
salt '*' service.enable nginx
salt '*' service.disable nginx
#针对nginx服务的reload、restart、start、stop、status操作
salt '*' service.reload nginx
salt '*' service.restart nginx
salt '*' service.start nginx
salt '*' service.stop nginx
salt '*' service.status nginx
19.7.26. 被控端主机定制grains数据¶
修改 etc/salt/minion.d/hostinfo.conf
cat hostinfo.conf
grains:
roles:
- webserver
- memcache
deployment: datacenter4
cabinet: 13
然后重启salt-minion
在到服务器上执行:salt '*' grains.items 查看键值对变化
19.7.27. 通过配置文件安装程序¶
[root@ip-172-31-21-197 init]# cat /etc/salt/master| grep -v "^$" | grep -v "#"
interface: 0.0.0.0
auto_accept: True
file_roots:
base:
- /etc/salt/base/init
test:
- /etc/salt/test
prod:
- /etc/salt/prod
dev:
- /etc/salt/dev
log_file: /var/log/salt/master
key_logfile: /var/log/salt/key
#刷新state配置命令
salt "*" state.highstate
配置YAML格式文件,YAML固定缩进为2个空格,2个空格一个缩进
冒号后面的每一行用一个空格隔开
一个短斜杠 - 加一个空格表示一个列表项 ,多个项使用同一的缩进作为同一列表的一部分
19.7.28. 批量安装httpd服务¶
[root@ip-172-31-21-197 base]# cat apache.sls
install_httpd:
pkg.installed:
- name: httpd
salt "*" state.sls apache #进行对远程机器的安装
19.7.29. 批量安装常用命令¶
[root@ip-172-31-21-197 init]# cat yum.sls
yum-list-init:
pkg.installed:
- names:
- gcc
- gcc-c++
- sysstat
- hdparm
- man
- vim-enhanced
- wget
- telnet
- lsof
- sysstat
- lrzsz
- tree
- hdparm
salt "*" state.sls yum
19.7.30. 批量设置所有主机的DNS¶
[root@ip-172-31-21-197 init]# cat dns.sls
/etc/resolv.conf:
file.managed:
- source: salt://config/resolv.conf
- user: root
- group: root
- mode: 644
- backup: '*'
salt "*" state.sls dns
19.7.31. 批量设置所有主机的sysctl.conf¶
[root@ip-172-31-21-197 init]# tree
.
├── apache.sls
├── config
│ ├── resolv.conf
│ └── sysctl.conf
├── dns.sls
├── sysctl.sls
└── yum.sls
[root@ip-172-31-21-197 init]# cat sysctl.sls
/etc/sysctl.conf:
file.managed:
- source: salt://config/sysctl.conf
- user: root
- group: root
- mode: 644
19.7.32. 编写自己的模块代码¶
参考文献
自动化配置管理工具 SaltStack-03