SaltStack-基本使用

SaltProject 社区文档

SALT IN 10 MINUTES

介绍

SaltStack 是一款开源的自动化运维工具, 用于配置管理, 远程执行和任务编排. (也可以称为 salt)

相关概念

Salt 是 C/S 架构, 服务端运行 salt-master, 而客户端运行 salt-minion. (也就是说, 客户端也需要安装软件)

Master

Master 是任务的发布者.

Minion

Minion 通过订阅的方式获取 master 发布的任务.

Targets

Master 将应当执行任务的一组 minion 定义为 targets.

通常就是指 Minion 的 ID.

Pillar

用于存放 master 定义的动态数据, 需要时会推送给 minion.
(也就是说, 其运行在 master 端)

其收集到的信息称 items.

查看如:

1
salt '*' pillar.itesm

默认不会有内容, 需要先自己定义并更新后才能起作用.

Grains

Grains 运行在 minion 中收集信息, 如 OS, 域名, IP 等. 其将这些存储为静态数据, 仅在系统信息发生变化或用户自定义了某个参数后才会刷新.

其收集到的信息同样称 items.

查看如:

1
salt '*' grains.items

Beacons 和 reactors

Beacons 运行在 minion 中, 当故障出现时, 会触发 reactors 来提供处理故障的帮助信息.

onedir version of Salt

“onedir” 版本是 Salt 的一个特殊版本, 它使用单一目录结构来组织配置文件, 状态文件和其他 SaltStack 组件. 通常, SaltStack 使用基于分层目录结构的方式来组织配置文件和状态文件, 但 “onedir” 版本的 Salt 简化了这个结构, 将所有文件和目录都放在一个目录中.

模块和指令

模块如 test, 其指令有 test.ping, test.version 等, 访问模块下的指令用 ., 示例:

1
salt '*' test.ping

Master 和 Minion 间的认证和通信

Minion 在第一次启动时, 会在 /etc/salt/pki/minion 下自动生成私钥 minion.key 和公钥 minion.pub, 并将公钥发送给 master.

Master 收到 minion 发送的公钥后, 并不会自动接收, 需要管理员使用 salt-key 进行手动接收, 并将其添加到 /etc/salt/pki/masker/minions 中.

Master 通过 4505 端口发布任务.

Minion 通过 4506 端口返回执行结果.

安装

在控制节点上安装 salt-master, 在被管理节点上安装 salt-minion

使用 bootstrap 脚本安装

1
2
curl -o bootstrap-salt.sh -L https://bootstrap.saltproject.io
chmod +x bootstrap-salt.sh

若只安装 minion:

1
./bootstrap-salt.sh

若只安装 master, 则用:

1
./bootstrap-salt.sh -M -N

若都安装:

1
./bootstrap-salt.sh -M

具体版本和参数可参考 https://docs.saltproject.io/salt/install-guide/en/latest/topics/bootstrap.html#install-bootstrap.

使用 pip 安装

以 openEuler22.03 为例:

1
2
dnf intall -y python3-pip gcc python3-devel
pip3 install salt

(这样安装之后配置文件之类的不清楚在哪里)

配置

Master 和 Minion 都使用 YAML 进行配置 (但似乎还是以 .conf 结尾), 默认的配置文件 /etc/salt/master/etc/salt/minion 中大都是注释后的配置, 可以用作参考手册, 一般自己的配置写在 /etc/salt/master.d//etc/salt/minion.d/ 目录下.

注意, 当在多个文件中编写了多个重复的配置选项时, salt 会先以 alphabetical order 读取文件, 后被读取的 settings 会覆盖之前的设置.

Minion 配置

  • /etc/salt/minion/etc/salt/minion.d 配置 minion

Salt Minion 可以 operate with or without Salt Master.

编辑 Minion 的配置文件 /etc/salt/minion, 在该文件中找到以下两个配置项,并修改为 Salt Master 的相关信息:

1
2
3
4
5
6
# The location of the Salt Master Server. If the master server cannot be
# resolved, then the minion will fail to initiate a connection.
master: <salt_master_ip_or_hostname>

# The port on which the master will be listening.
master_port: 4506

来找寻 Salt Master. (也可以填 IP)

/etc/salt/minion_id 文件并写入:

1
your_id_for_this

ID 可以是字符串. 注意 Master 在用 salt-key 来接收 key 时, 指定的就是这个 ID.

Master 配置

  • /etc/salt/master 主配置文件
  • /etc/salt/master.d, 其他配置文件

