本页内容
- 准备工作
- 在 Salt Master 上配置 Firewalld
- 添加 Salt 软件仓库
- 安装并配置 Salt Master
- 安装并配置 Salt Minion
- 将 Salt Minion 注册到 Salt Master
- Salt State 模块基础用法(通过 cmd 模块运行任意命令、通过 pkg 模块管理软件包与仓库、通过 service 模块管理服务)
- 创建第一个 Salt State
- 总结
- 通过 cmd 模块运行任意命令
- 通过 pkg 模块管理软件包与仓库
- 通过 service 模块管理服务
Salt(又称 SaltStack)是一个开源的 IT 自动化框架,允许管理员直接向多台机器远程执行命令。Salt 主要使用 Python 编写,并采用 Master 与 Minion 架构。SaltStack master 是 Salt 配置管理的中央控制器,而 Minion 则是受 SaltStack Master 管理的服务器,你也可以将 minion 称作目标服务器。
SaltStack master 默认运行在 Linux 操作系统上,但 minion 可用于任何操作系统。SaltStack 是自动化部署、远程任务执行以及基础设施即代码(IaC)方面革命性的配置管理工具。SaltStack 还可用于配置多台基础设施服务器,包括物理机、虚拟机以及云服务器。
本教程将向你展示如何在 AlmaLinux 9 服务器上安装 Salt。你还将学习 Salt 模块的基础用法,并创建第一个 Salt state 项目。在本例中,你将创建一个用于安装 LEMP Stack 的 Salt state 项目。
准备工作
开始本指南前,请确保你具备以下条件:
- 3 台 AlmaLinux 9 服务器。
- 一个具备 sudo 管理员权限的普通(非 root)用户。
- SELinux 状态为 Permissive 或 Disabled。
在 Salt Master 上配置 Firewalld
在安装 Salt 之前,你必须在 Salt Master 服务器上开放端口 4505 和 4506,Salt Minion 将使用这两个端口连接 Salt Master。为此,你将使用 Firewalld。
执行以下命令,为 Salt Master 服务器开放端口 4505 和 4506。
sudo firewall-cmd --zone=public --permanent --add-port={4505,4506}/tcp
现在重新加载 firewalld 使配置生效,然后使用以下命令验证 firewalld 已开放的端口列表。
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
运行命令后,端口 4505 和 4506 已添加到 firewalld。

添加 Salt 软件仓库
Salt 软件包可在官方 Salt 仓库中获取。现在,你将把 Salt 仓库添加到你所有的 AlmaLinux 服务器上,包括 Salt Master 和 Minion。
执行以下命令导入 Salt 的 GPG 密钥。
sudo rpm --import https://repo.saltproject.io/salt/py3/redhat/9/x86_64/SALT-PROJECT-GPG-PUBKEY-2023.pub
现在使用以下命令将 Salt 仓库下载到你的系统中。
curl -fsSL https://repo.saltproject.io/salt/py3/redhat/9/x86_64/latest.repo | sudo tee /etc/yum.repos.d/salt.repo

添加 Salt 的 GPG 密钥和仓库后,运行以下 dnf 命令,验证系统中可用的仓库列表并下载所有可用仓库的元数据。
sudo dnf repolist
sudo dnf makecache
假设命令执行成功,你收到的输出应与以下内容类似:

安装并配置 Salt Master
添加 Salt 仓库后,你将安装并配置 salt-master 软件包到主 Salt Master 服务器。
使用以下 dnf 命令安装 salt-master 软件包。在提示时输入 y 继续安装。
sudo dnf install salt-master

安装完成后,使用以下 nano 编辑器命令打开 Salt 默认配置文件 /etc/salt/master。
sudo nano /etc/salt/master
将默认的 interface 选项改为你的本地 IP 地址,将 id 选项改为你的服务器主机名。在本例中,Salt Master 服务器配置的本地 IP 地址为 192.168.5.50,主机名为 master。
interface: 192.168.5.50 id: master
完成后,保存并关闭文件。
接下来,运行以下 systemctl 命令启动并设置 salt-master 服务开机自启。
sudo systemctl start salt-master
sudo systemctl enable salt-master

最后,执行以下命令验证 salt-master 服务,确保其正在运行。
sudo systemctl status salt-master
操作成功后,显示的输出应为 active (running),表明 salt-master 服务正在运行。

安装并配置 Salt Minion
配置好 Salt Master 后,下一步是安装 salt-minion 并配置 Minion 服务器以连接到 Salt Master。
运行以下 dnf 命令在 Minion 服务器上安装 salt-minion 软件包。输入 y 确认安装。
sudo dnf install salt-minion

安装完成后,使用以下 nano 编辑器命令打开 Salt 默认配置文件 /etc/salt/minion。
sudo nano /etc/salt/minion
在 master 选项中,填写 Salt Master 的 IP 地址。
master: 192.168.5.50
在 interface 选项中填写 minion 的本地 IP 地址,在 id 选项中填写服务器主机名。
interface: 192.168.5.20 id: minion1
完成后保存文件并退出编辑器。
接下来,运行以下 systemctl 命令启动并设置 salt-minion 服务开机自启。
sudo systemctl start salt-minion
sudo systemctl enable salt-minion

