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

问题描述 投票:0回答:3

是否可以使用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
salt-stack
3个回答
0
投票

我认为小黄人应该有一些身份,以了解角色或环境。

这是你可以做的。

第 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', '') %}

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

测试台-

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

0
投票

如果有人仍在寻找答案:

{% set saltenv = salt.config.get('saltenv') %}
{% if saltenv == 'dev' %}
America/New_York
{% else %}
Europe/London
{% endif %}
  timezone.system
© www.soinside.com 2019 - 2024. All rights reserved.