SaltStack主机分组实践

目录


实验简介

实验背景

本实验主要介绍如何给主机进行分组,使用 SaltStack 分组管理 minion,进行批量处理匹配。

实验环境

本次实验环境选择:虚拟机,个人 PC。以下为本优化版在实验虚拟机上逐项核对后的实际环境。

  • 操作系统:openEuler 22.03 LTS(aarch64);Salt 版本:3003.3(三台一致)。

  • master 上执行 salt '*' ... 时,返回结果的主机固定为上述 3 台;各主机返回顺序由并行执行决定,与示例中的先后顺序不同属于正常现象。

实验目的

  • 掌握 SaltStack 中五种 minion 匹配方式
  • 掌握 SaltStack 使用 Grains 来匹配 minion

预备知识

  • 熟悉 Linux 的基本语句、具备基础网络配置知识

通用操作约定(开始实验前请先阅读)

  1. 每次 systemctl restart salt-master 后请等待 5~10 秒再执行 salt 命令。若出现 Message timed out / Salt request timed out,属服务刚重启尚未就绪,用 -t 30(即 --timeout=30)重试即可,例如 salt -t 30 '*' test.ping。所有耗时较长的安装类命令统一加 --timeout=300。
  2. yum 源约定:不得修改 /etc/yum.repos.d/ 下任何 repo 文件,不导入 GPG 公钥,不改动 gpgcheck 配置。若因 GPG 校验导致软件无法安装,一律使用命令级临时绕过:yum -y --nogpgcheck install <包名>。该方式只对本次命令生效,不改变系统配置。
  3. 修改 master 配置前建议先备份:cp /etc/salt/master /tmp/salt_master.bak。

任务一:环境准备

步骤1 查看salt命令参数说明

登录安装好 SaltStack 的主机 master 节点,输入:

[root@master ~]# salt -h

输出(节选,Salt 3003.3 实测):

Usage: salt [options] '<target>' <function> [arguments]

Salt allows for commands to be executed across a swath of remote systems in
parallel, so they can be both controlled and queried with ease.

Options:
  --version             show program's version number and exit
  -V, --versions-report
                        Show program's dependencies version number and exit.
  -h, --help            show this help message and exit
  --saltfile=SALTFILE   Specify the path to a Saltfile. If not passed, one
                        will be searched for in the current working directory.
  -c CONFIG_DIR, --config-dir=CONFIG_DIR
                        Pass in an alternative configuration directory.
                        Default: '/etc/salt'.
...

执行效果:终端打印 Usage: salt [options] '<target>' <function> [arguments] 以及完整的 Options 列表,包含版本、帮助、超时、异步、日志、外部认证和目标匹配等选项。另可单独验证:salt --version 返回 salt 3003.3;salt --versions-report(或 salt -V)返回 Salt 及其依赖库的版本清单。

步骤2 查看salt命令使用方法

# 语法:salt [options] '<target>' <function> [arguments]
# Salt 命令主要由三个主要部分构成:salt '<target>' <function> [arguments]

target:指定哪些 minion,默认的规则是使用 glob 匹配 minion id
Targets 也可以使用正则表达式
Targets 也可以指定列表

function:module 提供的功能,Salt 内置了大量有效的 functions

arguments:通过空格来界定参数

常用的 options(均已在本机 salt -h 中核对存在):

--version             查看 saltstack 的版本号
--versions-report / -V   查看 saltstack 以及依赖包的版本号
-h       查看帮助信息
-c CONFIG_DIR         指定配置文件目录(默认为 /etc/salt/)
-t TIMEOUT            指定超时时间(默认 5s)
--async     异步执行
-v / --verbose    verbose 模式,详细显示执行过程(jid、job 信息)
--username=USERNAME      指定外部认证用户名
--password=PASSWORD      指定外部认证密码
--log-file=LOG_FILE      指定日志记录文件

常用的 target 参数:

-E, --pcre       正则匹配
-L, --list       列表匹配
-S, --ipcidr     CIDR 匹配网段或单个 IP 地址
-G, --grain      grains 匹配
-P, --grain-pcre grains 加正则匹配
-N, --nodegroup  组匹配(使用预定义的 nodegroups)
-R, --range      范围匹配
-C, --compound   综合匹配(复合匹配,指定多个匹配条件)
-I, --pillar     pillar 值匹配

