在盐状态之间传递变量

时间:2014-03-19 11:05:20

标签: salt-stack

在Saltstack中,我有以下用例:

有一个状态redis.sls可以包含在其他州。 redis.sls的结果应该以不同的方式配置,具体取决于包含redis.sls的状态。

例如:

redis.sls:
--------
{% if x==1 %}
   #do something
{% else %}
   #do something else
{% endif %}


state_a.sls
-----------
{% set x=1 %}
include:
  - redis

state_b.sls
-----------
{% set x=2 %}
include:
  - redis

但* state_a *和* state_b *

中无法识别 x

我也试过设置这样的支柱值:

{{salt['pillar.set']('x', 1)}}

但这也不起作用。

还有其他想法吗?

4 个答案:

答案 0 :(得分:1)

我想听听专家的意见,但我有类似的用例。我所做的是使用jinja template扩展基本模板,然后我的子模板填充变量。

{% extends "base.template.sls" %}
{% block x %}1{% endblock %}

唯一的问题可能是您现在必须单独调用state_a和state_b,但如果您想要两者都调用,则可以将它们放在以逗号分隔的列表中。

答案 1 :(得分:1)

让你的redis状态为jinja宏。

eventID

为了清楚起见,redis.sls应该在这里重命名为redis.jinja。

Salt Formulas conventions guide中最好地解释了这个以及管理状态定制的许多其他方法。特别是关于Jinja宏的部分

请注意,您可以完全避免使用if x == 1逻辑,看一下“更好”的情况。指南中的haproxy示例。

答案 2 :(得分:0)

看起来您希望根据取决于它的内容或使用位置来参数化状态。这听起来像是设置redis.sls状态应该变异的参数,取决于redis的特定配置。

对我而言,似乎有多个不同的状态可以使用redis,并且您的某些状态依赖于一种redis状态,而其他状态依赖于其他状态的redis。

所以,给redis安装一个状态,redis的具体配置各自得到自己的状态。您的 state_a 可能取决于 redis_state_1 ,而 state_b 依赖于 redis_state_2 redis_state_1 redis_state_2 都取决于 redis 。在我看来,传递给你的参数不太明确。

答案 3 :(得分:-1)

SALT.STATES.ENVIRON可能适合您:

set_secret_key:
  environ.setenv:
    - name: SECRET_KEY
    - value: ABC123!@#abc
    - update_minion: True

[..]

settings_secret_key:
  file.replace:
    - name: {{ salt['pillar.get']('data:source_folder') }}superlists/settings.py
    - pattern: "SECRET_KEY =.+$"
    - repl: 'SECRET_KEY = os.environ["SECRET_KEY"]'