SaltStack-基本使用
介绍
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 |
|
默认不会有内容, 需要先自己定义并更新后才能起作用.
Grains
Grains 运行在 minion 中收集信息, 如 OS, 域名, IP 等. 其将这些存储为静态数据, 仅在系统信息发生变化或用户自定义了某个参数后才会刷新.
其收集到的信息同样称 items.
查看如:
1 |
|
Beacons 和 reactors
Beacons 运行在 minion 中, 当故障出现时, 会触发 reactors 来提供处理故障的帮助信息.
onedir version of Salt
“onedir” 版本是 Salt 的一个特殊版本, 它使用单一目录结构来组织配置文件, 状态文件和其他 SaltStack 组件. 通常, SaltStack 使用基于分层目录结构的方式来组织配置文件和状态文件, 但 “onedir” 版本的 Salt 简化了这个结构, 将所有文件和目录都放在一个目录中.
模块和指令
模块如 test
, 其指令有 test.ping
, test.version
等, 访问模块下的指令用 .
, 示例:
1 |
|
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 |
|
若只安装 minion:
1 |
|
若只安装 master, 则用:
1 |
|
若都安装:
1 |
|
具体版本和参数可参考 https://docs.saltproject.io/salt/install-guide/en/latest/topics/bootstrap.html#install-bootstrap.
使用 pip 安装
以 openEuler22.03 为例:
1 |
|
(这样安装之后配置文件之类的不清楚在哪里)
配置
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 |
|
来找寻 Salt Master. (也可以填 IP)
在 /etc/salt/minion_id
文件并写入:
1 |
|
ID 可以是字符串. 注意 Master 在用 salt-key
来接收 key 时, 指定的就是这个 ID.
Master 配置
/etc/salt/master
主配置文件/etc/salt/master.d
, 其他配置文件
重要配置选项有:
1 |
|
file_roots
用于存放任务执行脚本pillar_roots
用于设置 pillar 数据存放目录
额外的配置文件
Saltfile
~/.salt/Saltfile
文件的配置会在运行时被 CLI client 读取, 其语法格式为:
1 |
|
如:
1 |
|
The ~/.saltrc file
其配置信息会作为 option 传递给 salt
command, 同样使用 YAML 的 key: value
对的配置语法.
Salt 会自动在以下位置找 .saltrc
文件:
- 家目录
~/.config/saltrc
- SALT_MASTER_CONFIG 环境变量指向的位置
启用
使用 systemctl
1 |
|
前台直接启用
1 |
|
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 |
|
[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
2salt -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 |
|
查看模块文档
1 |
|
查看模块支持的功能
1 |
|
常用操作
查看 master 和 minion 之间通信是否正常
1 |
|
查看 minion 的 Salt 版本信息
1 |
|
"*"
表示对所有 minions 执行test
是一个模块,version
是其下的命令, 用于获取指定 minion 的 Salt 版本信息
Grains 相关操作
查看 grains 的所有 item 信息
1 |
|
"*"
表示对所有 minions 执行grains
是一个模块,items
是其下的命令, 用于获取指定 minion 的 grains 信息
上述命令输出部分为:
1 |
|
这里的 version
, systempath
, transactional
等就是 “item”.
查看 grains 的具体某个 item 的内容
1 |
|
输出如:
1 |
|
fedora1
和 fedora2
分别是两台 minions 的 id.
根据 item 的值来指定主机执行命令
如:
1 |
|
-G
,--grain
, 后面参数语法为 “item_name:item_value”
输出如:
1 |
|
在 minion 中自定义 item
有两种方式:
- 在
/etc/salt/minion.d
目录下创建一个配置文件, 如items.conf
, 内容示例如:这里即添加了一个名为1
2grains:
role: Nginxrole
的 item, 值为Nginx
. - 在
/etc/salt
目录下创建grains
文件, 并直接以key:value
来定义, 如1
hello: World
在修改 grains 之后, 可以通过两种方式更新:
- 重启 salt-minion 服务
- 在 master 上执行
salt "*" saltutil.sync_grains
之后可以用:
1 |
|
来查看.
top.sls 文件
其定义哪些状态文件和 Pillar 数据应用到哪些 minion 上. 它是 Salt 的高层次配置文件,指导如何将状态和 Pillar 分配给不同的 minion. 必须要有.
该文件需位于 /etc/salt/master
中:
1 |
|
指定的目录下.
格式同样是 YAML, 基本语法为:
1 |
|
base
是一个环境, 是 Saltstack 中的默认环境, 它用于定义系统的基本状态 (不是很懂还).
<target>
用来匹配 minion, 可以是:
*
, 匹配所有 minionminion-id
, 指定特定的 minionxxx:xxx
, 使用 grain 来匹配E@web\d+
, 使用正则表达式匹配
而 <state_or_pillar_file>
则是要运行的 .sls
文件名, 不包含后缀. 也能用上述匹配来指定.
Pillar 相关操作
Pillar 通过在指定目录 (在 master 的配置文件中指定) 中创建配置文件来自定义, 如在 /srv/pillar
目录 (默认目录) 中创建 test.sls
(在 minion 中设置), 内容为:
1 |
|
修改 top.sls
, 内容为:
1 |
|
修改 Pillar 后更新 :
1 |
|
查看:
1 |
|
Milion 端操作
常用模块使用
cmd
可远程执行命令, 如 ip addr
:
1 |
|
只要是 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 |
|
查看某个包最新版本
1 |
|
安装包
1 |
|
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 |
|
指定端口测试连通性
这里是测试 pxe
这个 milion 对 192.168.177.2:80
的连通性:
1 |
|
(注意不是 :
分隔 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 |
|
设置某服务为开机自启
1 |
|
查看某服务是否是开机自启
1 |
|
启用某服务
1 |
|
File
用于文件, 目录管理:
file.access
: 测试 SaltStack 对文件或目录是否具备某项权限,f
查看所查询对象是否存在,r
,w
和x
本别用于查看是否具备读写和执行权限file.append
: 用于在文件里追加内容, 如果文件不存在, 则系统会报错file.basename
和file.dirname
: 通过路径指定某个文件, SaltStack 分别返回最后一部分和目录部分file.touch
: 创建文件, 如果文件已存在则更新该文件的访问时间或修改时间file.chgrp
和file.chown
: 分别用于修改文件或目录的所属组或者所属用户和所属组file.copy
: 文件复制file.find
: 搜索文件file.diskusage
: 计算目录所占空间, 返回值的单位为字节file.get_gid
,file.get_group
,file.get_uid
和file.get_user
: 用于获取文件的所属组 ID, 所属组, 所属用户 ID 和所属用户file.grep
: 在某个文件中查找指定内容file.makdirs
和file.mkdir
: 创建目录. 二者有一定的区别, 例如, 如果创建目录/tmp/test
, 使用file.makdirs
后面需输入/tmp/test/
, 如果使用file.mkdir
后面输入/tmp/test
即可. 同时filemakdirs
不支持同时创建多个目录,file.mkdir
则支持file.move
: 移动文件或目录file.remove
和file.rename
: 删除文件及重命名文件file.rmdir
: 删除空目录
创建目录
1 |
|
创建文件
1 |
|
向文件追加内容
1 |
|
Status
用于查看 minion 的状态:
status.cpuinfo
: 查看 minion 的 cpu 信息status.cpustats
: 查看 minion 的 cpu 状态status.diskstats
: 查看 minion 的磁盘状态status.diskusage
: 查看 minion 某块磁盘的使用率status.meminfo
: 查看 minion 的内存信息status.netstats
: 查看 minion 的网络状态
查看 CPU 信息
1 |
|
配置脚本编写
配置脚本使用 YAML
语法, 但文件后缀为 .sls
(“Salt Language State”).
配置脚本的存放位置由 master 配置文件中的 file_roots
指定.
如创建 nginx.sls
文件, 内容为:
1 |
|
nginx_install:
是一个自定义的 State ID ,用于标识这个 State 的名称pkg.installed:
是要运行的 State 函数 (和模块有所不同)name:
是参数, 表明要安装的软件包的名称
利用 state
模块中的 sls
命令来运行:
1 |
|
另创建 httpd.sls
文件, 内容为:
1 |
|
可以编写 top.sls
来运行两个 .sls
文件:
1 |
|
State 函数
在 SLS 文件中使用的都是 State 函数, 其与模块有些区别:
- SLS 文件中的 State 函数是声明式的, 只需要声明目标状态, Salt 会根据当前状态自动执行相应的操作
- 直接执行模块是命令式的, 需要显式地执行操作, 不关心当前状态
查看与 state 函数相关的文档, 用:
1 |
|
而查看模块函数则是用:
1 |
|