salt之抄huihao
https://docs.saltproject.io/en/latest/py-modindex.html
https://docs.saltproject.io/en/latest/contents.html
Salt 系统是一个基于 Python 的开源远程执行框架,用于配置管理、自动化、供应和编排。
salt 的特点
-
因为saltstack时基于python开发的C/S架构配置管理工具
-
底层使用ZeroMQ消息队列pub/sub方式通信
-
使用SSL证书签发的方式进行认证管理,传输采用AES加密
ZeroMQ介绍
ZeroMQ是由一套组件组成,内封装的有网络通信,消息队列,线程调度等功能并向上层提供了简洁的API接口,应用程序通过加载库文件,调用API函数来实现高性能网络通信。
ZeroMQ的常用的两种模型
-
请求回应模型 由请求端发起请求,然后等待回应端应答。一个请求必须对应一个回应,从请求端的角度来看是发-收配对,从回应端的角度是收-发对。跟一对一结对模型的区别在于请求端可以是1~N个。该模型主要用于远程调用及任务分配等。Echo服务就是这种经典模型的应用。
-
发布订阅模型(这也时saltstack的主要的模型) 发布端单向分发数据,且不关心是否把全部信息发送给订阅端。如果发布端开始发布信息时,订阅端尚未连接上来,则这些信息会被直接丢弃。订阅端未连接导致信息丢失的问题,可以通过与请求回应模型组合来解决。订阅端只负责接收,而不能反馈,且在订阅端消费速度慢于发布端的情况下,会在订阅端堆积数据。该模型主要用于数据分发。天气预报、微博明星粉丝可以应用这种经典模型。
saltstack服务架构
在saltstack架构中服务器端叫Master,客户端叫Minion。
在Master和Minion端都是以守护进程的模式运行,一直监听配置文件里面定义的ret_port(接受minion请求)和publish_port(发布消息)的端口。
当Minion运行时会自动连接到配置文件里面定义的Master地址ret_port端口进行连接认证。
saltstack除了传统的C/S架构外,其实还有一种叫做masterless的架构,其不需要单独安装一台 master 服务器,只需要在每台机器上安装 Minion端,然后采用本机只负责对本机的配置管理机制服务的模式。
saltstack四大功能与四大运行方式
saltstack四大功能,分别是:
-
远程执行 (批量执行命令)在master上执行命令时,会在所有的minion上执行。
-
配置管理/状态管理 (描述想到达到的状态,saltstack就会去执行)
-
云管理(cloud) 用于管理云主机
-
事件驱动 被动执行的,当达到某个值会自动触发
saltstack可以通过远程执行实现批量管理,并且通过描述状态来达到某些功能的目的。
saltstack四大运行方式:
-
local本地运行 (masterless模式)
-
master/minion传统方式 这是saltstack的主要模式
-
syndic 分布式
-
salt ssh (agentless模式)
saltstack组件介绍
组件 | 功能 |
---|---|
salt master | 用于将命令和配置发送到在受管系统上运行的Salt minion |
Salt Minions | 从Salt master接收命令和配置 |
Execution Modules | 从命令行针对一个或多个受管系统执行的临时命令。应用场景,例如:1. 实时监控,状态和库存,2. 一次性命令和脚本,3. 部署关键更新 |
Formulas (States) | 系统配置的声明性或命令式表示 |
Grains | Grains是有关底层受管系统的静态信息,包括操作系统,内存和许多其他系统属性。 |
Pillar | 用户定义的变量。这些安全变量被定义并存储在Salt Master中,然后使用目标“分配”给一个或多个Minion。 |
Pillar数据存储诸如端口,文件路径,配置参数和密码之类的值。 Top File | 将Formulas (States)和Salt Pillar数据与Salt minions匹配。 Runners | 在Salt master上执行的模块,用于执行支持任务。Salt runners报告作业状态,连接状态,从外部API读取数据,查询连接的Salt minions等。 Returners | 将Salt minions返回的数据发送到另一个系统,例如数据库。Salt Returners可以在Salt minion或Salt master上运行。 Reactor | 在SaltStack环境中发生事件时触发反应。 Salt Cloud / Salt Virt | 在云提供商/虚拟机管理程序上提供系统,并立即将其置于管理之下。 Salt SSH | 在没有Salt minion的系统上通过SSH运行Salt命令。
salt 部署
master
sudo rpm --import https://repo.saltproject.io/py3/redhat/7/x86_64/latest/SALTSTACK-GPG-KEY.pub
curl -fsSL https://repo.saltproject.io/py3/redhat/7/x86_64/latest.repo | sudo tee /etc/yum.repos.d/salt.repo
sudo yum install salt-master -y
sudo yum install salt-minion -y
sudo yum install salt-ssh -y
sudo yum install salt-syndic -y
sudo yum install salt-cloud -y
sudo yum install salt-api -y
sudo systemctl enable salt-master && sudo systemctl start salt-master
sudo systemctl enable salt-minion && sudo systemctl start salt-minion
sudo systemctl enable salt-syndic && sudo systemctl start salt-syndic
sudo systemctl enable salt-api && sudo systemctl start salt-api
附带api
自签名证书,生产环境可以购买(说明:如果没有salt-call命令,装上salt-minion即可,依赖于该包)
[root@salt-master ~]# salt-call --local tls.create_self_signed_cert
遇到问题,检查依赖如下包。
[root@csjs2ws-control-dev master.d]# pip3 install -U pip setuptools
[root@csjs2ws-control-dev master.d]# pip3 install pyOpenSSL
创建认证用户,并设置密码。用户名:saltapi,密码:fCvCxYdOlOUneYRatUPc GM服访问salt api权限
useradd -M -s /sbin/nologin saltapi
echo 'fCvCxYdOlOUneYRatUPc' | passwd --stdin saltapi
安装salt签名证书,重启salt.
[root@csjs2ws-control-dev master.d]# systemctl restart salt-master
[root@csjs2ws-control-dev master.d]# systemctl restart salt-api
测试,验证login登录,获取token字符串
[root@salt-master ~]# curl -sSk http://127.0.0.1:8811/login \
-H 'Accept: application/x-yaml' \
-d username=saltapi \
-d password=fCvCxYdOlOUneYRatUPc \
-d eauth=pam
通过api执行test.ping测试连通性
[root@salt-master ~]# curl -sSk http://172.16.0.164:8811 \
-H 'Accept: application/x-yaml' \
-H 'X-Auth-Token: 03994a6de3c0786657abd3bb315c78acc62d1ffb'\
-d client=local \
-d tgt='*' \
-d fun=test.ping
通过api执行cmd.run
[root@salt-master ~]# curl -sSk https://127.0.0.1:8811 \
-H 'Accept: application/x-yaml' \
-H 'X-Auth-Token: 515b2d1858836d637874a71be787e0466adb6258'\
-d client=local \
-d tgt='*' \
-d fun='cmd.run' -d arg='uptime'
通过api获取grains信息
[root@salt-master ~]# curl -sSk https://127.0.0.1:8811/minions/salt-minion01 \
-H 'Accept: application/x-yaml' \
-H 'X-Auth-Token: 515b2d1858836d637874a71be787e0466adb6258'
13)使用json格式
[root@salt-master ~]# curl -sSk https://192.168.1.30:8000/minions/salt-minion01 \
-H 'Accept: application/json' \
-H 'X-Auth-Token: 515b2d1858836d637874a71be787e0466adb6258'
总结
salt-api必须使用https,生产环境建议使用可信证书
当salt-api服务重启后原token失效
客户端
sudo rpm --import https://repo.saltproject.io/py3/redhat/7/x86_64/latest/SALTSTACK-GPG-KEY.pub
curl -fsSL https://repo.saltproject.io/py3/redhat/7/x86_64/latest.repo | sudo tee /etc/yum.repos.d/salt.repo
sudo yum install salt-minion -y
sudo systemctl enable salt-minion && sudo systemctl start salt-minion
Salt网络端口
Salt master/minion 模型只需要到 Salt Master 的入站连接。连接是从 minion 建立的,而不是从 master 建立的。
salt-master
为奴才提供两项服务:
-
4505- 事件发布者/订阅者端口(发布作业/事件)
不断查询连接
-
4506- 数据有效载荷和小兵返回(文件服务/返回数据)
仅连接以传递数据
默认情况下,master 绑定到所有可用的网络接口,然后监听端口4505
和4506
.
/etc/salt/master.d/network.conf
# The network interface to bind to
interface: 192.168.10.20
# The Request/Reply port
ret_port: 4506
# The port minions bind to for commands, aka the publish port
publish_port: 4505
进程管理
为了管理salt-minion
返回调用,主线程使用worker_threads
设置线程出工作进程。进程的默认限制是五个进程。最低限度是三个进程。
/etc/salt/master.d/thread_options.conf
worker_threads: 5
minion 配置
/etc/salt/minion.d/master.config
master: 192.168.10.20
/etc/salt/minion.d/id.conf
# 不配置是用主机名
id: rebel_1
密钥交换
Salt中使用了两种类型的键:
-
RSA
-
AES
RSA 密钥是 Salt 使用的身份验证和加密模型的支柱。所有 Salt 守护程序都使用唯一的 RSA 密钥运行。minions 和 master 在第一次启动时会生成 RSA 密钥,然后将它们用于基于 PKI 的身份验证。
这些密钥用于向 Salt Master 验证 AES 密钥,通过加密数据提供安全通信。每个 Minion 都向 Salt Master 提供一个公钥。然后管理员检查、比较并明确接受该密钥。
master 还发送一个旋转的 AES 密钥,用于加密和解密 Salt master 发送的消息。返回的 AES 密钥使用 Salt minion 最初发送的公钥加密,因此只能由同一个 Salt minion 解密。
调用salt-key
查看密钥管理的当前状态:
salt-key
示例响应:
Unaccepted Keys:
db1
Accepted Keys:
web1
web2
Rejected:
badguy
在此示例中,要接受密钥,请运行:
salt-key -a db1
如果有多个要接受且受信任的密钥,您可以一次接受所有密钥:
salt-key -A
也可以单独或批量删除密钥。因为这是一个永久性操作,所以运行该命令将给出 [n/Y] 提示以进行确认。
删除单个键:
salt-key -d web1
示例响应:
The following accepted key is set to be removed:
web1
[n/Y]
删除所有键:
salt-key -D
示例响应:
The following keys are going to be deleted:
web1
web2
[n/Y]
通过过滤器删除键:
salt-key -d 'web*'
示例响应:
The following keys are going to be deleted:
web1
web2
[n/Y]
验证 Salt 安装
成功安装 Salt 后:
-
使用
systemctl
,检查 Salt master 是否正在运行并且没有错误记录:systemctl status salt-master
示例响应:
salt-master.service - The Salt Master Server
Loaded: loaded (/lib/systemd/system/salt-master.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2020-02-04 16:34:55 CST; 17h ago
Docs: man:salt-master(1)
file:///usr/share/doc/salt/html/contents.html
https://docs.saltproject.io/en/latest/contents.html
Main PID: 8727 (salt-master)
Tasks: 32 (limit: 4915)
CGroup: /system.slice/salt-master.service
├─8727 /usr/bin/python2 /usr/bin/salt-master
Feb 04 16:34:55 VM systemd[1]: Starting The Salt Master Server... -
检查集群连接和版本:
salt '*' test.version
示例响应:
minion1:
2019.2.3
Salt grains
-
Grains是SaltStack的一个组件,存放在SaltStack的minion端。
-
当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。
-
由于grains是静态数据,因此不推荐经常去修改它。
列出所有模块
salt '*' grains.ls
查看所有salt minion信息
salt '*' grains.items
取单项的值
salt '*' grains.item ipv4
选择主机时可以使用主机数据
salt -G 'os:CentOS' test.version
salt -G 'cpuarch:x86_64' grains.item num_cpus
更新grains信息
salt '*' saltutil.refresh_modules
Salt Pillar
1.pillar和grains一样也是一个数据系统,但是应用场景不同。
2.pillar是将信息动态的存放在master端,主要存放私密、敏感信息(如用户名密码 等),而且可以指定某一个minion才可以看到对应的信息。
3.pillar更加适合在配置管理中运用。
声明pillar
vim /etc/salt/master
pillar_roots:
base:
- /srv/pillar
mkdir /srv/pillar
定义pillar
cat /srv/pillar/top.sls
base:
'os:CentOS':
- match: grain
- packages
cat packages.sls
{% if grains['fqdn'] == 'salt' %}
salt: master
{% elif grains['fqdn'] == 'salt-client' %}
salt: client
{% endif %}
刷新pillar
salt '*' saltutil.refresh_pillar
查询pillar
salt '*' pillar.items
salt '*' pillar.get key:value default
Salt mine
mine是master通过在minion上执行预先定义的salt.modules
中的函数来收集信息。
使用mine,只需要在mine_functions关键字下面规定需要在minion上执行的函数即可,如果函数有参数也要一起带上。可以通过pillar或者是minion的配置文件去将mine下发给minion。我们采用pillar下发的方式来举例,例如,在master的/srv/pillar/mine_test.sls中创建pillar内容如下
mine_functions:
test.ping: []
network.ip_addrs:
interface: eth1
cidr: 192.168.0.0/16
在/srv/pillar/top.sls
中将这个pillar分发给所有的minion
salt '*' saltutil.refresh_pillar
salt '*' pillar.items
salt '*' mine.valid
salt '*' mine.update
salt 'minion1' mine.get 'minion2' network.ip_addrsv
Salt runner
我们通过salt命令开头执行时,所有的命令master端分发至minion端,由minion端自己执行,如果一个模块在master存在,在minion端不存在,就会出现执行失败的情况。为了解决这个问题,提供salt runners模块,它是将所有的命令在master端执行。
相关命令
salt-run jobs.list_jobs # 列出当前保存在job cache中的历史执行任务
salt-run jobs.lookup_jid jid # 查看历史jid执行结果
salt-run manage.status # 查看minion的状态
salt-run manage.down
salt-run manage.up
salt-run manage.versions # 查看minion的版本
Salt Top file
-
top能实现一组机器部署不同业务环境,达到相互协调配合的工作。
-
top文件包含了计算机之间的映射关系以及配置文件角色的文件。
-
默认top文件被命名为top.sls,总是存在于包含state文件的目录层顶部,这种目录结构被称为目录树。
Top文件包含3个组件:
-
Environment:包含一组状态文件的状态树目录配置系统
-
Target:一组机器将有一组状态适用于他们。
-
State files:应用于target匹配机器的一组state文件列表, 上面3个组件之间的关系; Environment包含Target,Target包含state files
开始使用top文件,每一个environment环境被定义在file_roots这个配置项里面
file_roots:
base:
- /srv/salt
top文件内容定义:
base:
'*':
- core
- edit
在一些生产环境中,它需要不同版本的state状态文件,实现分级部署,譬如测试,预发布,线上等 示例:
file_roots:
1 dev:
2 - /srv/salt/dev
3 qa:
4 - /srv/salt/qa
5 prod:
6 - /srv/salt/prod
View Code
1 dev:
2 'webserver*':
3 - webserver
4 'db*':
5 - db
6 qa:
7 'webserver*':
8 - webserver
9 'db*':
10 - db
11 prod:
12 'webserver*':
13 - webserver
14 'db*':
15 - db