步骤3 使用salt命令查看minion存活状态

[root@master ~]# salt "*" test.ping

输出:

master:
    True
minion1:
    True
minion2:
    True

执行效果:3 台 minion 全部返回 True,说明 master 与 minion 通信正常、密钥已被接受。若刚重启过 salt-master 出现超时,用 salt -t 30 "*" test.ping 重试。


任务二:全局匹配minion

现在为止所有的命令,定位都采用了 ‘*’ 进行匹配。

‘*’ 代表任意字符。在全局匹配的方式中,Salt 匹配字符串的写法基本和 shell 方式相同。

步骤1 使用*进行匹配

*:代表任意字符串,也可以是空字符串

匹配所有的 minion 主机:

[root@master ~]# salt "*" test.ping

输出:

master:
    True
minion1:
    True
minion2:
    True

执行效果:3 台全部命中并返回 True。

步骤2 使用?进行匹配

?:代表一个字符,但不可以为空

匹配 minion1、minion2:

[root@master ~]# salt "minion?" test.ping

输出:

minion1:
    True
minion2:
    True

匹配 master:

[root@master ~]# salt "maste?" test.ping

输出:

master:
    True

执行效果:minion? 只命中 minion1、minion2(master 不符合该模式);maste? 只命中 master。

步骤3 使用[ ] 进行匹配

字符集合,例如 [a-z] 代表任何一个小写字母,[0-9] 代表数字

匹配所有以字母开头、中间为 inion 的主机:

[root@master ~]# salt "[a-z]inion*" test.ping

输出:

minion1:
    True
minion2:
    True

匹配 master:

[root@master ~]# salt "[a-z]as*" test.ping

输出:

master:
    True

执行效果:字符集合 [a-z] 匹配单个小写字母,两条命令分别命中 2 台 minion 主机和 master。

步骤4 使用CIDR匹配minion网段

-S 依据 minion 上报的 ipv4 grains 匹配。本环境三台主机的实验网段为 10.60.10.0/24(master 10.60.10.150、minion1 10.60.10.148、minion2 10.60.10.151)。

# 匹配独立地址
[root@master ~]# salt -S '10.60.10.148' test.ping

输出:

minion1:
    True
# 匹配 CIDR 网段
[root@master ~]# salt -S '10.60.10.0/24' test.ping

输出:

master:
    True
minion1:
    True
minion2:
    True

执行效果:单 IP 只命中 minion1;10.60.10.0/24 命中全部 3 台。可用 salt '*' grains.item ipv4 查看各主机上报的地址(本环境除实验网段地址外,还包含 127.0.0.1 与 192.168.122.1)。

在主机名比较规范的环境中,全局匹配就可以发挥很强大的选择过滤功能来完成远程命令的执行操作。


任务三:正则表达式匹配minion

如果需要执行更为复杂的匹配,比如针对某些 minion 名称的匹配可以使用正则表达式。Salt 使用 Python 的 re 正则表达模块,可以解析正则表达式(PCRE),正则表达式匹配需要配合命令行选项 -E 或 --pcre。

步骤1 完全匹配字母或数字本身

[root@master ~]# salt -E "minion1" test.ping

输出:

minion1:
    True
[root@master ~]# salt -E "min" test.ping

输出:

minion1:
    True
minion2:
    True
[root@master ~]# salt -E "mas" test.ping

输出:

master:
    True

执行效果:正则采用"搜索"语义而非整串相等,min 命中两台 minion 主机,mas 命中 master。

步骤2 以特定字符开头或结尾的匹配方式

[root@master ~]# salt -E "^mini" test.ping

输出:

minion1:
    True
minion2:
    True
[root@master ~]# salt -E ".*on1$" test.ping

输出:

minion1:
    True

执行效果:^mini 匹配以 mini 开头的 minion id;.*on1$ 匹配以 on1 结尾的 minion id,只命中 minion1。

步骤3 表达式匹配方式下全局匹配

[root@master ~]# salt -E '.*' test.ping

输出:

master:
    True
