首页 文章

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

提问于
浏览
2

是否可以使用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

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

    这是你能做的 .

    Step 1 : 为小兵分配粮食,例如粒子名称 circleenv 和值将取决于小兵的类型,即 devlivestaging 等 .

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

    Step 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
    

    如果您对minions有绝对 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
    

相关问题