如何在Salt-Stack Formula中实现多服务共用一个配置文件?
Salt Formula迁移:多服务共用配置文件的实现方案
核心思路
利用Salt的状态extend特性,让每个服务的状态向统一的配置文件资源传递启用标识,最终通过Jinja模板根据这些标识生成包含通用+对应服务专属变量的配置文件,完全摆脱Grains依赖,支持任意组合部署。
实现步骤
1. 目录结构
myservice/ ├── _map.jinja # 通用变量定义(统一管理配置,便于维护) ├── config.sls # 基础配置状态,负责生成配置文件 ├── service1.sls # Service1的安装、启动状态 ├── service2.sls # Service2的安装、启动状态 └── templates/ └── myservice.conf.jinja # 配置文件模板
2. 基础配置状态(config.sls)
定义统一的配置文件资源,包含通用变量:
{% from 'myservice/_map.jinja' import myservice with context %} myservice_config_file: file.managed: - name: {{ myservice.config_file }} - source: salt://myservice/templates/myservice.conf.jinja - template: jinja - context: # 通用配置变量 common_vars: {{ myservice.common_vars }}
3. 服务专属状态(service1.sls/service2.sls)
每个服务状态负责自身的安装、启动,同时通过extend向配置文件资源添加启用标识:
service1.sls:
{% from 'myservice/_map.jinja' import myservice with context %} include: - myservice.config # 安装Service1 myservice_service1_install: pkg.installed: - name: {{ myservice.service1_pkg }} # 启动并启用Service1 myservice_service1_running: service.running: - name: {{ myservice.service1_service }} - enable: True - require: - pkg: myservice_service1_install - file: myservice_config_file # 传递Service1启用标识到配置文件 myservice_config_file: file.managed: - context: service1_enabled: True
service2.sls:
{% from 'myservice/_map.jinja' import myservice with context %} include: - myservice.config # 安装Service2 myservice_service2_install: pkg.installed: - name: {{ myservice.service2_pkg }} # 启动并启用Service2 myservice_service2_running: service.running: - name: {{ myservice.service2_service }} - enable: True - require: - pkg: myservice_service2_install - file: myservice_config_file # 传递Service2启用标识到配置文件 myservice_config_file: file.managed: - context: service2_enabled: True
4. 通用变量映射(_map.jinja)
统一管理所有变量,方便后续维护:
{% set myservice = salt['grains.filter_by']({ 'default': { 'config_file': '/etc/myservice.conf', 'common_vars': { 'myvar1': 'A' }, 'service1_pkg': 'myservice-service1', 'service1_service': 'myservice-service1', 'service2_pkg': 'myservice-service2', 'service2_service': 'myservice-service2' } }, merge=salt['pillar.get']('myservice:lookup', {})) %}
5. 配置文件模板(myservice.conf.jinja)
根据context中的启用标识渲染对应内容:
{{ common_vars.myvar1 }}=A {% if service1_enabled is defined and service1_enabled %} myvar2=B {% endif %} {% if service2_enabled is defined and service2_enabled %} myvar3=C {% endif %}
使用方式
用户只需在top.sls或其他状态文件中include需要的服务即可,自动生成对应配置:
include: # 仅部署Service1 - myservice/service1 # 或仅部署Service2 # - myservice/service2 # 或同时部署两个服务 # - myservice/service1 # - myservice/service2
方案优势
- Salt的
extend机制会自动合并同一个资源的参数,多个服务extend同一个file.managed时,context会被合并,模板能获取到所有启用标识。 - 完全不依赖Grains,用户无需额外配置roles,只需通过include控制服务部署。
- 配置文件由单一资源管理,避免了
file.append的覆盖或重复写入问题。
内容的提问来源于stack exchange,提问作者noonex
相关产品推荐
相关产品推荐