minion1:
    True
minion2:
    True

执行效果:.* 匹配任意 id,效果等同 salt "*" test.ping,3 台全部返回 True。

步骤4 分组匹配的方式

[root@master ~]# salt -E 'minion((1)|(2))' test.ping

输出:

minion1:
    True
minion2:
    True
[root@master ~]# salt -E 'minion((1)|(3))' test.ping

输出:

minion1:
    True

执行效果:分组加 | 实现"或"匹配;因环境无 minion3,第二条命令只命中 minion1。

正则表达式很强大,可以说只有你想不到的但没有它做不到的,善于利用正则表达式能把异常复杂的任务简单化。


任务四:列表匹配

有时候,只想匹配一个指定列表里面的主机并进行远程执行操作,这时可能全局匹配方式和正则表达式方式都无法很好地完成任务,这种情况下可以直接使用 -L 选项进行列表匹配。

步骤1 匹配一个minion主机列表

[root@master ~]# salt -L "minion1" test.ping

输出:

minion1:
    True

步骤2 匹配多个主机列表

[root@master ~]# salt -L "master,minion1,minion2" test.ping

输出:

master:
    True
minion1:
    True
minion2:
    True

执行效果:列表内的主机按逗号分隔,全部命中并返回 True。

步骤3 使用nodegroups名称进行匹配

通常列表匹配的主机都写在 master 的配置文件中,/etc/salt/master 中以 nodegroups 形式出现,包括正则匹配、全局匹配等方式都可以写在配置文件中,然后通过分组匹配选项 -N 加上 nodegroups 名称进行匹配。

配置前必读(原手册写法在本环境不可用):原手册在 nodegroups: 前保留了 1 个空格、子项前保留了 3 个空格,实机验证会导致 Error parsing configuration file: /etc/salt/master - while parsing a block mapping ... did not find expected key,systemctl restart salt-master 失败(服务为 failed),此时所有 salt 命令均不可用。正确写法必须是:nodegroups: 顶格无缩进,子项用 2 个空格缩进。恢复办法:把该段删除或改回正确缩进后再次重启 salt-master。

为保证多次练习可重复执行,本版把 nodegroups 定义写入 master 的配置目录 /etc/salt/master.d/(Salt 会自动加载该目录下的 *.conf,效果与在 /etc/salt/master 的 “Node Groups” 配置块中添加完全相同,且覆盖写入不会造成重复定义)。

# 可选:先备份主配置文件
[root@master ~]# cp /etc/salt/master /tmp/salt_master.bak

[root@master ~]# cat > /etc/salt/master.d/nodegroups.conf <<'EOF'
nodegroups:
  group: 'L@minion1,master'
EOF

[root@master ~]# cat /etc/salt/master.d/nodegroups.conf

输出(文件内容):

nodegroups:
  group: 'L@minion1,master'

等价的手工编辑方式(与原手册一致):执行 vim /etc/salt/master,找到 ##### Node Groups ##### 配置块,把注释掉的 #nodegroups: 改为顶格的 nodegroups:,并在其下以 2 个空格缩进写入 group: 'L@minion1,master'(切勿在 nodegroups: 前留空格),保存退出。两种方式任选其一,不要同时定义两处 nodegroups:。

修改完成后,重启 salt-master:

[root@master ~]# systemctl restart salt-master
[root@master ~]# sleep 10

执行效果:systemctl is-active salt-master 返回 active;等待约 10 秒后 master 恢复正常响应(若首次命令报 Salt request timed out,加 -t 30 重试)。

验证列表分组是否生效:

[root@master ~]# salt -N group test.ping

输出:

master:
    True
minion1:
    True

执行效果:-N group 只命中 L@minion1,master 中列出的 2 台主机,minion2 不在结果中,说明 nodegroups 列表分组已生效。


任务五:Grains匹配

Grain 是 Salt 独有的概念。Grains 是以 key-value 形式存储的数据库,是由 minion 返回给 master 的数据,可以看作 Host 的 metadata(元数据)。

Grains 可以认为是描述 minion 本身固有属性的静态数据。例如,minion 服务器的操作系统版本、内存的大小、网卡的 MAC 地址等。

