salt之抄huihao

salt

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加密

img

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- 数据有效载荷和小兵返回(文件服务/返回数据)

    仅连接以传递数据

 

Minion 订阅出版物

默认情况下,master 绑定到所有可用的网络接口,然后监听端口45054506.

 

/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 解密。

盐 PKI 模型

调用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 后:

  1. 使用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...
  2. 检查集群连接和版本:

    salt '*' test.version

    示例响应:

    minion1:
    2019.2.3

Salt grains

文档

  1. Grains是SaltStack的一个组件,存放在SaltStack的minion端。

  2. 当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。

  3. 由于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

runner子系统提供在salt master运行的salt模块(还记得执行和状态模块在目标服务器minion异步执行吗,不是在salt master)。 Runners可用功能为列出作业状态,实时查看事件,管理salt文件服务器,查看salt mine数据,发送wake-on-lan到minions,调用webhooks和发送其它http请求等。

我们通过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

  1. top能实现一组机器部署不同业务环境,达到相互协调配合的工作。

  2. top文件包含了计算机之间的映射关系以及配置文件角色的文件。

  3. 默认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

top文件内容示例

 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
 

 

posted @ 2022-09-22 14:59    阅读(30)  评论(0编辑  收藏  举报