saltstack实战1---安装和配置文件初步讲解
前期准备
准备4台机器,设置IP地址和主机名
10.0.1.171 master
10.0.1.172 minion01
10.0.1.173 minion02
10.0.1.174 mysql
10.0.1.175 master-bak(用于模拟更换master的练习)
系统环境:
5台机器系统版本都是centos6.6 64位版本
[root@master ~]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@master ~]# uname -r 2.6.32-504.el6.x86_64 [root@master ~]# uname -m x86_64 [root@master ~]#
在初步学习中,认识到saltstack可以批量管理很多机器。master是管理服务器,minion上是被管理的机器。mysql服务器可以存放一些minion返回的消息
saltstack是python语言写的,是个开源的软件,底层通信方式采取ZeroMQ。
master启动后默认有两个端口,4505和4506,其中4505是发送命令消息到minion上,4506接收来自minion的返回消息。
saltstack中master和minion的安装部分
saltstack有3种安装方式:
由于saltstack包可以在epel源中下载安装,因此需要先安装epel源,这样yum仓库中才能安装
rpm -Uvh http://mirrors.yun-idc.com/epel/6Server/x86_64/epel-release-6-8.noarch.rpm
2、master机器上安装salt-master包,需要在10.0.1.171机器上执行如下命令
yum -y install salt-master
3、在两台minion机器上安装salt-minion包,在10.0.1.172和10.0.1.173上执行如下命令
yum -y install salt-minion
[root@master ~]# salt salt salt-key salt-run salt-cp salt-master salt-unity [root@master ~]# salt
[root@master ~]# ll /etc/salt/master -rw-r----- 1 root root 29560 Dec 3 06:10 /etc/salt/master [root@master ~]#
[root@minion01 ~]# ll /etc/salt/minion -rw-r----- 1 root root 26366 Dec 15 22:42 /etc/salt/minion [root@minion01 ~]#
[root@master ~]# /etc/init.d/salt-master restart Stopping salt-master daemon: [ OK ] Starting salt-master daemon: [ OK ] [root@master ~]# netstat -antp|grep 450 tcp 0 0 0.0.0.0:4505 0.0.0.0:* LISTEN 4533/python2.6 tcp 0 0 0.0.0.0:4506 0.0.0.0:* LISTEN 4549/python2.6
关于4505和4506端口这两个默认监听端口都是可以改的
4505端口在22行,用于发送命令给minion端 21 # The tcp port used by the publisher: 22 #publish_port: 4505 4506端口,接收来自minion端的执行结果 55 # The port used by the communication interface. The ret (return) port is the 56 # interface used for the file server, authentication, job returns, etc. 57 #ret_port: 4506
如果要修改4506端口的话,minion端由于是主动连接master端的4506,因此minion的配置文件里也有此端口,也需要修改
vim /etc/salt/minion
在第52行
51 # Set the port used by the master reply and authentication server. 52 #master_port: 4506 53 54 # The user to run salt.
master和minion配置文件讲解
[root@minion01 ~]# ll /etc/salt/minion -rw-r----- 1 root root 26365 Mar 23 2016 /etc/salt/minion [root@minion01 ~]#
salt-minion端的版本如下(注意saltstack的版本采用日期的方式命名)
[root@minion01 ~]# salt-minion --version salt-minion 2015.5.10 (Lithium) [root@minion01 ~]#
先在2台minion上配置master的主机域名解析,修改minion的hosts文件。 (master是根据minionid操作的,对于hosts文件中添加minion的主机名不是必须的)
修改minion01主机,添加master的解析 [root@minion01 ~]# tail -1 /etc/hosts 10.0.1.171 master [root@minion01 ~]# 同时保证添加之后可以通过主机名ping通master [root@minion01 ~]# ping master PING master (10.0.1.171) 56(84) bytes of data. 64 bytes from master (10.0.1.171): icmp_seq=1 ttl=64 time=0.513 ms 64 bytes from master (10.0.1.171): icmp_seq=2 ttl=64 time=1.18 ms minion02上同样操作
1、master和minion是通过密钥认证方式管理的。
minion端启动服务之前要指定它的master端ip或者hostname
minion的配置文件有两个地方需要注意
vim /etc/salt/minion
找到第16行 15 # resolved, then the minion will fail to start. 16 #master: salt 17 18 # If multiple masters are specified in the 'master' setting, the default b ehavior
取消注释,同时填写salt-master的地址,这里写成主机名 15 # resolved, then the minion will fail to start. 16 master: master 17 18 # If multiple masters are specified in the 'master' setting, the default b ehavior
检查结果,找以master开头的,已经修改正确 [root@minion01 ~]# vim /etc/salt/minion [root@minion01 ~]# grep ^master /etc/salt/minion master: master [root@minion01 ~]#
第二个地方是id,这里无需修改,默认是以你的主机名作为自己的id的,这里的id类似一个身份证标识,必须唯一。
它在/etc/salt/minion第78行
78 #id:
修改完毕后需要重启minion的服务,才会生效 ,两台minion都要重启此服务
[root@minion01 ~]# /etc/init.d/salt-minion restart Stopping salt-minion daemon: [ OK ] Starting salt-minion daemon: [ OK ] [root@minion01 ~]#
salt-key的学习
[root@master ~]# salt-key -L Accepted Keys: Denied Keys: Unaccepted Keys: minion01 minion02 Rejected Keys: [root@master ~]#
这里我们选择接受认证
[root@master ~]# salt-key -A -y The following keys are going to be accepted: Unaccepted Keys: minion01 minion02 Key for minion minion01 accepted. Key for minion minion02 accepted. [root@master ~]# salt-key -L Accepted Keys: minion01 minion02 Denied Keys: Unaccepted Keys: Rejected Keys: [root@master ~]#
上面-A参数表示接受所有的minion,-y参数表示确认。如果不输入-y参数会出现二次确认,输入y也可以接受
关于salt-key的常见的参数和用法
初步认识stalstack模块之test.ping
[root@master ~]# salt '*' test.ping
minion02:
True
minion01:
True
[root@master ~]#
初步认识密钥文件和minion_id文件
minion启动后,它会生成自己的minion_id和自己的公钥以及私钥,在通过master的认证后,它会取得master的公钥
[root@minion01 ~]# ll /etc/salt/ total 40 -rw-r----- 1 root root 26366 Dec 15 22:42 minion drwxr-xr-x 2 root root 4096 Dec 2 22:37 minion.d -rw-r--r-- 1 root root 8 Dec 3 05:52 minion_id drwxr-xr-x 3 root root 4096 Dec 3 05:52 pki minion启动的时候,会在下面目录生成一个minion_id 里面信息包含了这个minion的主机名,因为我们没在配置文件中定义minionid,默认就是以主机名作为minionid了 [root@minion01 ~]# cat /etc/salt/minion_id minion01[root@minion01 ~]# [root@minion01 ~]# ll /etc/salt/pki/ total 4 drwx------ 2 root root 4096 Dec 2 22:37 minion minion.pem是minion的私钥,minion.pub是minion的公钥,这俩是在minion服务启动后生成的 在minion通过master的认证之后,它会取得master的公钥,如下minion_master.pub就是master的公钥 [root@minion01 ~]# ll /etc/salt/pki/minion/ total 12 -rw-r--r-- 1 root root 451 Dec 2 22:37 minion_master.pub -r-------- 1 root root 1679 Dec 3 05:52 minion.pem -rw-r--r-- 1 root root 451 Dec 3 05:52 minion.pub [root@minion01 ~]#
下面在接受minion01的认证之前,它会先处于Unaccepted Keys状态,此时可以在minions_pre目录里找到它
而我们接受的minion02,它就在minions这个目录下了。 对于拒绝的认证,它会被放在minions_rejected里面
[root@master ~]# salt-key -L Accepted Keys: minion02 Denied Keys: Unaccepted Keys: minion01 Rejected Keys: [root@master ~]# tree /etc/salt/pki/master /etc/salt/pki/master ├── master.pem ├── master.pub ├── minions │ └── minion02 ├── minions_autosign ├── minions_denied ├── minions_pre │ └── minion01 └── minions_rejected 5 directories, 4 files [root@master ~]#
其实这个文件里的内容,就是minion端服务启动后生成的公钥
[root@master master]# cat /etc/salt/pki/master/minions_pre/minion01 -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyRsmw55p5nDjAT3avJJi knHMVpcb0H+wnXnrxAfaJ+PHBXTtCh20+Jg3hZoK9Zy7AlladsgOb4DnKhuQHbIK dNseae8dH7KpQP2Ta9urwWQ3t7MSAiS0fUU/aKAAF5bzgMm5KmViCLYSZdfZeftE lv3Qiw0gOZohla1rMBtiIKaIMu+Su+OtC3dHvhKnOHmRSlO4dG2+qyKphMsErWVH wMHKdLA8rtgfPGjgBiqXrhgB9rWPEZO0UlgE1ynu6SFn+nd34pZ/8etL8aimPQTb LZeiS+k6etcXukEs+IUV55GWzwKDta7kRMnoOlj28deYhJGbY7TkH3KyynCkQYyv IQIDAQAB -----END PUBLIC KEY----- [root@master master]#
下面是minion01的公钥
[root@minion01 minion]# cat /etc/salt/pki/minion/minion.pub -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyRsmw55p5nDjAT3avJJi knHMVpcb0H+wnXnrxAfaJ+PHBXTtCh20+Jg3hZoK9Zy7AlladsgOb4DnKhuQHbIK dNseae8dH7KpQP2Ta9urwWQ3t7MSAiS0fUU/aKAAF5bzgMm5KmViCLYSZdfZeftE lv3Qiw0gOZohla1rMBtiIKaIMu+Su+OtC3dHvhKnOHmRSlO4dG2+qyKphMsErWVH wMHKdLA8rtgfPGjgBiqXrhgB9rWPEZO0UlgE1ynu6SFn+nd34pZ/8etL8aimPQTb LZeiS+k6etcXukEs+IUV55GWzwKDta7kRMnoOlj28deYhJGbY7TkH3KyynCkQYyv IQIDAQAB -----END PUBLIC KEY----- [root@minion01 minion]#
minion端修改主机名的操作
[root@minion01 ~]# ll /etc/salt/minion_id -rw-r--r-- 1 root root 8 Dec 15 23:45 /etc/salt/minion_id [root@minion01 ~]# cat /etc/salt/minion_id minion01[root@minion01 ~]# [root@minion01 ~]#
因此如果默认采用主机名的minion,修改主机名过程如下
1、停止minion服务[root@minion01 ~]# /etc/init.d/salt-minion stop Stopping salt-minion daemon: [ OK ] [root@minion01 ~]# > /etc/salt/minion_id [root@minion01 ~]# hostname minion001 [root@minion01 ~]# sed -i 's#minion01#minion001#g' /etc/sysconfig/network [root@minion01 ~]# grep minion001 /etc/sysconfig/network HOSTNAME=minion001 [root@minion01 ~]#
退出当前终端,重新连接
[root@minion01 ~]# exit logout Connection established. To escape to local shell, press 'Ctrl+Alt+]'. Last login: Sat Dec 24 21:21:35 2016 from 10.0.1.53 [root@minion001 ~]#
启动minion服务
[root@minion001 ~]# /etc/init.d/salt-minion start Starting salt-minion daemon: [ OK ] [root@minion001 ~]# ps -ef | grep minion root 3291 1 1 22:12 ? 00:00:00 /usr/bin/python2.6 /usr/bin/salt-minion -d root 3315 3247 0 22:12 pts/1 00:00:00 grep --colour=auto minion [root@minion001 ~]#
master上操作
在master上操作如下,可以看到minion01已经无响应了 [root@master ~]# salt '*' test.ping minion02: True minion01: Minion did not return. [Not connected] 查看认证的key,看到有个Unaccepted Keys [root@master ~]# salt-key -L Accepted Keys: minion01 minion02 Denied Keys: Unaccepted Keys: minion001 Rejected Keys: 删除之前的无效的key [root@master ~]# salt-key -d 'minion01' -y Deleting the following keys: Accepted Keys: minion01 Key for minion minion01 deleted. 重新添加认证 [root@master ~]# salt-key -A -y The following keys are going to be accepted: Unaccepted Keys: minion001 Key for minion minion001 accepted. [root@master ~]# salt-key -L Accepted Keys: minion001 minion02 Denied Keys: Unaccepted Keys: Rejected Keys:
再次执行test.ping 返回成功 [root@master ~]# salt '*' test.ping minion02: True minion001: True [root@master ~]#
[root@minion001 ~]# ll /etc/salt/pki/minion/ total 12 -rw-r--r-- 1 root root 451 Dec 2 22:37 minion_master.pub -r-------- 1 root root 1679 Dec 3 05:52 minion.pem -rw-r--r-- 1 root root 451 Dec 3 05:52 minion.pub [root@minion001 ~]#
以上演示了minion修改主机名的过程,演示完毕我们把minion01主机名在改回去,恢复之前的主机名。
有时候上面执行完毕后,master上执行test.ping命令可能不会立即成功,要等一会
[root@master ~]# salt '*' test.ping
minion02:
True
minion01:
Minion did not return. [No response]
等一会就执行成功了。
[root@master ~]# salt '*' test.ping
minion02:
True
minion01:
True
[root@master ~]#
更换master机器
[root@matser ~]# tail -3 /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=master
[root@matser ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:F0:FB:E3
inet addr:10.0.1.175 Bcast:10.0.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fef0:fbe3/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:24267 errors:0 dropped:0 overruns:0 frame:0
TX packets:564 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1649713 (1.5 MiB) TX bytes:55814 (54.5 KiB)
[root@matser ~]#
确认新的master机器上安装了salt-master服务
[root@matser ~]# rpm -Uvh http://mirrors.yun-idc.com/epel/6Server/x86_64/epel-release-6-8.noarch.rpm Retrieving http://mirrors.yun-idc.com/epel/6Server/x86_64/epel-release-6-8.noarch.rpm Preparing... ########################################### [100%] package epel-release-6-8.noarch is already installed [root@matser ~]# yum -y install salt-master Loaded plugins: fastestmirror, refresh-packagekit, security Setting up Install Process Determining fastest mirrors * base: mirrors.cn99.com * epel: mirrors.tuna.tsinghua.edu.cn * extras: mirrors.cn99.com * updates: mirrors.cn99.com Package salt-master-2015.5.10-2.el6.noarch already installed and latest version Nothing to do [root@matser ~]#
[root@master ~]# cd /etc/salt/ [root@master salt]# ls master pki [root@master salt]# tar cfz pki.tgz pki/ [root@master salt]# ls master pki pki.tgz [root@master salt]# rsync -e 'ssh -p 22' pki.tgz root@10.0.1.175:/etc/salt/ root@10.0.1.175's password: [root@master salt]#
新的master机器解压文件,启动服务
[root@matser ~]# cd /etc/salt/ [root@matser salt]# ls master pki.tgz [root@matser salt]# tar xfz pki.tgz [root@matser salt]# ls master pki pki.tgz [root@matser salt]# /etc/init.d/salt-master start Starting salt-master daemon: [ OK ] [root@matser salt]#
在原先现网mater上更改minion01的hosts文件,把master的解析改为最新的mater的机器IP(这里使用了cmd.run模块,这是个万能模块,后面使用引号把需要执行的命令引起来)
[root@master salt]# salt 'minion01' cmd.run 'tail -1 /etc/hosts'
minion01:
10.0.1.171 master
[root@master salt]# salt 'minion01' cmd.run "sed -i 's#10.0.1.171#10.0.1.175#g' /etc/hosts"
minion01:
[root@master salt]# salt 'minion01' cmd.run 'tail -1 /etc/hosts'
minion01:
10.0.1.175 master
[root@master salt]#
在原先master机器上操作重启minion01服务,下图?乱码不用理会
[root@master salt]# salt 'minion01' cmd.run '/etc/init.d/salt-minion restart'
minion01:
Stopping salt-minion daemon: ?[60G[?[0;32m OK ?[0;39m]
Starting salt-minion daemon: ?[60G[?[0;32m OK ?[0;39m]
[root@master salt]#
新的master解压pki.tgz包后,启动服务,可以看到已经接受的key,如果minion那边hosts文件还没更改的话,执行任何命令都无响应
[root@matser salt]# salt-key -L Accepted Keys: minion01 minion02 Denied Keys: Unaccepted Keys: Rejected Keys: [root@matser salt]# [root@matser salt]# [root@matser salt]#
由于minion那边的hosts文件还没更新,因此执行模块方法无响应 [root@matser salt]# salt '*' test.ping minion02: Minion did not return. [No response] minion01: Minion did not return. [No response]
在原先master上修改minion01的主机名,重启此机器的minion服务后,在新的master上执行如下成功。 [root@matser salt]# salt 'minion01' test.ping minion01: True [root@matser salt]#
[root@master salt]# salt '*' cmd.run "/bin/cp /etc/hosts /etc/host_bak1"
minion02:
minion01:
Minion did not return. [Not connected]
[root@master salt]# salt '*' cmd.run "sed -i 's#10.0.1.171#10.0.1.175#g' /etc/hosts"
minion02:
minion01:
Minion did not return. [Not connected]
[root@master salt]# salt '*' cmd.run '/etc/init.d/salt-minion restart'
minion02:
Stopping salt-minion daemon: ?[60G[?[0;32m OK ?[0;39m]
Starting salt-minion daemon: ?[60G[?[0;32m OK ?[0;39m]
minion01:
Minion did not return. [No response]
[root@master salt]#
[root@matser salt]# salt '*' test.ping
minion01:
True
minion02:
True
[root@matser salt]#
salt 版本查看
[root@master salt]# salt salt salt-cp salt-key salt-master salt-run salt-unity [root@master salt]# salt --version salt 2015.5.10 (Lithium) [root@master salt]# salt-key --version salt-key 2015.5.10 (Lithium) [root@master salt]#
minion上执行
[root@minion01 ~]# salt- salt-call salt-minion [root@minion01 ~]# salt-call --version salt-call 2015.5.10 (Lithium) [root@minion01 ~]# salt-minion --version salt-minion 2015.5.10 (Lithium) [root@minion01 ~]#
saltstack的acl练习
acl访问控制可以让有的用户可以执行某些模块,有的用户无法执行某些模块
vim /etc/salt/master
找到245行
241 # Allow users on the master access to execute specific commands on minions. 242 # This setting should be treated with care since it opens up execution 243 # capabilities to non root users. By default this capability is completely 244 # disabled. 245 #client_acl: 246 # larry: 247 # - test.ping 248 # - network.*
改成如下,只允许zyx这个用户执行test.ping 和network这个模块下的所有方法
241 # Allow users on the master access to execute specific commands on minions. 242 # This setting should be treated with care since it opens up execution 243 # capabilities to non root users. By default this capability is completely 244 # disabled. 245 client_acl: 246 zyx: 247 - test.ping 248 - network.*
由于zyx是对日志目录没有写的权限
[root@master pillar]# su - zyx
[zyx@master ~]$ salt '*' test.ping
[WARNING ] Failed to open log file, do you have permission to write to /var/log/salt/master?
minion02:
True
minion01:
True
[zyx@master ~]$
还需要一些授权
搜索文档中 Permission Issues 这个关键词
chmod 755 /var/cache/salt /var/cache/salt/master /var/cache/salt/master/jobs /var/run/salt /var/run/salt/master
操作如下,多加一个目录/var/log/salt/master
原文档是chmod操作,我们执行chown操作
下面测试执行cmd.run模块就提示没权限了
[zyx@master ~]$ exit
logout
[root@master pillar]# chown -R zyx /var/cache/salt /var/cache/salt/master /var/cache/salt/master/jobs /var/run/salt /var/run/salt/master /var/log/salt/master
[root@master pillar]# su - zyx
[zyx@master ~]$ salt '*' test.ping
minion02:
True
minion01:
True
[zyx@master ~]$ salt '*' cmd.run 'w'
Failed to authenticate! This is most likely because this user is not permitted to execute commands, but there is a small possibility that a disk error occurred (check disk/inode usage).
[zyx@master ~]$
设置多个用户的acl写法
client_acl:
zyx:
- test.ping
- network.*
user01:
- test.ping
- network.*
另外还可以设置黑名单,这里不做太深的研究
250 # Blacklist any of the following users or modules 251 # 252 # This example would blacklist all non sudo users, including root from 253 # running any commands. It would also blacklist any use of the "cmd" 254 # module. This is completely disabled by default. 255 # 256 #client_acl_blacklist: 257 # users: 258 # - root 259 # - '^(?!sudo_).*$' # all non sudo users 260 # modules: 261 # - cmd
浙公网安备 33010602011771号