步骤1 列出主机所有的Grains数据

输入:

[root@master ~]# salt "minion1" grains.items

执行效果:以 minion1: 开头,返回一个包含 81 个 key 的字典(本次实机统计),每个 key 的值按层级缩进展示,列表项以 - 开头、嵌套字典以 ---------- 分隔。输出很长,可用 salt "minion1" grains.items | less 分页查看。本环境中可观察到的典型字段如下(数值以实机为准):

Grains keyminion1 实测值说明
idminion1minion id
host / nodename / localhostminion1主机名
os / osfullname / os_familyopenEuler操作系统
osrelease / osmajorrelease22.03 / 22系统版本
osfingeropenEuler-22系统指纹
kernel / cpuarchLinux / aarch64内核与架构
master10.60.10.150master 地址
ipv410.60.10.148、127.0.0.1、192.168.122.1IPv4 地址列表
mem_total / num_cpus6647 / 4内存与 CPU 数
saltversion3003.3Salt 版本

其余还包括 cpu_flags、dns、ip4_interfaces、hwaddr_interfaces、kernelrelease、locale_info、pythonversion、selinux、systemd、virtual 等字段。原手册中 CentOS 7 / 192.168.123.x / x86_64 的输出示例不适用于本环境。

步骤2 查看所有minion的操作系统

[root@master ~]# salt "*" grains.item os

输出:

master:
    ----------
    os:
        openEuler
minion1:
    ----------
    os:
        openEuler
minion2:
    ----------
    os:
        openEuler

步骤3 查看所有minion的主机名

[root@master ~]# salt "*" grains.item host

输出:

master:
    ----------
    host:
        master
minion1:
    ----------
    host:
        minion1
minion2:
    ----------
    host:
        controller

执行效果:注意 minion2 的操作系统主机名是 controller,与它的 Salt minion id(minion2)不同;这就是为什么用主机名做匹配时要格外小心。

步骤4 查看所有minion的操作系统版本

[root@master ~]# salt "*" grains.item osrelease

输出:

master:
    ----------
    osrelease:
        22.03
minion1:
    ----------
    osrelease:
        22.03
minion2:
    ----------
    osrelease:
        22.03

步骤5 对openEuler的机器进行定位

原手册的 salt -G "os:CentOS" test.ping 在本环境会返回 ERROR: No return received / No minions matched the target,因为实际 grains 值为 openEuler。

[root@master ~]# salt -G "os:openEuler" test.ping

输出:

master:
    True
minion1:
    True
minion2:
    True

执行效果:3 台主机的 os grains 均为 openEuler,全部命中。

步骤6 定位系统版本是22.03的主机

[root@master ~]# salt -G "osrelease:22.03" test.ping

输出:

master:
    True
minion1:
    True
minion2:
    True

执行效果:3 台主机的 osrelease 均为 22.03,全部命中(原手册的 7.9.2009 为 CentOS 7 环境的值)。

步骤7 使用nodegroups进行匹配定位

编辑 nodegroups 配置。若按原手册方式,则 vim /etc/salt/master 并找到 “Node Groups” 配置块;本版采用可覆盖重写的 /etc/salt/master.d/nodegroups.conf(等价于在主配置文件中添加同样的三段定义,nodegroups: 必须顶格):

[root@master ~]# cat > /etc/salt/master.d/nodegroups.conf <<'EOF'
nodegroups:
  group: 'L@minion1,master'
  os: 'G@os:openEuler'
  release: 'G@osrelease:22.03'
EOF

[root@master ~]# cat /etc/salt/master.d/nodegroups.conf

输出(文件内容):

nodegroups:
  group: 'L@minion1,master'
  os: 'G@os:openEuler'
  release: 'G@osrelease:22.03'

说明:group 为列表分组(沿用任务四),os、release 为 Grains 分组;G@ 前缀表示按 grains 匹配。分组值必须与本步骤 2、4 查到的实际 grains 值一致,写 G@os:CentOS 或 G@osrelease:7.9.2009 将匹配不到任何主机。

修改完成后保存退出,重启 salt-master:

[root@master ~]# systemctl restart salt-master
[root@master ~]# sleep 10

