基于主机名的多OS及版本Salt SLS文件配置方案咨询
适配多操作系统与版本的Salt SLS配置方案
这场景其实很适合用Salt的grains和pillar来做分层配置,既能复用代码又能灵活适配不同主机的需求,我给你拆解下具体的实现步骤:
1. 利用Grains识别操作系统
Salt自带的grains会自动收集主机的系统信息,其中os(比如返回Ubuntu或CentOS)和os_family字段可以帮我们区分不同的操作系统类型,这是后续动态配置的基础。你可以先在目标主机上执行以下命令确认grains信息:
salt 'app-101-1' grains.item os os_family
2. 用Pillar存储主机专属软件配置
Pillar是Salt用来存储敏感或主机专属配置的最佳方式,我们可以在这里定义每个主机对应的软件名称、版本、包类型和本地源路径。
创建Pillar配置文件
新建/srv/pillar/software/packages.sls,内容如下:
app-101-1: software: app version: 1.0.1 package_type: deb package_source: salt://packages/app/app_1.0.1_amd64.deb app-101-2: software: app version: 1.0.1 package_type: rpm package_source: salt://packages/app/app-1.0.1-x86_64.rpm dev-231-1: software: dev version: 2.3.1 package_type: rpm package_source: salt://packages/dev/dev-2.3.1-x86_64.rpm
注意:把本地rpm/deb包放到Salt文件服务器的对应路径下(比如
/srv/salt/packages/app/),确保minion能访问到。
关联Pillar与主机
修改/srv/pillar/top.sls,让目标主机加载对应的pillar配置:
base: '*': - software.packages
这里用*匹配所有主机,每个主机都会根据自己的主机名(grains['id'])拿到对应的配置项。
3. 编写通用的SLS状态文件
接下来我们写一个通用的状态文件,用Jinja模板根据grains和pillar的动态值生成适配不同主机的部署逻辑。
新建/srv/salt/software/install.sls,内容如下:
{% set host_config = salt['pillar.get'](grains['id'], {}) %} {% if host_config %} install-target-software: pkg.installed: - name: {{ host_config.software }} - version: {{ host_config.version }} - sources: - {{ host_config.software }}: {{ host_config.package_source }} {% else %} no-software-configured: cmd.run: - name: echo "No software configuration found for host {{ grains['id'] }}" - stateful: False {% endif %}
这段代码的逻辑是:
- 通过
grains['id']获取当前主机名,再从pillar中取出对应的配置 - 如果配置存在,就调用
pkg.installed模块,根据配置的版本和本地源安装软件 - 如果没有找到对应配置,就输出提示信息(避免无意义的错误)
4. 分配状态并执行
修改/srv/salt/top.sls,让目标主机应用这个状态:
base: '*': - software.install
现在你可以测试单个主机的部署:
salt 'app-101-1' state.apply software.install
或者批量执行所有主机:
salt '*' state.apply
优化建议
- 如果有大量同类型、同版本的主机,可以在pillar中用grains匹配分组,比如按
os或自定义grains字段批量配置,减少重复代码 - 可以给pillar配置添加默认值,避免个别主机没有配置时出错
- 对于需要额外依赖的软件,可以在状态文件中添加
require或watch字段,确保依赖先安装
内容的提问来源于stack exchange,提问作者Martin