重要配置选项有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# The address of the interface to bind to:
interface: 0.0.0.0
# The tcp port used by the publisher:
publish_port: 4505
# The port used by the communication interface. The ret (return) port is the
# interface used for the file server, authentication, job returns, etc.
ret_port: 4506
# Directory used to store public key data:
pki_dir: /etc/salt/pki/master
file_roots:
base:
- /srv/salt/
pillar_roots:
base:
- /srv/pillar
  • file_roots 用于存放任务执行脚本
  • pillar_roots 用于设置 pillar 数据存放目录

额外的配置文件

Saltfile

~/.salt/Saltfile 文件的配置会在运行时被 CLI client 读取, 其语法格式为:

1
2
<client>:
<option>: <setting>

如:

1
2
3
4
salt:
log_level: debug
salt-call:
log_level: debug

The ~/.saltrc file

其配置信息会作为 option 传递给 salt command, 同样使用 YAML 的 key: value 对的配置语法.

Salt 会自动在以下位置找 .saltrc 文件:

  • 家目录
  • ~/.config/saltrc
  • SALT_MASTER_CONFIG 环境变量指向的位置

启用

使用 systemctl

1
2
systemctl start salt-master
systemctl start salt-minion

前台直接启用

1
2
salt-master
salt-minion

Master 接收密钥的操作

使用 salt-key 命令, 常见选项有:

  • -A, 接收全部密钥
  • -D, 删除全部密钥
  • -L, 列出全部密钥
  • -a, 接收指定密钥
  • -j, 拒绝指定密钥
  • -d, 删除指定密钥

SaltStack 相关命令

Salt 提供的命令有:

  • master 端:
    • salt
    • salt-key, 管理密钥
    • salt-run
    • salt-api
  • milion 端:
    • salt-call, 在 minion 本地执行 Salt 模块和查看状态
    • salt-milion, 用于启动和管理 Salt Minion 服务
    • salt-proxy, 用于启动和管理 Salt Proxy Minion 服务

Master 端操作

远程命令执行

使用 salt 命令, 语法为:

1
salt [options] '<target>' <function> [arguments]
  • [options] 设置指定 target 的方式
  • <function> 就是指模块

target 指定方式

  • 通配符, 如:

    1
    salt '*' test.ping
  • -L, --list, 通过列表指定, 如:

    1
    salt -L 'Nginx1,Nginx2' test.ping
  • -E, --pcre, 指 Perl Compatible Regular Expressions (兼容 Perl 的正则表达式) 的缩写, 用正则表达式指定, 如:

    1
    salt -E '^N' test.ping
  • -I, --pillar, 通过 pillar item 来指定, 如

    1
    salt -I 'test:Nginx1' test.ping
  • -G, --grains, 通过 grains item 来指定, 如:

    1
    salt -G 'ipv4:192.168.1.14' test.ping
  • -C, --compound, 用混合方式指定主机, 如:

    1
    salt -C 'I@test:Nginx1 or G@ipv4:192.168.1.15' test.ping
  • -S, --ipcidr, 通过网络信息指定主机, 如:

    1
    2
    salt -S '192.168.1.0/24' test.ping
    salt -S '192.168.1.15' test.ping

可用模块

查看所有可用模块

可以在 https://docs.saltproject.io/en/latest/py-modindex.html 查看可用模块列表.

列出 minion 安装的模块

1
salt 'minion_name' sys.list_modules

查看模块文档

1
salt 'minion_name' sys.doc 'module_name'

查看模块支持的功能

1
salt 'minion_name' sys.list_function 'module_name'

常用操作

查看 master 和 minion 之间通信是否正常

1
salt '*' test.ping

查看 minion 的 Salt 版本信息

1
salt '*' test.version
  • "*" 表示对所有 minions 执行
  • test 是一个模块, version 是其下的命令, 用于获取指定 minion 的 Salt 版本信息

Grains 相关操作

查看 grains 的所有 item 信息

1
salt "*" grains.items
  • "*" 表示对所有 minions 执行
  • grains 是一个模块, items 是其下的命令, 用于获取指定 minion 的 grains 信息

上述命令输出部分为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    version:
253
systempath:
- /usr/local/sbin
- /usr/local/bin
- /usr/sbin
- /usr/bin
transactional:
False
uid:
0
username:
root
uuid:
fcb54802-8a61-4bea-8ae7-a35d4f8e48a9
virtual:
kvm
zfs_feature_flags:
False
zfs_support:
False
zmqversion:
4.3.4

这里的 version, systempath, transactional 等就是 “item”.

查看 grains 的具体某个 item 的内容

1
salt "*" grains.item os

输出如:

1
2
3
4
5
6
7
8
fedora1:
----------
os:
Fedora
fedora2:
----------
os:
Fedora

fedora1fedora2 分别是两台 minions 的 id.

