saltstack高效运维
salt介绍
saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统。在市面上,如同salt的批量管理工具ansible、fabric、puppet、chef、ansible。
saltstack的运行方式
- Local 本地运行,交付管理
- Master/Minion <<< 常用方式
- Salt SSH 不需要客户端
salt部署基本架构
在安装salt之前,先理解salt架构中各个角色,主要区分是salt-master和salt-minion,顾名思义master是中心控制系统,minion是被管理的客户端。
salt架构中的一种就是master > minion。
在远程执行系统中,salt用python通过函数调用完成任务。
服务器环境准备
服务器环境 | centos7(master) | centos7(slave) |
ip地址 |
192.168.11.92 | 192.168.11.231 |
身份 |
master | slave |
软件包 |
salt-master | salt-minion |
关闭服务器安全策略
关闭firewalld systemctl disable firewalld systemctl stop firewalld 关闭iptables iptables -F 关闭selinux
安装saltstack
在master机器安装 yum install salt-master
在minion机器安装 yum install salt-minion
两台机器的环境配置
1.确保机器通信
2.修改两台机器的/etc/hosts强制解析(公司会搭建一个私有dns服务器,dnsmasq)
master /etc/hosts 192.168.11.231 slave slave /etc/hosts 192.168.11.92 master
3.关闭两台机器的防火墙策略
准备master和minion的配置文件
master
[root@master ~]# cat /etc/salt/master 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 #日志文件地址
slave
[root@localhost yum.repos.d]# cat /etc/salt/minion master: master master_port: 4506 user: root # salt运行的用户,影响到salt的执行权限
id: bbn
acceptance_wait_time: 10
log_file: /var/log/salt/minion
注意光标大小一致,不一致会导致启动失败!!!
分别启动这两个服务端
systemctl start salt-master
systemctl start salt-minion
在master上接收minion秘钥
在minion启动后连接master会请求master为其签发证书,等待证书签发完成后,master可以信任minion,并且minion和master之间的通信是加密的
此时bbn已经出现在unaccepted keys中,说明minion已经和master联系,并且master已经获取了minion的公钥,等待下一步指令。
如果不能正常出现Unaccepted Keys,多重启几遍服务
检查master和slave的秘钥匹配
主人机器输入: salt-key -f qishiminion 儿子机器输入: salt-call --local key.finger
初次通信,在master节点上,接受minion的秘钥
salt-key -a bbn #这个命令,是单独接受秘钥
salt-key
只有Master
接受了Minion Key
后,才能进行管理。具体的认证命令为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自动接受请求
日常命令参数
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命令
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启动脚本
第一条salt命令
[root@master ~]# salt '*' test.ping slave: True # salt 是一个命令 # * 表示目标主机, 在这里代表所有目标主机 # test.ping是salt远程执行的一个模块下面的方法。
这是条很简单的探测minion主机存活命令,也是远程执行命令,我们通过master发送消息给"*"所有的minion,并且告诉他们运行salt内置的命令(也是python模块中的一个函数),返回true表示slave机器监控存活
salt命令组成结构
在命令行输入的命令都是 执行模块
等到命令写入到文件中, 就叫做状态模块
salt --help #即可查看salt帮助 [root@master 192.168.199.155 ~]$salt --help Usage: salt [options] '<target>' <function> [arguments] salt命令 参数 目标 salt模块的函数 远程执行的参数
完整的五部分命令
#--summary参数显示salt命令的概要 [root@master 192.168.199.155 ~]$salt --summary '*' cmd.run 'hostname' bbn: slave ------------------------------------------- Summary ------------------------------------------- # of Minions Targeted: 1 # of Minions Returned: 1 # of Minions Did Not Return: 0 -------------------------------------------
列出所有salt的sys模块
[root@master 192.168.11.72 ~]$salt 'bbn' sys.list_modules
远程执行命令模块
cmd是超级模块,所有shell命令都能执行
[root@master 192.168.11.72 ~]$salt 'bbn' cmd.run 'ps -ef|grep python' slave: root 905 1 0 07:31 ? 00:00:02 /usr/bin/python -Es /usr/sbin/tuned -l -P root 3843 1 0 11:05 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion root 3846 3843 0 11:05 ? 00:00:01 /usr/bin/python /usr/bin/salt-minion root 4031 1 0 11:31 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion root 4032 4031 0 11:31 ? 00:00:00 /bin/sh -c ps -ef|grep python root 4034 4032 0 11:31 ? 00:00:00 grep python
远程安装nginx
#在minion上安装nginx [root@master 192.168.11.72 ~]$salt 'bbn' pkg.install "nginx" #卸载minion上的nginx [root@master 192.168.11.72 ~]$salt 'bbn' pkg.remove "nginx" #检查pkg包的版本 [root@master 192.168.11.72 ~]$salt 'bbn' pkg.version "nginx"
远程管理服务模块
管理服务是系统管理员的重要任务,通过salt管理minion服务会很简单,使用service模块
[root@master 192.168.11.72 ~]$salt 'bbn' service.start "nginx" slave: True [root@master 192.168.11.72 ~]$salt 'bbn' service.status "nginx" slave: True [root@master 192.168.11.72 ~]$salt 'bbn' service.stop "nginx" slave: True
与标准的Linux命令一样,salt的命令一样用法
out控制salt命令结果输出的格式
[root@master 192.168.199.155 ~]$salt --out=json '*' cmd.run_all 'hostname' { "bbn": { "pid": 6542, "retcode": 0, "stderr": "", "stdout": "slave" } }
[root@master 192.168.199.155 ~]$salt --out=yaml '*' cmd.run_all 'hostname' bbn: pid: 2289 retcode: 0 stderr: '' stdout: slave
YAML讲解
salt的配置文件是yaml配置文件,不能用tab saltstack,k8s,ansible都用的yaml格式配置文件 语法规则 大小写敏感 使用缩进表示层级关系 缩进时禁止tab键,只能空格 缩进的空格数不重要,相同层级的元素左侧对其即可 # 表示注释行 yaml支持的数据结构 对象: 键值对,也称作映射 mapping 哈希hashes 字典 dict 冒号表示 key: value key冒号后必须有 数组: 一组按次序排列的值,又称为序列sequence 列表list 短横线 - list1 纯量: 单个不可再分的值 对象:键值对 yaml first_key: second_key:second_value python { 'first_key':{ 'second_key':'second_value', } }
短横杠 YAML语法表示列表,使用一个横杠加一个空格 多个项使用同样的缩进级别作为同一个列表的部分 - list_value_one - list_value_two - list_value_three 列表可以作为一个键值对的value,例如一次性要安装多个软件 my_dict: - l1 - l2 - l3 转化为python代码理解就是 { 'my_dict':['l1','l2',;l3] }
Python中的字典是简单的键值对,go语言中称作哈希表map 字典的key通过冒号分割 key在YAML中表现形式是一个冒号结果的字符串 my_key: my_value 转化到python语法中,上述命令为 {'my_key':'my_value'} value还可以通过缩进和key关联,四个空格!! my_key: my_value 转化为python语法同样的 {'my_key':'my_value'} YAML语法中字典是可以嵌套的 one_dict_key: two_dict_key:value_dict 转化为python语法 { 'one_dict_key':{ 'two_dict_key':'value_dict' } }
目标定位字符串
之前的salt命令我们都是使用 salt '*'控制所有minion,并且我们只有一个“slave”,但是生产环境的服务器很可能是成千上百的minion,因此需要灵活地定位所需的服务器并且执行远程命令。
Linux通配符 * 代表任意字符,或空字符串 ? 代表一个字符,不可以为空 [a-z] [0-9] 代表任何一个小写字母 [root@master 192.168.11.72 ~]$salt 'slav?' test.ping slave: True [root@master 192.168.11.72 ~]$salt '[a-z]lave' test.ping slave: True salt海支持python的re正则表达式
Salt采集静态信息之Grains
Grains 是saltstack组件中非常重要之一,在配置部署时候回经常使用,Grains记录minion的静态信息,比如常用属性,CPU、内存、磁盘、网络信息等。 Minions的Grains信息是Minion启动时采集汇报给Master的 Grains是以 key value形式存储的数据库,可以看做Host的元数据(metadata) Grains保存着收集到的客户端的详细信息 如果slave机器数据变化,grains就过期了 在生产环境中需要自定义Grains,可以通过 Minion配置文件 Grains相关模块定义 Python脚本定义 salt 'bbn' sys.doc grains#查看grains的命令用法
Grains
Grains人为是描述minion本身固有的静态属性数据,列出主机所有Grains数据 [root@master 192.168.11.72 ~]$salt 'bbn' grains.items slave: ---------- SSDs: biosreleasedate: 05/19/2017 biosversion: 6.00 信息过长,已经省略 salt 'bbn' grains.ls #列出所有grains方法
检索某些数据
[root@master 192.168.11.72 ~]$salt 'bbn' grains.item os id host slave: ---------- host: slave id: bbn os: CentOS
利用Grains静态信息定位主机
两种写法: salt '*' grains.item key1 key2 key3 salt '*' -G #定位Cenots的机器 [root@master 192.168.11.72 ~]$salt -G 'os:CentOS' test.ping slave: True #定位操作系统系统是7系列的机器 [root@master 192.168.11.72 ~]$salt -G 'osrelease:7*' test.ping slave: True #找出ip地址 salt '*' grains.item fqdn_ip4
自定义设置Grains数据
#设置数据 [root@master 192.168.11.72 ~]$salt 'bbn' grains.setval cpu_num 8 slave: ---------- cpu_num: #查询数据 [root@master 192.168.11.72 ~]$salt 'bbn' grains.item cpu_num slave: ---------- cpu_num:
在master端设置Grains静态数据,原理会将此数据添加到minion服务器的配置文件的/etc/salt/grains
[root@slave 192.168.11.71 ~]$cat /etc/salt/grains cpu_num: 8
对于复杂的数据结构,可以添加灵活的JSON语法
[root@master 192.168.11.72 ~]$salt 'slave' grains.setval cpu_info '["Intel","Xeon","10"]' slave: ---------- cpu_info: - Intel - Xeon - 10 [root@master 192.168.11.72 ~]$salt 'slave' grains.item cpu_info slave: ---------- cpu_info: - Intel - Xeon - 10
因此Grains数据写入配置文件后,重启salt-minion服务,数据也不会丢失
想要删除可以通过grains.delval命令删除,或者去minion的配置文件删除配置一样完成操作(或者删除文件)
1.方法一,清空值 [root@master 192.168.11.72 ~]$salt 'bbn' grains.delval cpu_info slave: None [root@master 192.168.11.72 ~]$salt 'bbn' grains.delval cpu_num slave: None 2.方法二 删除minion的grains配置文件,重启服务 [root@slave 192.168.11.71 ~]$rm -rf /etc/salt/grains [root@slave 192.168.11.71 ~]$!sys systemctl restart salt-minion 检查结果删除成功
Python API调用SaltStack
SaltStack本身提供salt(usr/bin/salt)来交互管理,但是去服务器上敲命令肯定不是一个长远之计,这时候python就体现了nb的功能。
Python API就是给Python提供的API使用,需要在SaltStack master上运行
实例代码
[root@master ~]$python Python 2.7.5 (default, Jul 13 2018, 13:06:57) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import salt.client >>> local = salt.client.LocalClient() #<salt.client.LocalClient object at 0x7f886dbdd850> >>> local.cmd('*','cmd.run',['hostname'])#向所有minion发送命令 {'slave': 'slave'}
因此python API就是提供了向saltstack发送命令的入口。
通过API获取saltstack的配置文件
获取master配置文件
>>> import salt.config #导入salt配置模块 >>> m_opts=salt.config.client_config('/etc/salt/master') #读取salt配置文件,得到一个字典数据
获取minion配置文件
Python 2.7.5 (default, Jul 13 2018, 13:06:57) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import salt.client >>> salt.config.minion_config('/etc/salt/minion') #读取minion配置文件,得到字典数据,通过字典方法可以查看信息
Python API介绍
/usr/bin/salt默认使用的接口是LocalClient,该接口只能在salt master上使用
[root@master ~]$python Python 2.7.5 (default, Jul 13 2018, 13:06:57) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import salt.client >>> local = salt.client.LocalClient() #<salt.client.LocalClient object at 0x7f886dbdd850> >>> local.cmd('*','cmd.run',['hostname'])#向所有minion发送命令 {'slave': 'slave'}
逐条返回结果,local.cmd_iter()
>>> ret=local.cmd_iter('*','test.ping') >>> ret <generator object cmd_iter at 0x7f886d455c80> >>> for i in ret: ... print i ... {'slave': {'retcode': 0, 'ret': True}}
菲波那切数列
>>> local.cmd('*','test.fib',[10]) {'slave': [[0, 1, 1, 2, 3, 5, 8], 2.1457672119140625e-06]}
检查minion服务器信息
>>> local.cmd('*','cmd.run',['hostname']) {'slave': 'slave'} >>> local.cmd('*','cmd.run',['ifconfig']) >>> local.cmd('*','cmd.run',['crontab -l']) >>> local.cmd('*','cmd.run',['df -h'])
启停minion的服务,如nginx
>>> local.cmd('*','service.stop',['nginx']) {'slave': True} >>> local.cmd('*','service.status',['nginx']) {'slave': False} >>> local.cmd('*','service.start',['nginx']) {'slave': True}