Salt 组件
Salt Master,中心管理系统。此系统用于将命令和配置发送到在受管系统上运行的 Salt minion。
Salt Minions,被管理的系统。该系统运行 Salt minion,它从 Salt master 接收命令和配置。
Exection Modules,从命令行针对一个或多个受管系统执行临时命令。 对以下管理场景有帮助:实时监控,状态和盘点;一次性命令和脚本;部署关键更新。
States,一种系统配置的声明性或命令式表示。
Grains,系统变量。 Grains 是有关底层受管系统的静态信息,包括操作系统,内存和许多其他系统属性。 您还可以为任何系统定义自定义 grains。
Pillar,用户定义的变量。 这些安全变量被定义并存储在 Salt Master 中,然后使用目标“分配”给一个或多个 minions。 pilla 数据存储诸如端口,文件路径、配置参数和密码之类的值。
Top File,将 states 和 pilla 数据与 Salt minions 匹配。
Runner,在 Salt master 上执行的模块,用于执行支持任务。 Salt runners 报告作业状态、连接状态、从外部 API 读取数据,查询连接的 Salt minions 等。例如,Orchestrate 运行器协调跨多个系统的配置部署。
Returners,将 Salt minions 返回的数据发送到另一个系统,例如数据库。 Salt Returners 可以在 Salt minion 或 Salt master 上运行。
Reactor,在 SaltStack 环境中发生特定事件时触发相应的响应。
Salt SSH,在没有部署 Salt minion 的系统上通过 SSH 运行 Salt 命令。
Salt 各组件的具体使用会在以后的文档中逐步介绍。
Salt 架构模式
Salt 多种运行模式。
master less,无 master 模式下,salt 进行自管理。
agent less,无 minion 模式下进行远程管理,类似 Ansible 。
c/s ,最常用模式,也会因 IT 架构衍生出 proxy 代理、syndic 代理。
Salt 的配置文件默认位于 /etc/salt/,FreeBSD 系统例外,配置文件位于 /usr/local/etc/salt。
Salt Agentless 模式,无 minion 运行
Salt 可以在远程主机没有安装 minion 的情况下通过 salt-ssh 命令调用 ssh 连接并操作远程服务器。
在这种情况下,salt-master 进程也无需启动。
在蓝桥云课环境下,我们使用了 pip3 进行安装,所以无需单独安装 salt-ssh。如果使用 yum 或者 apt 方式安装,需要额外进行 yum install salt-ssh 或者 apt install salt-ssh 安装模块。
agentless 模式运行流程
通过 SSH 连接到远程系统。
将 Salt 的瘦版本 agent 部署到临时目录,包括任何必需的文件。
运行指定的命令。
(可选)清理临时目录。
Agentless 模式下运行 Salt,依赖 ssh 进行连接,所以执行效率会低于 C/S 模式。
roster 文件
默认情况下,Salt 使用 YAML 文件来存储 agentless 系统的连接细节,称为 roster(字面含义为名册)。
一个基本的 roster 文件包含一个 ID,一个主机和一个用户的信息:
# 文件格式类似如下
ID:
host: [IP or DNS name]
user: [username]
修改 master 配置文件
编辑文件:/etc/salt/master,添加如下内容:
# master必须通过SSH去连接访问minion,roster 配置文件用来保存主机信息
roster_file: /etc/salt/roster
# salt-ssh 操作的日志文件,如果没有 /etc/salt/log 目录,请手动创建
# ssh_log_file: /etc/salt/log/salt-ssh.log
# salt-ssh 提供默认参数
roster_defaults:
user: root
sudo: True
# 使用 user home 目录下的key进行登录认证
ssh_use_home_key: True
# 指定 Salt 文件服务的根目录,调用时使用 salt://
file_roots:
base:
- /etc/salt/srv/salt/base
创建 file_roots 目录:
mkdir -p /etc/salt/srv/salt/base
Roster 配置主机信息
文件路径 /etc/salt/roster。
Group1: # 组名
host: localhost # 主机地址
user: root # 登录用户名
priv: /root/.ssh/id_rsa # 使用私钥
测试前,需要先 生成免密登录的私钥。
mkdir ~/.ssh
# 生成私钥文件
ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa -q
# 复制文件
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
测试 salt-ssh 操作,发送 ping 命令。
salt-ssh '*' test.ping -i
注意:第一次执行 ssh 操作,需要 -i 参数,否则会因 known_hosts 问题报错。
salt-ssh 调用 state 组件
state 组件描述了目标服务器该保持状态,调用该组件去连接服务器安装 state 描述的方案进行操作。
新建文件:/etc/salt/srv/salt/base/redis.sls。
# 该 sls 文件声明远程服务器应该安装 python-redis模块,安装并启动 redis
# 文件具体格式及声明方式后续文档会详细讲解,现在只是测试 salt-ssh 功能
redis: pip.installed
redis-server:
pkg:
- installed
service.running:
- require:
- pkg: redis-server
执行命令。
# 参数 redis,salt 会查找 file_roots 目录下对应同名的 .sls
salt-ssh '*' state.apply redis -i
Salt masterless,无 master 环境,独立运行 minion
在 Salt 的无 master 环境下,minion 可以执行的任务。
在系统上使用 salt-call 命令而不与主机连接。
无 Master 的 states 管理,完全从当地的文件运行 states。
在无 master 模式下运行 Salt 时,请勿运行 salt-minion 守护进程。 否则,它将尝试连接到 Master 并失败。
salt-call 命令是独立的,不需要 salt-minion 守护进程。
salt-call 使用
salt-call test.ping --local
salt-call 命令调用 salt-call。
test.ping 其中 test 为模块名称,ping 为模块下功能名称。
--local 指定为本地调用。
如果在无 master 环境中使用 states 模块,需要在 /etc/salt/minion 文件配置 file_roots 参数。
file_roots:
base:
- /etc/salt/srv/salt/base
执行命令
salt-call state.apply redis --local
蓝桥云课环境为 Docker ,系统自带的服务管理模块无法使用,命令执行会有错误输出,但不会影响服务启动。
如果不想每次执行指定 --local,可以修改 /etc/salt/minion 文件,将 file_client 修改为 local。
# file_client: local
# 该参数默认为 remote,修该为 local
# salt 主要使用 c/s 架构,考虑到参数的影响,非必要参数大家不要修改
Salt C/S 架构
salt c/s 架构是最常用的,在该种模式下,salt 可以对上万台服务器进行部署和管理。以后的文档内容基本也将围绕 c/s 模式展开。
master 配置
以下是基本的 master 配置项,其余更多项目参数会在具体章节中使用。
interface
服务将要绑定的本地网络接口,必须是 IP 地址。
interface: 0.0.0.0
publish_port
设置消息发布接口使用的网络端口。
publish_port: 4505
master_id
在发布作业中传递给 minions 的 master id。 这用于 MultiSyndics 将作业返回给正确的发出请求的 master 服务器。
master_id: MasterOfMaster
注意:如果还使用到了 syndic 服务,则这必须与配置 syndic 的字符串相同。
user
用来运行 salt master 进程的系统用户。
user: root
ret_port
数据返回服务使用的端口,这是 Salt 用来接收执行返回数据和命令执行数据的服务。
ret_port: 4506
pki_dir
存放 pki 密钥的目录。
pki_dir: /etc/salt/pki/master
auto_accept
自动接受所有 minion 的认证请求,默认为 False 。
auto_accept: False
keep_jobs
设置保留旧作业信息的小时数。 请注意,将此选项设置为 0 会禁用缓存清理程序。
keep_jobs: 24
以上是 salt-master 配置文件中常见的几个,后续如果有更多需要修改,我们会单独提到。
minion 配置
以下是基本的 minion 配置项,其余更多项目参数会在具体章节中使用。
master
指定 master 服务器地址
master: 127.0.0.1
# 多master环境可以指定 master 列表
master:
- address_1
- address_2
master_type
定义 master 的服务类型, 可以是 str, failover, func 或者 disable.
如果此选项设置为故障转移,则 master 选项必须定义为一个 master 服务地址的列表。 然后,minion 将会按照列表中指定的顺序尝试每个 master,直到它成功连接。 还必须设置 master_alive_interval,这决定了 minion 将验证 master 的存活的频率。
master_type: failover
master_port
指定 master 服务的端口,注意这需要与 Salt Master 服务器上的 ret_port 选项一致。
master_port: 4506
publish_port
指定 master 发布服务器的端口,这需要与 Salt master 上的 publish_port 选项一致。
publish_port: 4505
root_dir
此目录将会被预先附加到以下选项的前面:pki_dir,cachedir,log_file,sock_dir 和 pidfile。
root_dir: /
pki_dir
指定存放 minion 的公私密钥的路径。
pki_dir: /etc/salt/pki/minion
id
明确声明此 minion 使用的 id。 由于 Salt 使用分离的 id,因此可以在同一台机器上运行多个 minions 但具有不同的 id。
id: shiyanlou
minion_id_caching
当 minion 配置中没有静态定义 minion 的 id 时,将 minion id 缓存到文件中。 当从系统中自动获取 minion id 的方案改变时,此设置可防止潜在问题,这可能导致 minion 失去与 master 的连接。 要关闭 minion id 缓存,请将此配置设置为 False。
minion_id_caching: True
grains
静态地为 minions 定义一些 grains 变量。
grains:
roles:
- webserver
- memcache