saltstack运维工具
salt介绍
saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统。
salt强大吗
系统管理员日常会进行大量的重复性操作,例如安装软件,修改配置文件,创建用户,批量执行命令等
等。如果主机数量庞大,单靠人工维护实在让人难以忍受。
早期运维人员会根据自己的生产环境来写特定脚本完成大量重复性工作,这些脚本复杂且难以维护。系统管理员面临的问题主要是1、系统配置管理,2、远程执行命令,因此诞生了很多开源软件,系统维护方面有fabric、puppet、chef、ansible、saltstack等,这些软件擅长维护系统状态或方便的对大量主机进行批量的命令执行。
salt灵活性强大,可以进行大规模部署,也能进行小规模的系统部署。salt的设计架构适用于任意数量的服务器,从少量本地网络系统到跨越数个数据中心,拓扑架构都是c/s模型,配置简单。
不管是几台、几百台、几千台服务器,都可以使用salt在一个中心节点上进行管控,灵活定位任意服务器子集来运行命令。
Salt是python编写的,支持用户通过python自定义功能模块,也提供了大量的python API接口,用户可以根据需要进行简单快速的扩展。
saltstack的运行方式
- Local 本地运行,交付管理
- Master/Minion <<< 常用方式
- Salt SSH 不需要客户端
salt部署基本架构
在安装salt之前,先理解salt架构中各个角色,主要区分是salt-master和salt-minion,顾名思义master是中心控制系统,minion是被管理的客户端。
salt架构中的一种就是master > minion。
在远程执行系统中,salt用python通过函数调用完成任务。
运行salt依赖包
python zeromq pyzmp pycrypto msgpack-python yaml jinja2
服务器环境准备
关闭服务器安全策略
关闭firewalld systemctl disable firewalld systemctl stop firewalld 关闭iptables iptables -F 关闭selinux
安装saltstack
1、环境准备
准备3台机器,配置好ip地址,互相可以通信,即可 互ping一下看看通没通 ping192.168.61.138 一个master 一个minion 一个minion
2、配置hosts解析文件
配置hosts解析文件,强制进行主机名解析,加速salt的minion查找,分别在三台机器上,写入解析 vim /etc/hosts 192.168.16.142 s20 192.168.16.7 docker01 192.168.16.47 bogon
3、下载saltstack软件包
配置阿里云的源,下载saltstack软件包, 注意区分 服务端和客户端 1.在master上安装 yum install salt-master -y 2.在minion1上安装 yum install salt-minion -y 3.在minion2上安装 yum install salt-minion -y
4、配置文件
【salt-master配置文件】
配置文件在/etc/salt/master
vim 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 #日志文件地址 #自动接收minion的key auto_accept: False
【salt-minion1配置文件】
vim /etc/salt/minion # 打开配置文件,填入如下内容
master: s20 #指定mastet的通信地址 master_port: 4506 user: root id: s20minion1 #id用于指定minion的身份信息 ,待会可以在master上查看到的 acceptance_wait_time: 10 log_file: /var/log/salt/minion
【salt-minion2配置文件】
vim /etc/salt/minion # 打开配置文件,填入如下内容
master: s20 master_port: 4506 user: root id: s20minion2 acceptance_wait_time: 10 log_file: /var/log/salt/minion
5、重启master和minion,检查密钥是否匹配
重启
salt通信是在minion初次启动时候,建立新的连接的
systemctl restart salt-master
systemctl restart salt-minion
检查master和minion的秘钥匹配
【在master上执行】
【在minion上获取minion的秘钥】
确认密钥匹配进行下一步
6、查看minion的密钥信息
在minion启动后连接master会请求master为其签发证书,等待证书签发完成后,master可以信任minion,并且minion和master之间的通信是加密的。
在salt-master执行
salt-key命令用于管理mionion秘钥
在master机器上,查看minion的密钥信息 salt-key -L #查看所有密钥 salt-key -a s20minion1 #-a参数 单独接受一个密钥信息 salt-key -A #-A 接受所有的key信息 #常用参数 -L #查看KEY状态 -A #允许所有 -D #删除所有 -a #认证指定的key -d #删除指定的key -r #注销掉指定key(该状态为未被认证) #在master端/etc/salt/master配置 auto_accept: True #如果对Minion信任,可以配置master自动接受请求
[root@szx ~]# salt-key -L Accepted Keys: #已经接受的key Denied Keys: #拒绝的key Unaccepted Keys:#未加入的key Rejected Keys:#吊销的key
7、验证salt minion信息是否存活
salt "*" test.ping
转化为json信息
将输出的结果,转化为json信息,可以序列化后,丢给前端渲染
salt "*" test.ping --out=json
salt的命令学习
上面我们已经配置完master和minion的通信,接下来我们就可以通过salt命令来批量管理minion机器了
【验证salt minion信息是否存活】 salt "*" test.ping 【转化为json信息】 salt "*" test.ping --out=json 【让机器远程返回主机名给我】 salt --summary '*' cmd.run 'hostname' 【远程安装软件】 salt "*" cmd.run "yum install nginx -y" 【salt安装软件的接口】 远程安装nginx:salt '*' pkg.install 'nginx' 远程卸载nginx:salt '*' pkg.remove "nginx" 检查pkg包的版本:salt '*' pkg.version "nginx" 【远程管理服务模块】 # 管理服务是系统管理员的重要任务,通过salt管理minion服务会很简单,使用service模块 salt '*' service.start "nginx" salt '*' service.stop "nginx" salt '*' service.restart "nginx"
查看master和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命令
【minion端】
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启动脚本
【test模块】
[root@master ~]# salt '*' test.ping slave: True # salt 是一个命令 # * 表示目标主机, 在这里代表所有目标主机 # test.ping是salt远程执行的一个模块下面的方法。
这是条很简单的探测minion主机存活命令,也是远程执行命令,我们通过master发送消息给"*"所有的minion,并且告诉他们运行salt内置的命令(也是python模块中的一个函数),返回true表示slave机器监控存活。
test模块实际上还有许多其他的函数
[root@master 192.168.199.155 ~]$salt '*' sys.list_functions test slave: - test.arg - test.arg_repr - test.arg_type - test.assertion - test.attr_call - test.collatz - test.conf_test - test.cross_test - test.echo - test.exception - test.fib - test.get_opts - test.kwarg - test.module_report - test.not_loaded - test.opts_pkg - test.outputter - test.ping - test.provider - test.providers - test.rand_sleep - test.rand_str - test.retcode - test.sleep - test.stack - test.try_ - test.tty - test.version - test.versions_information - test.versions_report test其他函数
测试下test.echo
[root@master 192.168.199.155 ~]$salt '*' test.echo 'henry nb666' slave: henry nb666
test.fib生成斐波那契数列
菲波那切数列定义是第0项是0,第1项是1,数列从第3项开始,每一项等于前两项之和。
[root@master 192.168.199.155 ~]$salt '*' test.fib 50 slave: |_ - 0 - 1 - 1 - 2 - 3 - 5 - 8 - 13 - 21 - 34 - 1.09672546387e-05
salt命令的两种输出格式
【 json】
salt "*" test.ping --out=json
【yaml】
salt "*" test.ping --out=yaml
【yaml语法学习】
在学习saltstack过程中,第一要点就是States编写技巧,简称SLS文件。这个文件遵循YAML语法。初学者看这玩意很容易懵逼,来,超哥拯救你学习YAML语法 json xml yaml 数据序列化格式 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是YAML Ain't Markup Language的首字母缩写,YAML的语法简单, 结构体通过空格展示 项目使用 '-' 代表 键值对通过 ':' 分割
YAML语法遵循固定的缩进风格,表示数据层级结构关系,saltstack需要每个缩进级别由2个空格组成,禁止用tabs!!!
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' } }
短横杠 YAML语法表示列表,使用一个横杠加一个空格 多个项使用同样的缩进级别作为同一个列表的部分 - list_value_one - list_value_two - list_value_three 列表可以作为一个键值对的value,例如一次性要安装多个软件 my_dict: - l1 - l2 - l3 转化为python代码理解就是 { 'my_dict':['l1','l2',;l3] }