7

在 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

但是x在 *state_a* 和 *state_b* 中不被识别

我还尝试使用以下内容设置支柱值:

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

但这也没有用。

还有其他想法吗?

4

4 回答 4

1

我想听听专家怎么说,但我有一个类似的用例。我所做的是使用jinja 模板来扩展基本模板,然后我的子模板填充变量。

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

唯一的问题可能是您现在必须分别调用 state_a 和 state_b 但如果您希望两者都被调用,您始终可以将它们放在逗号分隔的列表中。

于 2014-03-24T15:46:34.593 回答
1

让你的 redis 状态成为一个 jinja 宏。

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


state_a.sls
-----------
{% from 'redis.sls' import redis  %}
{{ redis(1) }}


state_b.sls
-----------
{% from 'redis.sls' import redis  %}
{{ redis(2) }}

为清楚起见,redis.sls 应在此处重命名为 redis.jinja。

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

请注意,您的 if x==1 逻辑可能完全可以避免,请查看指南中 haproxy 示例的“更好”版本。

于 2015-12-21T19:08:22.420 回答
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。在我看来,您所询问的参数传递将不那么明确。

于 2014-04-03T01:03:21.627 回答
-1

SALT.STATES.ENVIRON might work for you:

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"]'
于 2016-05-07T11:29:55.460 回答