SaltStack 核心概念
在深入命令之前,必须理解 Salt 的几个核心概念:

- Master: 控制节点,负责向 Minion 发送指令和配置。
- Minion: 被控节点,运行在需要管理的服务器上,接收并执行来自 Master 的指令。
- Target (目标): 指定命令要发送给哪些 Minion,这是 Salt 强大功能的核心,可以通过多种方式精确定位目标机器。
- State (状态): 使用 YAML 文件(SLS 文件)定义系统应有的状态(如安装软件、创建文件、运行服务等),然后让 Salt 将系统驱动到该状态。
Salt 命令基本语法
所有 Salt 命令都遵循一个基本格式:
salt [目标表达式] [模块] [函数] [参数]
目标表达式: 指定要操作的 Minion。模块: Salt 内置了大量的模块(如cmd,pkg,service,file等),用于执行特定任务。函数: 模块下的具体功能。参数: 传递给函数的参数。
核心 salt 命令详解
目标
这是最常用的部分,决定了命令作用于哪些机器。
| 目标表达式 | 示例 | 说明 |
|---|---|---|
| 通配符 | salt '*' test.ping |
匹配所有 Minion |
salt 'web*' test.ping |
匹配所有 ID 以 'web' 开头的 Minion | |
salt '*server*' test.ping |
匹配所有 ID 中包含 'server' 的 Minion | |
| 列表 | salt -L 'minion1,minion2,web01' test.ping |
匹配指定 ID 列表中的 Minion |
| 正则表达式 | salt -E '^db.*' test.ping |
匹配所有 ID 符合正则表达式 ^db.* 的 Minion |
| Grains | salt -G 'os:Ubuntu' test.ping |
匹配所有 Grains 中 os 值为 Ubuntu 的 Minion |
salt -G 'kernel:Linux' cmd.run 'uname -a' |
匹配所有内核为 Linux 的机器并执行命令 | |
| Pillar | salt -I 'environment:production' test.ping |
匹配所有 Pillar 中 environment 值为 production 的 Minion |
| 复合目标 | salt -C 'G@os:Ubuntu and L@web01,web02' test.ping |
使用 -C 和 and, or, not 组合多个目标,匹配所有 Ubuntu 机器,ID 是 web01 或 web02 的机器。 |
常用模块及函数
a. 测试和状态检查模块
-
test.ping(或test.true)- 作用: 检查 Minion 是否在线并能与 Master 通信,返回
True表示成功。 - 示例:
salt '*' test.ping
- 作用: 检查 Minion 是否在线并能与 Master 通信,返回
-
cmd.run
(图片来源网络,侵删)-
作用: 在 Minion 上执行任意 shell 命令,这是最强大的模块之一,但应谨慎使用。
-
示例:
# 在所有 web 服务器上检查内存使用情况 salt 'web*' cmd.run 'free -m' # 在特定机器上创建一个目录 salt 'db01' cmd.run 'mkdir -p /tmp/salt_test'
-
-
grains.items-
作用: 获取指定 Minion 的所有 Grains 信息,Grains 是 Minion 启动时收集的静态信息,如操作系统、内核版本、IP 地址、CPU 架构等。
(图片来源网络,侵删) -
示例:
# 获取所有 Minion 的所有 Grains salt '*' grains.items # 获取特定 Minion 的操作系统信息 salt 'web01' grains.get os
-
b. 文件管理模块
-
file.copy- 作用: 从 Master 的文件服务器复制文件到 Minion。
- 示例:
# 将 Master /srv/salt/nginx.conf 复制到 Minion 的 /etc/nginx/ salt 'web*' file.copy source='/srv/salt/nginx.conf' dest='/etc/nginx/nginx.conf'
-
file.managed- 作用: 强大的文件管理功能,如果源文件被修改,它会自动将更新同步到 Minion,这是状态管理中最常用的函数。
- 示例:
# 管理 Minion 上的 /etc/motd 文件,内容来自 Master 的 /srv/salt/motd.jinja salt 'web*' file.managed source='salt://motd.jinja' dest='/etc/motd' mode='0644'
-
file.directory- 作用: 确保目录存在,并可以设置权限和所有者。
- 示例:
# 确保 /opt/myapp/logs 目录存在,并设置所有者为 root salt '*' file.directory name='/opt/myapp/logs' user=root group=root mode=755
c. 软件包管理模块
-
pkg.install-
作用: 安装软件包,Salt 会根据 Minion 的操作系统自动选择正确的包管理器(
apt,yum,zypper等)。 -
示例:
# 在所有机器上安装 nginx salt '*' pkg.install nginx # 在所有 Ubuntu 机器上安装 vim salt -G 'os:Ubuntu' pkg.install vim
-
-
pkg.remove- 作用: 卸载软件包。
- 示例:
salt '*' pkg.remove apache2
-
pkg.latest- 作用: 升级软件包到最新版本。
- 示例:
# 升级所有已安装的软件包 salt '*' pkg.latest
d. 服务管理模块
-
service.start- 作用: 启动服务。
- 示例:
salt '*' service.start nginx
-
service.stop- 作用: 停止服务。
- 示例:
salt '*' service.stop nginx
-
service.restart- 作用: 重启服务。
- 示例:
salt '*' service.restart nginx
-
service.status- 作用: 检查服务状态。
- 示例:
salt '*' service.status nginx
其他重要 Salt 命令
除了核心的 salt 命令,还有一些其他非常实用的命令。
salt-key - 密钥管理
当新的 Minion 连接到 Master 时,需要被授权。
-
salt-key -L:- 作用: 列出所有已接受的和未接受的 Minion 密钥。
- 示例:
salt-key -L
-
salt-key -A:- 作用: 接受所有待处理的 Minion 密钥。(生产环境慎用,建议先用
-a单个接受) - 示例:
salt-key -A
- 作用: 接受所有待处理的 Minion 密钥。(生产环境慎用,建议先用
-
salt-key -a <minion_id>:- 作用: 接受指定的 Minion 密钥。
- 示例:
salt-key -a web01
-
salt-key -d <minion_id>:- 作用: 删除指定的 Minion 密钥。
- 示例:
salt-key -d web01
salt-cp - 文件复制
-
作用: 快速将单个文件从 Master 复制到一个或多个 Minion,比
file.copy简单,但功能较少。 -
语法:
salt-cp [目标] <源文件> <目标路径>
-
示例:
# 将本地的 /tmp/hello.txt 复制到所有 Minion 的 /home/ 目录下 salt-cp '*' /tmp/hello.txt /home/ # 复制到特定 Minion salt-cp 'web01' /tmp/hello.txt /home/
salt-run - 运行 Runner
-
作用: Runner 是在 Master 上执行的任务,通常用于跨多个 Minion 的聚合操作或管理任务,如管理 Salt 本身。
-
示例:
# 获取所有已连接的 Minion 列表 salt-run manage.status # 清理所有 Minion 的缓存 salt-run saltutil.sync_all
state.apply (或 salt-call --local state.apply)
- 作用: 这是 Salt 状态管理的核心命令,用于应用 SLS 文件定义的状态。
salt '*' state.apply: 在所有 Minion 上应用状态。salt 'web*' state.apply webserver: 在 ID 为 'web*' 的 Minion 上应用webserver状态(通常指/srv/salt/webserver.sls文件)。salt-call --local state.apply: 在本地(Master 或任意机器)应用状态,常用于测试或在没有 Minion 的环境中使用。
命令行选项
-v或--verbose: 显示详细的输出。-b NUM或--batch-size=NUM: 分批执行命令,避免同时连接过多机器。-b 10表示每次只对 10 台机器执行。-t SEC或--timeout=SEC: 设置命令超时时间(默认为 5 秒)。--async: 异步执行命令,立即返回一个 Job ID,不等待所有 Minion 执行完成。-l或--log-level: 设置日志级别。
实战示例
场景: 部署一个简单的 Web 服务器(Nginx)。
-
目标: 在所有 ID 以
web开头的 Minion 上安装 Nginx,并启动服务。 -
命令:
# 1. 安装 Nginx salt 'web*' pkg.install nginx # 2. 启动 Nginx 服务并设置为开机自启 salt 'web*' service.start nginx salt 'web*' service.enable nginx
场景: 检查所有生产环境的数据库服务器的内核版本。
- 目标: 所有 Pillar 中
environment标记为production且 Grains 中roles包含database的机器。 - 命令:
salt -C 'I@environment:production and G@roles:database' cmd.run 'uname -r'
希望这份详细的指南能帮助你更好地掌握 SaltStack 命令!