salt-minion 服务启动后,使用以下命令进行验证。
sudo systemctl status salt-minion
如果一切顺利,输出应为 active (running),确认 salt-minion 服务正在运行。

Registering Salt Minions to Salt Master
此时 salt-minion 服务正在运行。随后,Salt Minion 会发送请求注册到 Salt Master。要完成 Salt Minion 注册,你必须在 Salt Master 上接受其指纹密钥。
切换到 Salt Master,运行以下 salt-key 命令获取指纹密钥列表。
salt-key --finger-all
这里显示的是 Salt Minion 服务器 minion1 和 minion2 的指纹,它们仍处于「Unaccepted Keys」状态。

运行以下命令,接受 minion1 和 minion2 两台服务器的 Salt Minion 密钥。
salt-key -a minion1
salt-key -a minion2
在提示时输入 Y 接受密钥,你将看到类似「Key for minion minion1/2 accepted」的输出。

现在再次使用以下命令验证 Salt Master 上的指纹密钥列表。
salt-key --finger-all
这里,minion1 和 minion2 服务器的 Salt Minion 指纹已出现在 Accepted Keys(已接受密钥)部分。

现在你可以通过 Salt 命令行从 Salt Master 控制 Salt Minion 服务器。
执行以下 salt 命令,验证 Salt Master 与 Minion 之间的连接,并查看 Minion 服务器上的 Salt 版本。
salt '*' test.ping
salt '*' test.version
如果 Salt Master 与 Minion 之间连接成功,将显示输出 True。同时,你也可以看到已安装 Salt 3006.4,这是 test.version 参数的结果。

此外,你可以像下面这样使用 salt 命令指定目标 minion。
salt minion1 test.ping
Salt State 模块基础用法
在下面的章节中,你将学习如何使用 Salt state 模块管理 Minion 服务器。你将了解部分 Salt state 模块,例如用于运行任意 Linux 命令的 cmd、用于管理软件包与仓库的 pkg,以及用于管理服务的 service 模块。
通过 cmd 模块运行任意命令
执行以下命令,通过 cmd state 模块运行特定的 Linux 命令。在本例中,你将通过 uname -a 命令查看 Linux 内核信息。
salt '*' cmd.run 'uname -a'

通过 pkg 模块管理软件包与仓库
现在,使用以下 pkg state 模块管理 Minion 服务器上的软件包与仓库。
通过 pkg.list_repos 查看仓库列表,然后通过 pkg.refresh_db 更新仓库。
salt '*' pkg.list_repos
salt '*' pkg.refresh_db
你也可以使用以下 pkg.list_upgrades 参数查看可用的软件包更新列表。
salt '*' pkg.list_upgrades
要安装特定软件包,使用以下 pkg.install。
salt '*' pkg.install vim

通过 service 模块管理服务
接下来,你可以使用 service state 模块管理 Minion 服务器上的服务。
使用 service.available 参数确认服务在目标服务器上可用;或使用 service.enabled 参数确认目标服务已启用;也可以使用 service.get_running 确认服务正在运行。
salt '*' service.available chronyd
salt '*' service.enabled chronyd
salt '*' service.get_running

最后,你还可以使用 service.execs 参数查看某个特定服务所执行的服务启动命令。
salt '*' service.execs
创建第一个 Salt State
在本节中,你将创建第一个 Salt state 项目,用于向目标 Minion 服务器安装 LEMP Stack(Nginx、MariaDB 和 PHP-FPM)。
在继续之前,执行以下命令启用仓库模块,以便后续安装特定版本的软件包。
salt '*' cmd.run 'sudo dnf module enable nginx:1.22 -y'
salt '*' cmd.run 'sudo dnf module enable php:8.1 -y'

现在,新建一个配置目录 /srv/salt/,用于存放你的 Salt state。
mkdir -p /srv/salt/
执行以下命令,新建项目目录 /srv/salt/lemp 以及 init.sls 文件。
mkdir -p /srv/salt/lemp
nano /srv/salt/lemp/init.sls
完成后保存并关闭文件。
lemp_stack: pkg.installed: - pkgs: - nginx - mariadb-server - php - php-fpm nginx: service.running: - enable: True - reload: True mariadb: service.running: - enable: True - reload: True php-fpm: service.running: - enable: True - reload: True
Save and close the file when you're finished.
命令执行后,你将得到类似下图的详细配置。
sudo salt * state.show_sls lemp
现在运行以下命令,将 lemp state 应用到 Minion 服务器。

你将看到自动安装生成的报告。在本例中,两台 Minion 服务器上的 LEMP Stack 软件包均安装成功。
sudo salt '*' state.apply lemp
下面是服务运行且已启用时的详情。

总结
