在 salt-stack 中传递包含 include 的变量

Passing variables with include in salt-stack

我有好几个状态都差不多。他们都部署项目,创建 virtualenv 并配置 supervisor。区别仅在于回购、项目名称和一些额外的操作。

很多代码是重复的。是否可以将相同的部分放入文件并包含其他变量?

在 Ansible 中可以这样做:

tasks:
  - include: wordpress.yml
    vars:
        wp_user: timmy
        ssh_keys:
          - keys/one.txt
          - keys/two.txt

这个问题看起来类似于

如果我正确理解你的问题 - 我相信实现你想要的最好方法是使用 Salt Macros.

有了这个,你的大部分状态将转到宏,其中占位符是参数,例如:

# lib.sls
{% macro create_user(user, password) %}
{{user}}:
  user.present:
    - home: /home/{{user}}
    - password: {{password}}
{% endmacro %}

那么您的状态将如下所示:

# john.sls
{% from 'lib.sls' import create_user with context %}
{{ create_user('john', '<password hash>') }}

和:

# jane.sls
{% from 'lib.sls' import create_user with context %}
{{ create_user('john', '<password hash>') }}

正如我发现的,还有另一种方法可以在不弄乱模板的情况下对其进行归档(更 Ansible 的方法)。创建一个抽象状态 "python-project"。然后创建具体角色并为这些角色提供不同的支柱:

salt/top.sls:

base:
  'roles:python-project-1':
    - match: grain
    - python-project

  'roles:python-project-2':
    - match: grain
    - python-project

pillar/top.sls:

base:
  'roles:python-project-1':
    - match: grain
    - common-pillars
    - pillars-for-the-first

  'roles:python-project-2':
    - match: grain
    - common-pillars
    - pillars-for-the-second

结构:

pillar/top.sls
pillar/common-pillars/init.sls
pillar/pillars-for-the-first/init.sls
pillar/pillars-for-the-second/init.sls
salt/top.sls
salt/python-project/init.sls

您可以使用 Jinja 导入来做到这一点:

top.sls

{% set user = 'john' %}
{% include 'config.sls' %}

config.sls

file.managed:
  - name: '/Users/{{ user }}/.config
  - user: {{ user }}