执行效果:systemctl is-active salt-master 返回 active;重启后配置被重新加载。

步骤8 验证grains分组是否生效

验证 os 分组:

[root@master ~]# salt -N os test.ping

输出:

master:
    True
minion1:
    True
minion2:
    True

验证 release 分组:

[root@master ~]# salt -N release test.ping

输出:

master:
    True
minion1:
    True
minion2:
    True

执行效果:两个 Grains 分组都命中全部 3 台主机;salt -N group test.ping 仍只返回 master、minion1,说明三种分组互不影响。

相信大家对 Grains 匹配已经有所了解,之前用 grains.items 列出的所有数据都可以用来匹配主机。


任务六:复合匹配

复合匹配是一种可以将之前各种匹配方式混合使用的匹配方式,通过复合匹配可以定义更精细和复杂的 minion 匹配方式。

[root@master ~]# salt -C 'minion* and G@os:openEuler not E@.*2$' test.ping

输出:

minion1:
    True

这段匹配的含义是:匹配所有 minion 开头的、并且操作系统是 openEuler 且不能以 2 结尾的主机。三台主机中 minion2 以 2 结尾被排除,master 不以 minion 开头被排除,因此只剩 minion1。

可选写法:写成 -C 'minion* and G@os:openEuler and not E@.*2$' 或用括号显式分组(如 -C '( minion* and G@os:openEuler ) and not E@.*2$')也能得到相同结果,语义更清晰。原手册中的 G@os:CentOS 在本环境匹配不到任何主机,必须替换为 G@os:openEuler。


任务七:使用salt

步骤1 使用salt-run查看minion状态

saltstack 提供了 Runners 的功能,使用 salt-run 来运行,可以非常方便地在 Master 端执行相关的模块,获取 minion 端状态。

查看所有 minion 是 up 的主机:

[root@master ~]# salt-run manage.up

输出:

- master
- minion1
- minion2

