- salt简介
是一个配置管理工具,使用轻量级的通讯器ZMQ(ZeroMQ),使用Python写成的批量管理工具,有一个强大的远程执行命令引擎,也有一个强大的配置管理系统,叫Salt State System。
- 基本原理
SaltStack采用 C/S 模式,server端就是salt的master,client端就是minion,minion与master之间通过ZeroMQ消息队列通信。
minion上线后先与master端联系,把自己的pub key发过去,这时master端通过salt-key -L命令就会看到minion的key,接受该minion-key后,也就是master与minion已经互信
master可以发送任何指令让minion执行了,salt有很多可执行模块,比如说cmd模块,在安装minion的时候已经自带了,它们通常位于你的python库中,locate salt | grep /usr/
可以看到salt自带的所有东西。
这些模块是python写成的文件,里面会有好多函数,如cmd.run,当我们执行salt '*' cmd.run 'uptime'
的时候,master下发任务匹配到的minion上去,minion执行模块函数,并返回结果。master监听4505和4506端口,4505对应的是ZMQ的PUB system,用来发送消息,4506对应的是REP system是来接受消息的。
具体步骤如下
-
Salt stack的Master与Minion之间通过ZeroMq进行消息传递,使用了ZeroMq的发布-订阅模式,连接方式包括tcp,ipc
-
salt命令,将
cmd.run ls
命令从salt.client.LocalClient.cmd_cli
发布到master,获取一个Jobid,根据jobid获取命令执行结果。 -
master接收到命令后,将要执行的命令发送给客户端minion。
-
minion从消息总线上接收到要处理的命令,交给
minion._handle_aes
处理 -
minion._handle_aes
发起一个本地线程调用cmdmod执行ls命令。线程执行完ls后,调用minion._return_pub
方法,将执行结果通过消息总线返回给master -
master接收到客户端返回的结果,调用
master._handle_aes
方法,将结果写的文件中 -
salt.client.LocalClient.cmd_cli
通过轮询获取Job执行结果,将结果输出到终端。
- 安装 配置 启动 认证 测试
1)安装
部分系统(如 centos6 等)需要先安装扩展源,具体可参考https://docs.saltstack.com/en/latest/topics/installation/rhel.html
在server端安装 salt-master
yum install -y salt-master
在client端安装 salt-minion
yum install -y salt-minion
2)配置
一般在学习环境中,master用默认配置就好,修改minion配置文件 /etc/salt/minion
master: master_ip或master_FQDN ##注明master的ip或者域名 id: minion_id ##取一个独一无二的minion名字,以方便辨认
3)启动
service salt-master start
service salt-minion start
4)认证
minion在第一次启动时,会在 /etc/salt/minion/ 下自动生成 minion.pem(private key)和 minion.pub(public key),然后将minion.pub发给master。
Master在接收到minion的public key后,通过salt-key命令accept minion public key,然后master就能给minion发送指令了。
salt-key -L ##查看所有minion_key salt-key -a 'key-name' ##接受该key 或者salt-key -A ##接受所有key
5)测试
salt '*' test.ping ##查看在线minion salt '*' pkg.install ftp ##所有Minion安装ftp
- salt常用命令
1)salt 该命令执行salt的执行模块,通常在master端运行,也是我们最常用到的命令
salt [options] '<target>' <function> [arguments] 如: salt '*' test.ping
2)salt-run 该命令执行runner(salt带的或者自定义的,runner以后会讲),通常在master端执行,比如经常用到的manage
salt-run [options] [runner.func] salt-run manage.status ##查看所有minion状态 salt-run manage.down ##查看所有没在线minion salt-run manged.up ##查看所有在线minion
3)salt-key 密钥管理,通常在master端执行
salt-key [options] salt-key -L ##查看所有minion-key salt-key -a <key-name> ##接受某个minion-key salt-key -d <key-name> ##删除某个minion-key salt-key -A ##接受所有的minion-key salt-key -D ##删除所有的minion-key
4)salt-call 该命令通常在minion上执行,minion自己执行可执行模块,不是通过master下发job
salt-call [options] <function> [arguments] salt-call test.ping ##自己执行test.ping命令 salt-call cmd.run 'ifconfig' ##自己执行cmd.run函数
5)alt-cp 分发文件到minion上,不支持目录分发,通常在master运行
salt-cp [options] '<target>' SOURCE DEST salt-cp '*' testfile.html /tmp salt-cp 'test*' index.html /tmp/a.html
6)salt-master master运行命令
salt-master [options] salt-master ##前台运行master salt-master -d ##后台运行master salt-master -l debug ##前台debug输出
7)salt-minion minion运行命令
salt-minion [options] salt-minion ##前台运行 salt-minion -d ##后台运行 salt-minion -l debug ##前台debug输出
8)salt-ssh 0.17.1版本加入的salt-ssh
9)salt-syndic syndic是salt的代理
- 普通用户执行salt
普通用户执行salt两种方案:1,salt ACL 2.salt external_auth
1. ACL
1)设置master配置文件
client_acl: monitor: - test*: - test.* dev: - service.* sa: - .*
2)重启Master
service salt-master restart
3)目录和文件权限
chmod +r /etc/salt/master chmod +x /var/run/salt chmod +x /var/cache/salt
4)测试
# su - monitor # salt 'test*' test.ping # exit; su - sa # salt '*' test.ping # salt '*' cmd.run 'uptime' # exit;
2. external_auth
1)修改master配置文件
external_auth:
pam: monitor: – ‘test‘: – test. sa: – .* – 2) 3)与ACL相同
4)测试
# salt -a pam 'test*' test.ping ##会提示输入账号密码,所以external_auth与当前用户无关 username: monitor password: # su - monitor # salt -a pam '*' cmd.run 'uptime' username: sa password:
5)使用Token不必每次都输入账号密码,使用external_auth每次都是需要密码的,这样多麻烦,这里引入了Token,它会保存一串字符到在当前用户家目录下.salt_token中,在有效时间内使用external_auth是不需要输入密码的,默认时间12hour,可以通过master配置文件修改
# salt -T -a pam '*' test.ping username: sa password: #salt -a pam '*' test.ping #不会提示输入密码了
- target
指定你的命令或者模块应用哪写Minion上
1.globbing 默认
salt 'test*' test.ping
2.RE 正则
salt -E 'web1-(pro|devel)' test.ping
3.List 列表
salt -L '127.0.0.1, test*' test.ping
4.grains
salt -G 'os:CentOS' test.ping #查看所有grains键/值 salt 'test*' grains.items #查看所有grains项 salt 'test*' grains.ls 查看某个grains的值 salt 'test*' grains.item num_cpus
在top file中匹配grains
'node_type:web': - match: grain #没有s - webserver
top file中使用jinja模板
{% set self = grains['node_type'] %} - match: grain - {{ self }}
5.nodegroups 其实就是对Minion分组
首先在master的配置文件中对其分组,推荐写到/etc/salt/master.d/中一个独立的配置文件中,比如nodegroup.conf
vim /etc/salt/master.d/nodegroup.conf #写到master中也是这个格式,master.d中*.conf是默认动态加载的 nodegroups: test1: 'L@test1,test2 or test3*' test2: ‘G@os:CenOS or test2' salt -N test1 test.ping #-N指定groupname 在top file中使用nodegroups 'test1': - match: nodegroup ##注意没 s - webserver
6.混合指定,就是将以上的混合起来用
G Grains glob G@os:Ubuntu E PCRE Minion ID E@webd+.(dev|qa|prod).loc P Grains PCRE P@os:(RedHat|Fedora|CentOS) L List of minions L@minion1.example.com,minion3.domain.com or bl*.domain.com I Pillar glob I@pdata:foobar S Subnet/IP address S@192.168.1.0/24 or S@192.168.1.100 R Range cluster R@%foo.bar salt -C 'G@os:CentOS and L@127.0.0.1,192.168.1.12' test.ping
top file 指定:
'webserver* and G:CentOS or L@127.0.0.1,test1': - match: compound - webserver
7.一次在n个minion上执行
-b n --batch-size n 示例: salt '*' -b 5 test.ping 5个5个的ping
- 远程批量执行
格式:
salt '<target>' <function> [argument]
注: function是salt带的或自己写的可执行模块里面的function,自带的所有列表http://docs.saltstack.com/ref/modules/all/index.html?highlight=full%20list%20builtin
实例:
salt '*' at.at 10.10am 'uptime'
salt '*' test.ping