You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:07:48