登录到 minion2(IP 10.60.10.151,登录后提示符为 [root@controller ~]#),关闭 salt-minion:

[root@controller ~]# systemctl stop salt-minion

查看 minion2 中的 salt-minion 状态:

[root@controller ~]# systemctl status salt-minion

执行效果:Active: inactive (dead),systemctl is-active salt-minion 返回 inactive;状态输出中还会显示服务单元路径、Main PID 已退出以及最近的日志行。原手册此处为状态截图,本版以文字描述。

回到 master,查看所有 minion 是 down 的主机:

可以看到刚刚关闭的 minion2 的 salt-minion 为 down。

[root@master ~]# salt-run manage.down

输出:

- minion2

查看所有 minion 的状态:

[root@master ~]# salt-run manage.status

输出:

down:
    - minion2
up:
    - master
    - minion1

执行效果:down 列表为 minion2,up 列表为 master、minion1。此时若执行 salt '*' test.ping,minion2 会返回 Minion did not return. [Not connected] 并伴随 ERROR: Minions returned with non-zero exit code。

恢复环境(本版补充,保证后续步骤可覆盖全部 3 台主机):

[root@controller ~]# systemctl start salt-minion
[root@controller ~]# sleep 5
[root@controller ~]# systemctl is-active salt-minion

输出:

active

回到 master 复核:

[root@master ~]# salt-run manage.up

输出:

- master
- minion1
- minion2

执行效果:minion2 重新上线,后续所有 salt '*' ... 命令均可正常返回 3 台主机的结果。

步骤2 使用salt-call在minion本地执行模块

使用 salt-call 在本地执行,会发现 local 字样:

[root@master ~]# salt-call test.ping

输出:

local:
    True

查看本地 minion 的启动时间:

[root@master ~]# salt-call cmd.run "uptime"

输出(时间随实验时刻变化):

local:
     16:45:53 up 3 days, 40 min,  0 users,  load average: 0.19, 0.31, 0.29

执行效果:salt-call 不经过 master,直接在本地 minion 上执行模块,结果以 local: 标识;uptime 返回本机运行时长、登录用户数与负载均值。

步骤3 使用salt-cp下发文件

把 master 上的 hosts 文件分发到所有主机的 /tmp 目录下:

[root@master ~]# salt-cp '*' /etc/hosts /tmp

输出:

master:
    ----------
    /tmp/hosts:
        True
minion1:
    ----------
    /tmp/hosts:
        True
minion2:
    ----------
    /tmp/hosts:
        True

查看所有 minion 主机下的 /tmp 目录文件:

[root@master ~]# salt '*' cmd.run "ls /tmp/hosts"

输出:

master:
    /tmp/hosts
minion1:
    /tmp/hosts
minion2:
    /tmp/hosts

执行效果:3 台主机均返回 /tmp/hosts: True,并在 ls 校验中列出 /tmp/hosts,说明文件下发成功。

步骤4 使用salt测试安装软件

本环境的重要差异:原手册的 salt '*' pkg.install httpd 在本环境返回 'pkg.install' is not available.(os_family 为 openEuler,Salt 3003.3 未提供匹配的 pkg provider)。因此本版保留"批量安装 httpd"这一练习,改用 cmd.run 调用 yum 完成,并按要求用 --nogpgcheck 临时绕过 GPG 校验,不修改 yum 源配置。

另外,本环境 extras 源未显式设置 gpgcheck、默认值为 1 且未配置 gpgkey,普通 yum install 会报 “You have enabled checking of packages via GPG keys… Problem repository: repo.oepkgs.net…”。若遇到该报错,一律加 --nogpgcheck 临时绕过。

安装 httpd(已安装的主机跳过,避免 fedora-logos-httpd 与 openEuler-logos 的文件冲突报错):

[root@master ~]# salt --timeout=300 '*' cmd.run 'rpm -q httpd >/dev/null 2>&1 && echo "httpd already installed: $(rpm -q httpd)" || yum -y --nogpgcheck install httpd'

输出(本环境三台均已安装时的效果):

master:
    httpd already installed: httpd-2.4.54-2.aarch64
minion1:
    httpd already installed: httpd-2.4.51-21.oe2203.aarch64
minion2:
    httpd already installed: httpd-2.4.51-21.oe2203.aarch64

执行效果:若某台主机尚未安装 httpd,则会临时以 --nogpgcheck 方式从现有 yum 源安装并输出 Complete!;已安装的主机只回显版本号,不产生变更。可用 salt '*' cmd.run 'rpm -q httpd' 复核三台均已具备 httpd。

提示:本环境 extras 源中的 fedora-logos-httpd 与已装的 openEuler-logos 存在 /usr/share/pixmaps/poweredby.png 文件冲突,对已安装 httpd 的主机直接执行 yum -y --nogpgcheck install httpd 会报 Error: Transaction test error。上面的条件写法会跳过这些主机,因此不会触发该冲突;遇到该报错时先用 rpm -q httpd 确认软件已存在即可,无需改动 yum 源配置。

启动 httpd:

[root@master ~]# salt 'minion1' cmd.run "systemctl start httpd"

输出:

minion1:

执行效果:systemctl start 无标准输出,命令成功时 minion1 下方为空;httpd 服务进入运行状态。

查看 httpd 状态:

[root@master ~]# salt 'minion1' cmd.run "systemctl status httpd --no-pager"

执行效果:返回 httpd.service - The Apache HTTP Server,Loaded: loaded、Active: active (running),并显示 Main PID、Status(总请求数、Idle/Busy workers)、Tasks、Memory 以及 CGroup 下的 httpd / wsgi 子进程列表。原手册此处为状态截图,本版以文字描述(在 openEuler 上状态输出以 systemd 的 * 项目符号开头,与 CentOS 7 的排版略有差异)。

步骤5 使用salt查看minion信息

查看 tcp 连接情况:

[root@master ~]# salt 'minion1' network.active_tcp

执行效果:返回按序号编号(0:、1:、2:……)的连接字典,每个编号下含 local_addr、local_port、remote_addr、remote_port 四个字段。本环境 minion1 上可见 10.60.10.148 本机 3306 端口相关的连接以及对外连接,输出条目较多;原手册示例中 192.168.123.12 与 4505/4506 端口为其它环境的数据,以实际输出为准。

查看主机名:

[root@master ~]# salt '*' network.get_hostname

输出:

master:
    master
minion1:
    minion1
minion2:
    controller

执行效果:返回各主机的操作系统主机名;本环境只有 3 台,minion2 返回 controller(原手册示例中的 minion3 不存在)。

查看 ssh 服务是否可达:

[root@master ~]# salt '*' service.available sshd

输出:

master:
    True
minion1:
    True
minion2:
    True

查看所有启动的服务:

[root@master ~]# salt '*' service.get_all

执行效果:每台主机返回一个很长的 systemd 单元名列表,以 - 开头,按字母序排列,开头几项类似 NetworkManager、NetworkManager-dispatcher、NetworkManager-wait-online、arp-ethers、auditd、autovt@、basic.target、blk-availability、bluetooth.target、chronyd、dbus、dnf-makecache……;列表包含 service、target、socket、mount 等各类单元。可用 salt '*' service.get_all | less 分页查看。

查看指定服务是否在线:

[root@master ~]# salt '*' service.status httpd

输出:

master:
    False
minion1:
    True
minion2:
    True

执行效果:minion1 在本任务步骤 4 中启动了 httpd,返回 True;minion2 上 httpd 原本已处于运行状态,也返回 True;master 虽已安装 httpd 但未启动,返回 False(原手册示例为 minion2 False,与本环境不符)。

安装指定命令,如 lsof:

原手册的 salt '*' state.single pkg.installed name=lsof 在本环境返回 Specified state 'pkg.installed' was not found(原因同步骤 4:pkg state 模块不可用)。本版保留"批量安装指定命令"这一练习,改用 cmd.run + yum -y --nogpgcheck 完成,同样不修改 yum 源配置。

[root@master ~]# salt --timeout=300 '*' cmd.run 'rpm -q lsof >/dev/null 2>&1 && echo "lsof already installed: $(rpm -q lsof)" || yum -y --nogpgcheck install lsof'

输出(本环境三台均已安装时):

master:
    lsof already installed: lsof-4.94.0-3.aarch64
minion1:
    lsof already installed: lsof-4.94.0-3.aarch64
minion2:
    lsof already installed: lsof-4.94.0-3.aarch64

验证命令可用:

[root@master ~]# salt '*' cmd.run 'lsof -v 2>&1 | head -2'

输出:

master:
    lsof version information:
        revision: 4.94.0
minion1:
    lsof version information:
        revision: 4.94.0
minion2:
    lsof version information:
        revision: 4.94.0

执行效果:三台主机均具备 lsof 命令;若某台缺失,则该台会在前一条命令中以 --nogpgcheck 临时绕过 GPG 校验完成安装并输出 Installed ... / Complete!。


实验小结

本实验讲述了 SaltStack 的常用匹配 minion 主机的方式,便于更好的对 minion 进行分组管理,实现批处理。通过全局匹配、正则匹配、列表匹配、CIDR 匹配、Grains 匹配和复合匹配,可以按主机名、IP 网段、操作系统属性等维度灵活圈定目标主机;配合 salt-run、salt-call、salt-cp、cmd.run 等工具,可在不逐台登录的情况下完成状态查看、文件下发与软件安装。


附:实验收尾状态说明

按本手册顺序执行完毕后,实验虚拟机应保持以下状态,便于重复练习:

  • master 的 /etc/salt/master.d/nodegroups.conf 中定义了 group、os、release 三个分组,salt-master 为 active;原 /etc/salt/master 主配置文件未被破坏(如需还原,可用 /tmp/salt_master.bak 覆盖)。
  • minion2 的 salt-minion 已重新启动,salt-run manage.up 能列出 master、minion1、minion2 三台。
  • yum 源配置文件 /etc/yum.repos.d/*.repo 全程未做任何修改;所有软件安装均通过命令级 --nogpgcheck 临时绕过 GPG 校验完成。验证阶段已实测对比:不带该参数时 yum 报 “You have enabled checking of packages via GPG keys… Problem repository: repo.oepkgs.net…”,加 --nogpgcheck 后可正常安装新包(以 tree 为例返回 Complete!)。
  • /tmp/hosts 已下发到三台主机;三台均具备 httpd 与 lsof;minion1、minion2 的 httpd 处于运行状态。
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