文章目录
1. 安装
按照saltstack官网的引导准备安装。官网地址:
http://docs.saltstack.cn/topics/installation/rhel.html
配置好repo,发现 repo 网络不通
[saltstack-repo]
name=SaltStack repo for RHEL/CentOS $releasever
baseurl=https://repo.saltstack.com/yum/redhat/$releasever/$basearch/latest
enabled=1
gpgcheck=1
gpgkey=https://repo.saltstack.com/yum/redhat/$releasever/$basearch/latest/SALTSTACK-GPG-KEY.pub
由于使用了 centos 7.6 的操作系统,无奈之下,在 epel 源网站中下载相应软件包。
网址:
http://download.fedoraproject.org/pub/archive/epel/7.2019-05-29/x86_64/Packages/s/
软件包:
salt-2015.5.10-2.el7.noarch.rpm
salt-master-2015.5.10-2.el7.noarch.rpm
salt-minion-2015.5.10-2.el7.noarch.rpm

上传软件包,在 salt-master 节点使用 yum 安装并启动
yum install salt-2015.5.10-2.el7.noarch.rpm salt-master-2015.5.10-2.el7.noarch.rpm
systemctl start salt-master.service
启动报错,需要安装 zeromq
yum install zeromq-devel

安装 zeromq 之后,salt-master 可以顺利启动了。

同理,在 salt-minion 节点使用 yum 安装,安装 zeromq,并启动
yum install salt-2015.5.10-2.el7.noarch.rpm salt-minion-2015.5.10-2.el7.noarch.rpm
2. 基础配置
修改 /etc/salt/minion 中 master 值为 master server 地址,如果使用域名,需要确保能 ping 通。

在 /etc/salt/pki/master 路径下,使用 tree 和 salt-key 命令查看。图中 2 台需要 master 进行认证


salt 通过公钥加密和认证 minions。想要让 minion 从 master 端接受命令,minions 的密钥需要被 master 接受。使用 salt-key -a 命令确认主机。

使用 salt-key -L 命令查询所有minion ID

3. 使用示例
3.1 创建状态目录结构
修改 /etc/salt/master,取消第416-418行注释。

以安装 httpd 为例,创建状态目录结构
mkdir -p /srv/salt/httpd/files
/srv/salt/
├── top.sls # 状态入口文件
├── httpd/ # 状态模块目录
├── init.sls
└── files/ # 相关文件
└── httpd.conf
3.2 编写 top.sls
base:
'*':
- httpd
3.3 创建状态文件
/srv/salt/httpd/init.sls:
# 安装httpd软件包
httpd_pkg:
pkg.installed:
- name: httpd
# 管理主配置文件
httpd_config:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://httpd/files/httpd.conf
- user: root
- group: root
- mode: 644
- template: jinja
- require:
- pkg: httpd_pkg
# 确保服务运行并开机启动
httpd_service:
service.running:
- name: httpd
- enable: True
- watch:
- file: httpd_config
- require:
- pkg: httpd_pkg
- file: httpd_config
# 开放防火墙端口(可选)
httpd_firewall:
firewalld.present:
- name: public
- services:
- http
- https
- permanent: True
- immediate: True
3.4 准备配置文件模板
从原始配置复制并修改:
cp /etc/httpd/conf/httpd.conf /srv/salt/httpd/files/
3.5 应用状态
# 测试运行(dry-run)
salt 'minion-id' state.apply httpd test=True
# 实际应用
salt 'minion-id' state.apply httpd
# 或者使用highstate(推荐)
salt 'minion-id' state.highstate
3.6 验证安装
# 检查服务状态
salt 'minion-id' cmd.run 'systemctl status httpd'
# 检查监听端口
salt 'minion-id' cmd.run 'netstat -tulnp | grep httpd'
# 测试网页访问
salt 'minion-id' cmd.run 'curl -I localhost'
3.7 最佳实践
- 模块化设计:按功能/服务拆分状态文件
- 版本控制:所有状态文件应纳入Git等VCS
- 环境分离:使用不同环境(dev/stage/prod)
- 先测试后应用:始终先用 test=True 测试
- 文档化:为每个状态添加注释说明
Salt States 的强大之处在于将基础设施配置转化为可版本控制、可测试、可重复应用的代码,是实现DevOps自动化运维的关键工具。
4. 远程执行与状态管理的区别
SaltStack 的远程执行 (Remote Execution) 和状态管理 (State Management) 是两大核心功能,它们在自动化运维中扮演不同角色。
4.1 远程执行 (Remote Execution)
定义:直接在目标minion上执行命令或脚本,立即获得结果。
特点:
-
即时性:立即执行并返回结果
-
命令式:明确指定要运行的命令
-
无状态性:不关心系统当前状态,只执行命令
-
临时操作:适合一次性任务或紧急修复
常见用途:
-
查询系统信息(如 salt ‘*’ disk.usage)
-
服务管理(如 salt ‘*’ service.restart nginx)
-
软件包安装(如 salt ‘*’ pkg.install httpd)
-
文件传输(如 salt ‘*’ cp.get_file)
示例:
# 在所有minion上查看内存使用情况
salt '*' cmd.run 'free -h'
# 在web服务器组上重启Apache
salt 'web*' service.restart apache2
4.2 状态管理 (State Management)
定义:声明系统应该处于什么状态,由 SaltStack 确保系统符合该状态。
特点:
- 声明式:描述系统应该达到的状态,而非具体操作步骤
- 幂等性:多次执行结果一致,只在必要时才进行更改
- 状态保持:持续确保系统符合定义的状态
- 配置即代码:使用SLS文件定义状态
常见用途:
- 系统配置管理(如确保特定配置文件存在且内容正确)
- 服务部署(如确保软件包安装且服务运行)
- 基础设施即代码
- 长期配置维护
示例:
# apache/init.sls
apache:
pkg.installed:
- name: apache2
service.running:
- enable: True
- require:
- pkg: apache
4.3 主要区别对比
| 特性 | 远程执行 | 状态管理 |
|---|---|---|
| 执行方式 | 命令式 (“做什么”) | 声明式 (“应该是什么状态”) |
| 关注点 | 立即执行特定命令 | 系统长期状态 |
| 幂等性 | 不一定 | 保证幂等 |
| 执行频率 | 按需执行 | 可定期执行保持状态一致 |
| 复杂度 | 简单直接 | 需要定义状态文件 |
| 典型用例 | 临时任务、查询 | 配置管理、服务部署 |
| 依赖管理 | 无 | 支持依赖关系定义 |
| 变更检测 | 不检测 | 检测并只应用必要变更 |
4.4 如何选择
使用远程执行:
- 快速查询信息
- 执行一次性任务
- 进行临时修复
- 测试命令效果
使用状态管理:
- 确保系统配置一致性
- 管理长期基础设施
- 实现可重复的部署
- 处理复杂的依赖关系
两者经常结合使用,例如用远程执行触发状态应用:salt ‘*’ state.apply
121

被折叠的 条评论
为什么被折叠?



