saltstack
saltstack博客地址: https://www.cnblogs.com/pyyu/p/9465608.html 在线yaml文件编写: http://www.bejson.com/validators/yaml_editor/
ansible #支持ssh,不需要客户端 saltstack #也是只是ssh,不需要客户端的 安装架构是,master /minion
安装salt的依赖模块 python pyzmp pycrypto msgpack-python yaml jinja2
1、服务器环境准备
master 讲师机 ip 192.168.12.96 node1 安装salt-master 准备多个客户端,被管控端,学生机 安装salt-minion 192.168.12.89 minion1 192.168.12.121 minion2 192.168.12.8 minion3
2、关闭所有节点的防火墙,以免影响实验
关闭firewalld systemctl disable firewalld systemctl stop firewalld 关闭iptables iptables -F 关闭selinux 关闭安全策略
3、配置本地文件解析,用于加速身份验证 编辑 /etc/hosts通过主机名通信
192.168.12.96 node1 192.168.12.89 minion1 192.168.12.121 minion2 192.168.12.8 minion3
4、确保环境准备ok,确保每个节点的yum源配置正确
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缓存
5、安装salt软件
1.node1端安装salt-master yum install salt-master -y 2.在3个minion地址中安装salt-minion yum install salt-minion -y
6、修改master和minion的配置文件
1.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,minion 断开又重新连接 auto_accept: False 2.三个minion的配置文件 master: node1 master_port: 4506 user: root id: s14minion1 #表示minion身份信息的,这里要修改,三个节点,为不同的id acceptance_wait_time: 10 log_file: /var/log/salt/minion
7、启动salt-master和salt-minion
systemctl start salt-master systemctl start salt-minion
8、在salt软件启动的时候,会进行通信连接
在salt软件启动的时候,会进行通信连接,master可以检测到minion的身份地址,此时还未接收key,还未通信,需要认证秘钥才可以通信 salt-key -L #查看所有主机秘钥信息 #salt-key参数解析 -L #查看KEY状态 -A #允许所有 -D #删除所有 -a #认证指定的key -d #删除指定的key -r #注销掉指定key(该状态为未被认证) #在秘钥通信之前,最好进行秘钥检验 master端: salt-key -f 指明节点id #查看节点的秘钥信息 minion端: salt-call --local key.finger #查看自己的秘钥信息,与master端的进行对比 salt-key -a minion-id #指明接收一个minion salt-key -A # 接收所有minion的秘钥 salt "*" test.ping #通过salt主命令 匹配所有的已接收的主机 发送ping命令,会得到True 或false salt "*" cmd.run #通过执行命令接口,对所有主机,执行命令 salt "*" cmd.run "yum install nginx -y #对所有主机发送安装nginx的命令
salt常用命令
salt --summary '*' cmd.run 'yum remove nginx -y'
--summary是返回salt命令的执行成功状态
"*" 目标匹配字符串
cmd.run 模块函数,对所有匹配到的机器,执行后面的参数
'yum remove nginx -y' #参数如下
salt --out=json '*' cmd.run_all 'hostname' --out=json #返回salt执行结果为json格式 #json数据反馈给API
salt "*" cmd.run "ls /tmp" salt "*" cmd.run_all "ls /tmp" #cmd.run和cdm.run_all是返回结果的详细的差别
salt 's14minion[1,2,3]' pkg.download redis#只下载redis的rpm包,不安装这是pkg.download函数的功能
pkg模块对应着yum工具 pkg.install pkg.version pkg.remove pkg.version
与系统交互的sys模块
#列出pkg所有的方法 salt '*' sys.list_functions pkg
#service模块,练习远程安装启动nginx
salt 's14minion[1,2,3]' pkg.install nginx
salt "*" service.status/start/stop/restart nginx #通过service模块管理服务
#命令执行结果,返回为yaml salt --out=yaml "*" service.status nginx
salt命令组成结构
salt的命令直接输入,叫做执行模块 saltstack写入到文件中,叫做状态模块 sls文件,遵循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', } }
状态是对minion的一种描述和定义,运维不需要关心部署是如何完成的,只需要描述minion需要达到什么状态。
接下来通过state.cls 模块部署nginx
master端
vim /etc/salt/master #打开注释,写入以下,必须严格遵循yaml语法,空格 file_roots: base: - /srv/salt/base dev: - /srv/salt/dev test: - /srv/salt/test prod: - / srv/salt/prod #此步骤在master和minion都需要执行,都需要文件夹,和nginx.sls文件 [root@master ~]$mkdir -p /srv/salt/{base,dev,test,prod} [root@slave ~]$mkdir -p /srv/salt/{base,dev,test,prod}
systemctl restart salt-master systemctl restart salt-mion 注意需要重新接受秘钥
[root@master /srv/salt/base]$cat nginx.sls
nginx-install:
pkg.installed:
- name: nginx
nginx-service:
service.running:
- name: nginx
- enable: True
salt-cp "*" /srv/salt/base/nginx.sls /srv/salt/base/
第一条命令使用pkg.install 安装命令,相对于运行了yum install ,而此时state模块会判断nginx是否安装了,
如果没有安装就进行安装,安装了就什么都不做
状态描述都会遵循这个原则,只有检测到真实状态和所需状态不一致就会执行此功能,这种性质叫做幂等性
#调用state模块,执行nginx.sls文件
[root@master /srv/salt/base]$salt '*' state.sls nginx
saltstack两大数据管理中心 grains(静态采集数据) 与pillar(动态采集数据)
pillar与Grains对比 类型 数据采集方式 应用场景 定义位置 Grains 静态 minion启动时收集 数据查询 目标选择 配置管理 minion Pillar 动态 master进行自定义 目标选择 配置管理 敏感数据 master
grains
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 '*' grains.ls #列出所有grains方法
salt '*' grains.item key1 key2 key3
salt '*' -G
salt "*" grains.items #采集所有minion机器的硬件信息,返回字典数据,key和value salt "*" grains.item osfullname #通过item方法,通过key,返回单独的value salt "*" grains.item ipv4 salt "*" grains.item ipv4 os hostname #支持多key的方式查看信息 #通过-G参数,指明是grains模块,匹配到所有的 操作系统是7系列的机器,然后执行命令 salt -G 'osrelease:7*' cmd.run "echo 'i am from master....' > /tmp/salt.txt"
#定位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
#自定义设置granis数据 salt "*" grains.setval my_class s14 #
删除自定义grains的值 salt "*" grains.delval my_class
#如果想永久删除这个key,需要删除minion底下的/etc/salt/grains文件
Pillar
#设置数据 [root@master 192.168.11.72 ~]$salt 'slave' grains.setval cpu_num 8
[root@master 192.168.11.72 ~]$salt 'slave' grains.setval cpu_info '["Intel","Xeon","10"]'
#查询数据 [root@master 192.168.11.72 ~]$salt 'slave' grains.item cpu_num
在master端设置Grains静态数据,原理会将此数据添加到minion服务器的配置文件的/etc/salt/grains [root@slave 192.168.11.71 ~]$cat /etc/salt/grains cpu_num: 8
因此Grains数据写入配置文件后,重启salt-minion服务,数据也不会丢失
想要删除可以通过grains.delval命令删除,或者去minion的配置文件删除配置一样完成操作(或者删除文件)
1.方法一,清空值
[root@master 192.168.11.72 ~]$salt 'slave' 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
检查结果删除成功
Pillar也是saltstack组件中非常重要的组件之一,称作数据管理中心,经常配合states在大规模的配置管理中使用。 Pillar是动态的,存储在master端,提供和给minion端 Pillar在SaltStack中主要的作用是存储和定义配置管理中需要的一些数据,比如软件版本号,用户账号密码等,保证敏感数据不被其他minion看到 存储格式与Grains类似,都是YAML格式 在master配置文件中有一段Pillar settings选项专门定义Pillar的参数
cat /etc/salt/master #此配置代表pillar的工作根目录,在/srv/pillar下,然后可以新建sls文件 #pillar_roots: # base: # - /srv/pillar
mkdir -p /srv/pillar #指定环境,标记,引用packages.sls vim /srv/pillar/top.sls base: '*': - packages vim /srv/pillar/packages.sls nginx: packages-name: nginx version: 1.12.2
port: 80
user: root
检查我们设置的pillar值 [root@master 192.168.199.155 /srv/pillar]$salt '*' pillar.item nginx slave: ---------- nginx: ---------- packages-name: nginx port: user: root version: 1.12.2
Python API调用SaltStack
SaltStack本身提供salt(usr/bin/salt)来交互管理,但是去服务器上敲命令肯定不是一个长远之计,这时候python就体现了nb的功能。 Python API就是给Python提供的API使用,需要在SaltStack master上运行
--------------------------------------------------
import salt.client
local = salt.client.LocalClient()# 只能在salt master上使用
local.cmd('*','cmd.run',['hostname'])
----------------------------------------------------
import salt.config #导入salt配置模块
m_opts=salt.config.client_config('/etc/salt/master') #读取minion配置文件,得到字典数据,通过字典方法可以查看信息
ret=local.cmd_iter('*','test.ping')# 逐条返回结果, 迭代器 local.cmd('*','service.status',['nginx'])