根据 item 的值来指定主机执行命令

如:

1
salt -G 'ipv4:192.168.177.24' test.ping
  • -G, --grain, 后面参数语法为 “item_name:item_value”

输出如:

1
2
fedora1:
True

在 minion 中自定义 item

有两种方式:

  1. /etc/salt/minion.d 目录下创建一个配置文件, 如 items.conf, 内容示例如:
    1
    2
    grains:
    role: Nginx
    这里即添加了一个名为 role 的 item, 值为 Nginx.
  2. /etc/salt 目录下创建 grains 文件, 并直接以 key:value 来定义, 如
    1
    hello: World

在修改 grains 之后, 可以通过两种方式更新:

  1. 重启 salt-minion 服务
  2. 在 master 上执行 salt "*" saltutil.sync_grains

之后可以用:

1
2
# salt "*" grains.item role
salt "*" grains.item hello

来查看.

top.sls 文件

其定义哪些状态文件和 Pillar 数据应用到哪些 minion 上. 它是 Salt 的高层次配置文件,指导如何将状态和 Pillar 分配给不同的 minion. 必须要有.

该文件需位于 /etc/salt/master 中:

1
2
3
pillar_roots:
base:
- /srv/pillar

指定的目录下.

格式同样是 YAML, 基本语法为:

1
2
3
base:
'<target>':
- <state_or_pillar_file>

base 是一个环境, 是 Saltstack 中的默认环境, 它用于定义系统的基本状态 (不是很懂还).

<target> 用来匹配 minion, 可以是:

  • *, 匹配所有 minion
  • minion-id, 指定特定的 minion
  • xxx:xxx, 使用 grain 来匹配
  • E@web\d+, 使用正则表达式匹配

<state_or_pillar_file> 则是要运行的 .sls 文件名, 不包含后缀. 也能用上述匹配来指定.

Pillar 相关操作

Pillar 通过在指定目录 (在 master 的配置文件中指定) 中创建配置文件来自定义, 如在 /srv/pillar 目录 (默认目录) 中创建 test.sls (在 minion 中设置), 内容为:

1
2
3
4
5
6
7
8
nginx:
worker_processes: 4
worker_connections: 1024
mysql:
host: 192.168.1.100
port: 3306
user: myuser
password: mypassword

修改 top.sls, 内容为:

1
2
3
base:
'*':
- test

修改 Pillar 后更新 :

1
salt "*" saltutil.refresh_pillar

查看:

1
salt "*" pillar.items

Milion 端操作

常用模块使用

cmd

可远程执行命令, 如 ip addr:

1
salt 'pxe' cmd.run "ip addr"

只要是 minion 有的命令都可执行.j

Pkg

用于包管理. 常用的功能有:

  • pkg.available_version: 查看软件包最新版本
  • pkg.download: 仅下载安装包, 但不安装, 下载完成后会返回安装包存放目录
  • pkg.list_repos: 列出 yum 源相关信息
  • pkg.install: 安装指定软件包, pkg.group_install 安装指定软件组
  • pkg.remove: 卸载指定软件包
  • pkg.owner: 查看某个文件输入哪个软件包
  • pkg.list_pkgs: 列出全部已安装软件包
  • pkg.mod_repo: 修改 yum 源某些参数

列出 yum 源相关信息

1
salt 'pxe' pkg.list_repos

查看某个包最新版本

1
salt 'pxe' pkg.available_version nginx

安装包

1
salt 'pxe' pkg.install neovim

Network

用于收集和管理网络信息:

  • network.active_tcp: 返回字典形式的活动的 TCP 连接
  • network.connect: 通过 minion 的指定端口测试与某个 host 之间的连通性
  • network.default_route: 查看 minion 的默认路由
  • network.get_route: 查看 minion 的指定网段路由明细
  • network.dig: 使用 dig 对 minion 进行 DNS 测试
  • network.interface: 查看 minion 指定端口的地址
  • network.ping: 指定 minion 对某个地址进行 ping 测试
  • network.routes: 查看指定 minion 的路由表
  • network.traceroute: 指定 minion 对某个地址进行路由追踪

获取 minion 的 IP 地址

1
salt 'pxe' network.ipaddrs

指定端口测试连通性

这里是测试 pxe 这个 milion 对 192.168.177.2:80 的连通性:

1
salt 'pxe' network.connect 192.168.177.2 80

(注意不是 : 分隔 IP 和端口)

Service

