saltstack
saltstack 实现一个快速的远程执行系统
saltstack的运行方式:
Local 本地运行,交付管理
Master/Minion <<< 常用方式
Salt SSH 不需要客户端
salt部署基本架构:
主要区分是salt-master和salt-minion,顾名思义master是中心控制系统,minion是被管理的客户端。
salt架构中的一种就是master > minion。
salt的安装
0.准备两台主机,一台master,一台minion
master:192.168.11.59
minion:192.168.11.169
master的安装和配置
# 安装 yum -y install salt-master # 修改配置文件 interface: 0.0.0.0 # 绑定本地的地址 publish_port: 4505 # master的管理端口 user: root # salt运行的用户 worker_threads: 1 # salt的运行线程,一般不要超过CPU的个数 ret_port: 4506 # 跟minion的通讯端口,用于文件服务,认证,接受返回结果等 pidfile: /var/run/salt-master.pid # 指定pid文件位置 log_file: /var/log/salt/master # 指定log文件位置 #auto_accept: False # 自动接收minion的key # 修改hosts文件 vim /etc/hosts 192.168.11.169 minion # 启动master systemctl start salt-master
minion的安装和配置
# 安装 yum -y install salt-minion # 修改配置文件 vim /etc/salt/minion master: master master_port: 4506 user: root id: 192.168.11.169-slave acceptance_wait_time: 10 log_file: /var/log/salt/minion # 修改hosts文件 vim /etc/hosts 192.168.11.59 master # 启动 systemctl start salt-minion
检测master和minion的密钥
# master
[root@master ~]# salt-key -f slave1
Unaccepted Keys:
slave1: 5a:47:81:44:36:0d:03:0b:55:2a:2e:de:f5:c3:37:19
# minion
[root@minion ~]# salt-call --local key.finger
local:
5a:47:81:44:36:0d:03:0b:55:2a:2e:de:f5:c3:37:19
master管理minion的密钥
在minion启动后连接master会请求master为其签发证书,等待证书签发完成后,master可以信任minion,并且minion和master之间的通信是加密的。
[root@master ~]# salt-key -L
Accepted Keys: # 已经接收的minion
Denied Keys: # 拒绝的minion
Unaccepted Keys: # 未加入的minion
slave1
Rejected Keys: # 吊销的minion
#常用参数
-L #查看KEY状态
-A #允许所有
-D #删除所有
-a #认证指定的key
-d #删除指定的key
-r #注销掉指定key(该状态为未被认证)
#在master端/etc/salt/master配置
auto_accept: True #如果对Minion信任,可以配置master自动接受请求
日常命令参数
master端
[root@master ~]# rpm -ql salt-master
/etc/salt/master # master主配置文件
/usr/bin/salt # master 核心操作命令
/usr/bin/salt-cp # master 文件传输命令
/usr/bin/salt-key # master 证书管理命令
/usr/bin/salt-master # master 服务命令
/usr/bin/salt-run # master runner命令
minion端
[root@minion ~]# rpm -ql salt-minion
/etc/salt/minion # minion配置文件
/usr/bin/salt-call # minion 拉取命令
/usr/bin/salt-minion # minion 服务命令
/usr/lib/systemd/system/salt-minion.service # minion启动脚本
salt命令,基本都在master上操作
salt '*' test.ping # 探测minion主机存活命令
salt '*' sys.list_functions test # 查看test模块的命令
salt '*' sys.list_functions cmd # 查看cmd模块的命令
salt 'slave1' sys.list_functions # 查看所有的模块
参数:
--summary # 显示salt命令的概要
--out=json # 结果以json格式显示
--out=yaml # 结果以yaml格式显示
JSON格式和YAML格式
[root@master ~]# salt --out=json '*' cmd.run_all 'hostname -I'
{
"slave1": {
"pid": 1794,
"retcode": 0,
"stderr": "",
"stdout": "192.168.11.169"
}
}
[root@master ~]# salt --out=yaml '*' cmd.run_all 'hostname -I'
slave1:
pid: 1800
retcode: 0
stderr: ''
stdout: 192.168.11.169
YAML语法
语法规则
大小写敏感
使用缩进表示层级关系
缩进时禁止tab键,只能空格
缩进的空格数不重要,相同层级的元素左侧对其即可
# 表示注释行
yaml支持的数据结构
对象: 键值对,也称作映射 mapping 哈希hashes 字典 dict 冒号表示 key: value key冒号后必须有
数组: 一组按次序排列的值,又称为序列sequence 列表list 短横线 - list1
纯量: 单个不可再分的值
# YAML的编写
slave:
pid: 1794
port:
- 3306
- 80
- 22
ip: 192.168.11.169
# 对应的json格式
{ slave: {
pid: 1794,
port: [ 3306, 80, 22 ],
ip: '192.168.11.169' }
}
cmd是超级模块,是远程执行命令的模块,用于指定minion执行命令
salt 'minion名字' cmd.run '命令'
'*' -- 代表所有minion
service模块,是远程管理服务的模块,即systemctl
salt 'minion名字' service.start/status/stop/restart '服务' # 相当于在minion执行systemctl start/status/stop restart 服务
'*' -- 代表所有minion
pkg模块,是远程安装软件的模块,即yum
# salt 'minion节点' pkg.install/remove '软件'
salt 'slave1' pkg.install 'httpd' # 相当于在minion执行 yum install httpd
salt 'slave1' pkg.version 'httpd' # 查看安装软件的版本
salt 'slave1' pkg.remove 'httpd' # 相当于在minion执行 yum remove httpd
slat采集静态信息
Grains 是saltstack组件中非常重要之一,在配置部署时候回经常使用,Grains记录minion的静态信息,比如常用属性,CPU、内存、磁盘、网络信息等。
Minions的Grains信息是Minion启动时采集汇报给Master的
Grains是以 key value形式存储的数据库,可以看做Host的元数据(metadata)
Grains保存着收集到的客户端的详细信息
如果slave机器数据变化,grains就过期了
在生产环境中需要自定义Grains,可以通过
Minion配置文件
Grains相关模块定义
Python脚本定义
salt 'slave' sys.doc grains#查看grains的命令用法
salt 'slave1' grains.items # 查看minion主机的所有Grains数据
salt 'slave1' grains.item ipv4 host # 查看minion主机的ipv4和主机名
自定义Grains静态数据
# 给minion主机设置grains的自定义数据
salt 'slave1' grains.setval serial_number ab-cd-ef-01-02
# 清空Grains自定义数据的值,默认变为None
salt 'slave1' grains.delval serial_number
# 删除Grains自定义数据,需要修改minion的grains配置文件,重启服务
# 在minion上
[root@minion ~]# vim /etc/salt/grains
[root@minion ~]# systemctl restart salt-minion
# 给slave1设置静态数据 [root@master ~]# salt 'slave1' grains.setval serial_number ab-cd-ef-01-02 slave1: ---------- serial_number: ab-cd-ef-01-02 # 查询slave1的静态数据 [root@master ~]# salt 'slave1' grains.item serial_number slave1: ---------- serial_number: ab-cd-ef-01-02 # 清空slave1的静态数据 [root@master ~]# salt 'slave1' grains.delval serial_number slave1: None # 查询slave1的静态数据 [root@master ~]# salt 'slave1' grains.item serial_number slave1: ---------- serial_number: None # minion上修改grains的配置文件删除了静态数据,所以无法查询 [root@master ~]# salt 'slave1' grains.item serial_number slave1: Minion did not return. [No response]