在 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 }}
我有好几个状态都差不多。他们都部署项目,创建 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 }}