用于服务管理:

  • service.available: 查看某个服务是否可用, 如果可用返回值为 True, 反之则为 False
  • service.disable: 将服务设置为开机不自启
  • service.disabled: 查看服务是否在开机不自启清单中, 如果在返回值为 False, 反之则为 True
  • service.enable: 将服务设置为开机自启
  • service.enabled: 查看服务是否在开机自启清单中, 如果在返回值为 True, 反之则为 False
  • service.get_all: 列出全部已安装可用的服务
  • service.start: 启动某个服务
  • service.stop: 关闭某个服务
  • service.restart: 重启某个服务
  • service.reload: 重新加载某个服务配置

查看某服务是否可用

1
salt 'pxe' service.available nginx

设置某服务为开机自启

1
salt 'pxe' service.enable nginx

查看某服务是否是开机自启

1
salt 'pxe' service.enabled nginx

启用某服务

1
salt 'pxe' service.start nginx

File

用于文件, 目录管理:

  • file.access: 测试 SaltStack 对文件或目录是否具备某项权限, f 查看所查询对象是否存在, r, wx 本别用于查看是否具备读写和执行权限
  • file.append: 用于在文件里追加内容, 如果文件不存在, 则系统会报错
  • file.basenamefile.dirname: 通过路径指定某个文件, SaltStack 分别返回最后一部分和目录部分
  • file.touch: 创建文件, 如果文件已存在则更新该文件的访问时间或修改时间
  • file.chgrpfile.chown: 分别用于修改文件或目录的所属组或者所属用户和所属组
  • file.copy: 文件复制
  • file.find: 搜索文件
  • file.diskusage: 计算目录所占空间, 返回值的单位为字节
  • file.get_gid, file.get_group, file.get_uidfile.get_user: 用于获取文件的所属组 ID, 所属组, 所属用户 ID 和所属用户
  • file.grep: 在某个文件中查找指定内容
  • file.makdirsfile.mkdir: 创建目录. 二者有一定的区别, 例如, 如果创建目录 /tmp/test, 使用 file.makdirs 后面需输入 /tmp/test/, 如果使用 file.mkdir 后面输入 /tmp/test 即可. 同时 filemakdirs 不支持同时创建多个目录, file.mkdir 则支持
  • file.move: 移动文件或目录
  • file.removefile.rename: 删除文件及重命名文件
  • file.rmdir: 删除空目录

创建目录

1
salt 'pxe' file.mkdir /root/Nginx

创建文件

1
salt 'pxe' file.touch /root/Nginx/index.html

向文件追加内容

1
salt 'pxe' file.append /root/Nginx/index.html "Hello world"

Status

用于查看 minion 的状态:

  • status.cpuinfo: 查看 minion 的 cpu 信息
  • status.cpustats: 查看 minion 的 cpu 状态
  • status.diskstats: 查看 minion 的磁盘状态
  • status.diskusage: 查看 minion 某块磁盘的使用率
  • status.meminfo: 查看 minion 的内存信息
  • status.netstats: 查看 minion 的网络状态

查看 CPU 信息

1
salt 'pxe' status.cpuinfo

配置脚本编写

配置脚本使用 YAML 语法, 但文件后缀为 .sls (“Salt Language State”).

配置脚本的存放位置由 master 配置文件中的 file_roots 指定.

如创建 nginx.sls 文件, 内容为:

1
2
3
4
5
6
7
nginx_install:
pkg.installed:
- name: nginx
enable_nginx:
service.running:
- name: nginx
- enable: True
  • nginx_install: 是一个自定义的 State ID ,用于标识这个 State 的名称
  • pkg.installed: 是要运行的 State 函数 (和模块有所不同)
  • name: 是参数, 表明要安装的软件包的名称

利用 state 模块中的 sls 命令来运行:

1
salt 'Nginx1' state.sls nginx

另创建 httpd.sls 文件, 内容为:

1
2
3
4
5
6
7
httpd_install:
pkg.installed:
- name: httpd
enable_httpd:
service.running:
- name: httpd
- enable: True

可以编写 top.sls 来运行两个 .sls 文件:

1
2
3
4
5
base:
'Nginx1':
- nginx
'Nginx2':
- httpd

State 函数

在 SLS 文件中使用的都是 State 函数, 其与模块有些区别:

  • SLS 文件中的 State 函数是声明式的, 只需要声明目标状态, Salt 会根据当前状态自动执行相应的操作
  • 直接执行模块是命令式的, 需要显式地执行操作, 不关心当前状态

查看与 state 函数相关的文档, 用:

1
salt 'pxe' sys.state_doc pkg.installed

而查看模块函数则是用:

1
salt 'pxe' sys.doc pkg.install

SaltStack-基本使用
http://example.com/2024/03/09/SaltStack-基本使用/
作者
Jie
发布于
2024年3月9日
许可协议