是否可以使用Jinja基于salt环境渲染Salt状态文件?
这是一个为服务器设置时区的简单示例。如果我们处于“开发”环境中,我想将时区设置为纽约,否则时区应设置为伦敦。
时区.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
我认为小黄人应该有一些身份,以了解角色或环境。
这是你可以做的。
第 1 步: 将谷物分配给小黄人,例如谷物名称
circle
或 env
和值将取决于小黄人的类型,即 dev
、live
、staging
等。
salt '*dev*' grains.setval circle dev
salt '*live*' grains.setval circle dev
第 2 步: 在状态文件中,您可以执行以下操作来获取
grain value
,然后根据 circle
您可以运行或分配值。这里我根据粒度值执行不同的cmd.run
测试.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', '') %}
我知道我有点晚了,但是如果这满足您的要求,请尝试一下:
# 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
测试台-
# tb/top.sls
tb:
'minion1':
- whatever
如果有人仍在寻找答案:
{% set saltenv = salt.config.get('saltenv') %}
{% if saltenv == 'dev' %}
America/New_York
{% else %}
Europe/London
{% endif %}
timezone.system