Saltstack - 如何使用基于saltenv的Jinja逻辑

时间:2015-08-11 11:25:51

标签: salt-stack

是否可以根据salt环境使用Jinja呈现Salt状态文件?

这是设置服务器时区的简单示例。如果我们在“开发者”中,我想将时区设置为纽约。环境,否则时区应设置为伦敦。

timezone.sls

{% if saltenv == 'dev' %}
America/New_York
{% else %}
Europe/London
{% endif %}
  timezone.system

执行salt '*' state.sls timezone saltenv='dev'会出错:

Rendering SLS "base:timezone" failed: Jinja variable 'saltenv' is undefined; line 1

编辑 - 根据要求,这里是' top.sls'的内容。文件:

base:
  '*':
    - basic
    - git

2 个答案:

答案 0 :(得分:0)

我认为仆从应该有一些认识来了解角色或环境。

这是你可以做的。

第1步:将粒子分配给小兵,例如粒子名称circleenv和值将取决于小兵的类型,即devlivestaging等。

salt '*dev*' grains.setval circle dev
salt '*live*' grains.setval circle dev

第2步:在状态文件中,您可以执行以下操作来获取grain value,然后根据circle运行或分配值。在这里,我根据粒度值执行不同的cmd.run

<强> test.sls

{% set circle = salt['grains.get']('circle', '') %}

run_cmd:
  cmd.run:
{% if circle == 'dev' %}
    - name: 'echo dev'
{% else %}
    - name: 'echo live'
{% endif %}

现在,如果您运行以下命令,它将根据圆圈运行命令。

salt '*' state.sls test

如果您对仆从有绝对id,也可以这样做,例如如果dev minion id始终为dev-server,那么您可以运行以下命令并对其应用条件。

{% set id = salt['grains.get']('id', '') %}

答案 1 :(得分:0)

我知道我有点晚了,但如果符合你的要求,请试试这个:

# check_saltenv.sls
{% import_yaml "top.sls" as defaults %}
{% set env = defaults.iteritems()|first %}
check_saltenv_file:
  cmd.run:
{% if 'prod' in env %}
    - name: echo 'prod' > /tmp/check_saltenv.txt
{% elif 'tb' in env %}
    - name: echo 'tb' > /tmp/check_saltenv.txt
{% elif 'dev' in env %}
    - name: echo 'dev' > /tmp/check_saltenv.txt
{% endif %}

我认为您的top.sls文件中的生产/测试平台/开发环境如下所示:

生产 -

# prod/top.sls
prod:
  'minion1':
    - whatever

发展 -

# dev/top.sls
dev:
  'minion1':
    - whatever

Testbed -

# tb/top.sls
tb:
  'minion1':
    - whatever
相关问题