01 . SaltStack部署配置及简单应用
SaltStack简介
SaltStack
- saltstack是一个新的基础平台管理工具,只需要花费数分钟即可运行起来,可以支撑管理上万台服务器的规模,数秒钟即可完成数据传递。
- saltstack是使用Python语言开发的,同时也支持restAPI方便二次开发以及和它平台集成,同时官方也发布了一个Web管理界面halite。
- Salt是python编写的,支持用户通过python自定义功能模块,也提供了大量的python API接口,用户可以根据需要进行简单快速的扩展。
优点
- 首先,他速度快,基于消息队列+线程,跑完多台设备,都是毫秒级别的
- 其次,非常灵活,源码是python,方便理解和自定义模块(python 语言相对于其他的perl、ruby等还是很好理解的)
- 命令简单,功能强大
saltstack运行方式
- Local
- Master/Minion
- Salt SSH
saltstack三大功能
- 远程执行
- 配置管理
- 云管理
saltstack数据系统
- Grains (静态数据)
- pillar (动态数据)
saltstack配置管理
- SLS(YAML、Jinja)
- Highstate
- States Module
部署配置SaltStack
准备两台机器,这两台机器都关闭 selinux,清空防火墙规则。
List
CentOS7.3
epel-7.repo
salt-master
salt-minion
# 依赖包
python
zeromq
pyzmp
pycrypto
msgpack-python
yaml
jinja2
节点名 | IP | 软件版本 | 硬件 | 网络 | 说明 |
---|---|---|---|---|---|
Master | 192.168.43.132 | list 里面都有 | 2C4G | Nat,内网 | 测试环境 |
192.168.43.234 | list 里面都有 | 2C4G | Nat,内网 | 测试环境 |
安装saltstack
salt软件包需要epel源的支持,那么下载
EPEL的全称叫 Extra Packages for Enterprise Linux 。EPEL是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上了 EPEL之后,就相当于添加了一个第三方源。
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all #清空缓存
yum makecache #生成yum缓存
# master 安装salt-master
yum install salt-master -y
# slave 安装salt-minion
yum install salt-minion -y
配置Saltstack
# salt-master的配置文件是/etc/salt/master
# salt-minion的配置文件是/etc/salt/minion
# 配置文件中包含了大量可调整的参数,这些参数控制master和minion各个方面
salt-master
[root@master ~]# grep -v ^# /etc/salt/master|grep -v ^$
interface: 0.0.0.0 #绑定到本地的0.0.0.0地址
publish_port: 4505 #管理端口,命令发送
user: root #运行salt进程的用户
worker_threads: 5 #salt运行线程数,线程越多处理速度越快,不要超过cpu个数
ret_port: 4506 #执行结果返回端口
pidfile: /var/run/salt-master.pid #pid文件位置
log_file: /var/log/salt/master #日志文件地址
#自动接收minion的key
auto_accept: False
salt-minion
[root@slave ~]# grep -v ^# /etc/salt/minion|grep -v ^$
master: master
master_port: 4506
user: root
id: slave
acceptance_wait_time: 10
log_file: /var/log/salt/minion
启动验证服务
systemctl start salt-minion
systemctl start salt-master
#检查salt状态
systemctl status salt-minion
systemctl status salt-master
# 验证端口
[root@master ~]# ss -atnlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:* users:(("sshd",pid=883,fd=3))
LISTEN 0 100 *:4505 *:* users:(("salt-master",pid=1232,fd=13))
LISTEN 0 100 *:4506 *:* users:(("salt-master",pid=1244,fd=21))
# salt-master默认监听两个端口
4505 # publish_port 提供远程命令发送功能
4506 # ret_port 提供认证,文件服务,结果收集等功能
# 确保客户端可以通信服务器的此2个端口,保证防火墙允许端口通过。因此在测试环境直接关闭防火墙
配置master认证minion
master上接受minion密钥
在minion启动后连接master会请求master为其签发证书,等待证书签发完成后,master可以信任minion,并且minion和master之间的通信是加密的。
salt-master执行
[root@master ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
slave # 此时已出现slave
Rejected Keys:
# 此时slave已经出现在unaccepted keys中,说明minion已经和master联系,
# 并且master已经获取了minion的公钥,等待下一步指令。
检查master和minion的密钥匹配
[root@master ~]# salt-key -f slave
Unaccepted Keys:
slave: d4:97:1a:81:4d:88:d2:9b:0b:73:e3:66:07:7e:20:6c
# 因此可确认密钥匹配,在master上接受密钥
[root@master ~]# salt-key -a slave
The following keys are going to be accepted:
Unaccepted Keys:
slave
Proceed? [n/Y] y
Key for minion slave accepted.
# 确认接收秘钥后,检验minion秘钥是否被接收
[root@master ~]# salt-key -L
Accepted Keys:
slave
Denied Keys:
Unaccepted Keys:
Rejected Keys:
salt-key常用命令
[root@linux-node1 ~]# salt-key -L
Accepted Keys: #已经接受的key
Denied Keys: #拒绝的key
Unaccepted Keys:#未加入的key
Rejected Keys:#吊销的key
#常用参数
-L #查看KEY状态
-A #允许所有
-D #删除所有
-a #认证指定的key
-d #删除指定的key
-r #注销掉指定key(该状态为未被认证)
#在master端/etc/salt/master配置
auto_accept: True #如果对Minion信任,可以配置master自动接受请求
salt-key的使用
# 列出当前所有的key
[root@master ~]# salt-key
Accepted Keys:
slave
Denied Keys:
Unaccepted Keys:
Rejected Keys:
# 添加指定minion的key
[root@master ~]# salt-key -a salt -y
# 添加所有minion的key
[root@master ~]# salt-key -A -y
# 删除指定的key
[root@master ~]# salt-key -d slave -y
# 删除所有的key
[root@master ~]# salt-key -D -y
日常命令参数
首先知道master和minion都安装了什么文件,然后才知道怎么操作
# master端
[root@master ~]# rpm -ql salt-master
/etc/salt/master # salt master主配置文件
/usr/bin/salt # salt master核心操作命令
/usr/bin/salt-cp # salt 文件传输命令
/usr/bin/salt-key # salt证书管理
/usr/bin/salt-master # salt master服务命令
/usr/bin/salt-run # salt master runner命令
/usr/bin/salt-unity
/usr/lib/systemd/system/salt-master.service
/usr/share/man/man1/salt-cp.1.gz
/usr/share/man/man1/salt-key.1.gz
/usr/share/man/man1/salt-master.1.gz
/usr/share/man/man1/salt-run.1.gz
/usr/share/man/man1/salt-unity.1.gz
/usr/share/man/man7/salt.7.gz
# slave端
[root@slave ~]# rpm -ql salt-minion
/etc/salt/minion # minion配置文件
/usr/bin/salt-call # 拉取命令
/usr/bin/salt-minion # minion服务命令
/usr/lib/systemd/system/salt-minion.service # minion启动脚本
/usr/share/man/man1/salt-call.1.gz
/usr/share/man/man1/salt-minion.1.gz
第一条SaltStack命令
第一条salt命令
[root@master ~]# salt '*' test.ping
slave:
True
[root@master ~]# salt '*' test.echo 'zhou'
slave:
zhou
# salt是一个命令
# * 表示目标主机, 在这里代表所有目标主机
# test.ping是salt远程执行的一个模块下面的方法。
# 这是条很简单的探测minion主机存活命令,也是远程执行命令,我们通过master发送消息给"*"所有的minion,
# 并且告诉他们运行salt内置的命令(也是python模块中的一个函数),返回true表示slave机器监控存活。
[root@master ~]# salt '*' test.fib 50
slave:
|_
- 0
- 1
- 1
- 2
- 3
- 5
- 8
- 13
- 21
- 34
- 5.00679016113e-06
# test.fib生成斐波那契数列
# 菲波那切数列定义是第0项是0,第1项是1,数列从第3项开始,每一项等于前两项之和。
Salt命令组成结构
完整的一个命令
# 在命令行输入的命令都是 执行模块
# 等到命令写入到文件中, 就叫做状态模块
salt --help # 即可查看salt帮助
[root@master 192.168.199.155 ~]$salt --help
Usage: salt [options] '<target>' <function> [arguments]
# salt命令 参数 目标 salt模块的函数 远程执行的参数
# 完整的五部分命令
# summary参数显示salt命令的概要
[root@master ~]# salt --summary '*' cmd.run 'hostname'
slave:
slave
-------------------------------------------
Summary
-------------------------------------------
# of Minions Targeted: 1
# of Minions Returned: 1
# of Minions Did Not Return: 0
-------------------------------------------
# 列出salt的sys模块
[root@master ~]# salt 'slave' sys.list_modules
slave:
- acl
- aliases
- alternatives
- archive
- artifactory
- blockdev
- btrfs
- buildout
- cloud
- cmd
远程执行命令模块
[root@master ~]# salt 'slave' sys.list_modules
# cmd是超级模块,所有shell命令都能执行
[root@master ~]# salt 'slave' cmd.run 'ps -ef |grep python'
slave:
root 882 1 0 14:57 ? 00:00:00 /usr/bin/python -Es /usr/sbin/tuned -l -P
root 1220 1 0 15:13 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion
root 1223 1220 0 15:13 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion
root 13564 1 0 15:31 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion
root 13565 13564 0 15:31 ? 00:00:00 /bin/sh -c ps -ef |grep python
root 13567 13565 0 15:31 ? 00:00:00 grep python
远程安装nginx
#在minion上安装nginx
[root@master~]$salt 'slave' pkg.install "nginx"
#卸载minion上的nginx
[root@master~]$salt 'slave' pkg.remove "nginx"
#检查pkg包的版本
[root@master~]$salt 'slave' pkg.version "nginx"
远程管理服务模块
# 管理服务是系统管理员的重要任务,通过salt管理minion服务会很简单,使用service模块
[root@master ~]# salt 'slave' service.start "nginx"
slave:
True
[root@master ~]# salt 'slave' service.status "nginx"
slave:
True
[root@master ~]# salt 'slave' service.stop "nginx"
slave:
True
--out控制salt命令结果输出格式
JSON
[root@master ~]# salt --out=json '*' cmd.run_all 'hostname'
{
"slave": {
"pid": 13780,
"retcode": 0,
"stderr": "",
"stdout": "slave"
}
}
YAML
[root@master ~]# salt --out=yaml '*' cmd.run_all 'hostname'
slave:
pid: 13786
retcode: 0
stderr: ''
stdout: slave