saltstact远程运维工具
saltstack远程运维工具
saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统。
作用
早期运维人员会根据自己的生产环境来写特定脚本完成大量重复性工作,这些脚本复杂且难以维护。系统管理员面临的问题主要是1、系统配置管理,2、远程执行命令,因此诞生了很多开源软件,系统维护方面有fabric、puppet、chef、ansible、saltstack等,这些软件擅长维护系统状态或方便的对大量主机进行批量的命令执行。
salt灵活性强大,可以进行大规模部署,也能进行小规模的系统部署。salt的设计架构适用于任意数量的服务器,从少量本地网络系统到跨越数个数据中心,拓扑架构都是c/s模型,配置简单。
不管是几台、几百台、几千台服务器,都可以使用salt在一个中心节点上进行管控,灵活定位任意服务器子集来运行命令。
Salt是python编写的,支持用户通过python自定义功能模块,也提供了大量的python API接口,用户可以根据需要进行简单快速的扩展。
salt部署基本架构
在安装salt之前,先理解salt架构中各个角色,主要区分是salt-master和salt-minion,顾名思义master是中心控制系统,minion是被管理的客户端。
salt架构中的一种就是master > minion。
在远程执行系统中,salt用python通过函数调用完成任务。
运行salt的依赖包
python
zeromq
pyzmp
pycrypto
msgpack-python
yaml
jinja2
saltstack安装
1 环境准备
准备两台机,一个做主服务器,一个做客户机
master: 10.0.3.82
minion: 10.0.3.85
2 环境准备2
# 1 确保两台机器能够正常通信(ping)
# 2 关闭两台机器的防火墙
# 查看防火墙
systemctl status firewalld
getenforce
# 关闭防火墙
systemctl stop firewalld
setenfrce 0
# 3 修改两台机器的主机名(master/minion)
# 4 在/etc/hosts文件添加对方机器的主机名与IP的对应关系
# 5 在两台机器上ping对方的主机名,能够连通即可
3 安装saltstack
salt软件包需要epel源的支持下载
EPEL的全称叫 Extra Packages for Enterprise Linux 。EPEL是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上了 EPEL之后,就相当于添加了一个第三方源。
# 1 下载官方源和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
# 2 清理缓存与生成新缓存
yum clean all # 清空缓存
yum makecache # 生成yum缓存
# 3 安装
# 安装salt-master(10.0.3.82上面装)
yum install salt-master -y
# 安装salt-minion(10.0.3.85上面)
yum install salt-minion -y
安装好salt之后开始配置,salt-master默认监听两个端口:
4505 publish_port 提供远程命令发送功能
4506 ret_port 提供认证,文件服务,结果收集等功能
# 确保客户端可以通信服务器的此2个端口,保证防火墙允许端口通过。因此在测试环境直接关闭防火墙。
salt-master的配置文件是/etc/salt/master
salt-minion的配置文件是/etc/salt/minion
# 配置文件中包含了大量可调整的参数,这些参数控制master和minion各个方面
4 准备master和minion端的配置文件
master端vim /etc/salt/master
interface: 0.0.0.0
publish_port: 4505
user: root
worker_threads: 5
ret_port: 4506
pidfile: /var/run/salt-master.pid
log_file: /var/log/salt/master
auto_accept: False
#### 这里为注释 ####
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,如果不用确认直接通过则为True,默认为false
auto_accept: False
minion端vim /etc/salt/minion
master: master
master_port: 4506
user: root
id: slave # id可以自定义
acceptance_wait_time: 10 # minion等待master接受认证的时间
log_file: /var/log/salt/minion
5 分别启动master端和minion端
systemctl start salt-minion
systemctl start salt-master
6 确认salt的端口信息
systemctl status salt-minion / salt-master
# 在master上,可以看到4505和4506两个端口
# 在minion上,确认salt-minion服务启动成功即可
saltstack基本使用
[root@linux-node1 ~]#salt-key -L
Accepted Keys: #已经接受的key
Denied Keys: #拒绝的key
Unaccepted Keys:#未加入的key
Rejected Keys:#吊销的key
#常用参数
-L #查看KEY状态
-A #允许所有key
-D #删除所有key
-a #认证指定的key
-d #删除指定的key
-r #注销掉指定key(该状态为未被认证)
#在master端/etc/salt/master配置
auto_accept: True #如果对Minion信任,可以配置master自动接受请求
1 在master上接收minion的秘钥(*)
# 1.查看
salt-key -L
# 2.接收
salt-key -a 客户机名
salt-key -A # 接收所有客户机
# 3.在master上查看客户机的密钥
salt-key -f qishi4minion
# 4.在minion上查看自己的密钥
salt-call --local key.finger
# 5.删除客户机
salt-key -d 客户机名
salt-key -d salt1-minion.example.com -y
salt-key -D # 删除所有客户机
salt-key -D -y
2 在master上使用命令管理minion端(*)
test(模块)
远程执行命令模块
cmd是超级模块,所有shell命令都能执行
# 1 使用cmd.run发送并执行命令
salt "*" cmd.run "hostname"
# 2 测试客户机连通
salt "*" test.ping
# 3 测试客户机输出信息
salt '*' test.echo '你好~'
# 4 给客户机安装并启动nginx
salt "*" cmd.run "yum install -y nginx"
salt "*" cmd.run "systemctl start nginx"
# 5 专门用来安装软件的命令
salt "*" pkg.install "mysql"
salt "*" pkg.remove "mysql"
salt '*' pkg.version "mysql"
# 6 专门用来管理服务的命令
salt '*' service.start "nginx"
salt '*' service.stop "nginx"
salt '*' service.status "nginx"
salt '*' service.restart "nginx"
# 7 列出所有salt的模块命令
salt 'slave' sys.list_modules
3 yaml语法
# yaml语法解释
slave:
- acl
- aliases
- alternatives
- archive
- artifactory
{
"slave": ["acl", "aliases"....]
}
yaml
first_key:
second_key:second_value
second_key:second_value
3.1yaml介绍
在学习saltstack过程中,第一要点就是States编写技巧,简称SLS文件。这个文件遵循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!!!
4 salt命令格式
1.全局匹配
[root@linux-node1 ~]$salt '*' test.ping
slave:
True
Linux通配符
* 代表任意字符,或空字符串
? 代表一个字符,不可以为空
[a-z] [0-9] 代表任何一个小写字母
[root@linux-node1 ~]$salt 'slav?' test.ping
slave:
True
[root@linux-node1 ~]$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 'slave' sys.doc grains # 查看grains的命令用法
1 采集静态信息
# 获取单个信息, 使用空格隔开(重点)
salt "*" grains.item ip4_interfaces gpus
salt '*' grains.item os id host
# 获取所有信息(重点)
salt "*" grains.items
#定位系统为centos的机器
salt -G 'os:CentOS' test.ping
# 定位系统版本为7以上的机器
salt -G 'osrelease:7*' test.ping
2 自定义设置grains的相关信息
背景: 如果我们想在获取的grains信息里面再去增加一些相关信息的话,就可以使用此功能
# 1. 设置客户机的grains信息里面添加cpu_num为8的一条信息
salt 'qishi4minion' grains.setval cpu_num 8
# 2. 查看相关信息
salt "qishi4minion" grains.item cpu_num
# 3. 在客户机上查看配置文件验证
cat /etc/salt/grains
# 4. 删除信息
salt 'qishi4minion' grains.delval cpu_num
# 5. 在客户机的配置文件上面去删除
vim /etc/salt/grains
# 删除配置文件
3. 数据管理中心之Pillar组件
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
默认pillar的工作目录在/srv/pillar目录下,执行如下代码
mkdir -p /srv/pillar
#指定环境,标记,引用packages.sls和services.sls
vim /srv/pillar/top.sls
base:
'*':
- packages
- services
vim /srv/pillar/packages.sls
nginx:
packages-name: nginx
version: 1.12.2
port: 80
user: root
检查我们设置的pillar值
[root@master 10.0.0.5 /srv/pillar]$salt '*' pillar.item nginx
slave:
----------
nginx:
----------
packages-name:
nginx
port:
80
user:
root
version:
1.12.2
Pillar与Grains对比
pillar与Grains对比
类型 数据采集方式 应用场景 定义位置
Grains 静态 minion启动时收集 数据查询 目标选择 配置管理 minion
Pillar 动态 master进行自定义 目标选择 配置管理 敏感数据 master
Python API调用SaltStack
SaltStack本身提供salt(usr/bin/salt)来交互管理,但是去服务器上敲命令肯定不是一个长远之计,这时候python就体现了nb的功能。
Python API就是给Python提供的API使用,需要在SaltStack master上运行
python2中的例子
[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> # 可以把localfor循环打印看
>>> local.cmd('*','cmd.run',['hostname']) # 向所有minion发送命令
{'slave': 'slave'}
1 在客户机上使用python的salt模块实例化一个客户机管理对象
import salt.client
local = salt.client.LocalClient()
local.cmd('*','cmd.run',['hostname']) # 向所有minion发送命令
# 上面这个python代码和salt命令基本相似: salt "*" cmd.run "hostname"
2 通过API获取客户机的配置文件
# 1 获取master配置文件
import salt.config #导入salt配置模块
m_opts=salt.config.client_config('/etc/salt/master') #读取salt配置文件,得到一个字典数据
m_opts
# 2 获取minion配置文件
import salt.client
salt.config.minion_config('/etc/salt/minion')
3 逐条返回结果,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}}
4 菲波那切数列
local.cmd('liu_slave', 'test.fib', [10])
liu_slave:
|_
- 0
- 1
- 1
- 2
- 3
- 5
- 8
- 2.86102294922e-06
5 检查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'])
6 启停minion的服务,如nginx
>>> local.cmd('*','service.stop',['nginx'])
{'slave': True}
>>> local.cmd('*','service.status',['nginx'])
{'slave': False}
>>> local.cmd('*','service.start',['nginx'])
{'slave': True}