如何比较 saltstack 的 jinja2 if 语句中的嵌套支柱键值
How to compared a nested pillar key value in an if statement in jinja2 for saltstack
我正在用 jinja2 包裹一些盐来处理 saltstack 状态。
当我尝试使用 jinja2 比较来自柱子的值时,参数似乎没有计算结果。
如果我使用 salt cli 查询该值,它 return 是预期值。
我想我在 jinja2 的 if 语句中错误地引用了值。
以下是理解和查看此问题所需的全部信息:
Salt Master id 是 salt-dev
Salt Minion id 在同一实例上并且是 salt-dev
这里是柱顶文件:
base:
'salt-dev':
- docker-daemon.docker-daemon
这是位于 /srv/pillar/docker-daemon/docker-daemon.sls
的嵌套支柱文件
docker-daemon:
- action: start
- runlevel: enabled
这是 salt cli 命令的输出 returning minion salt-dev 的支柱内容:
# salt 'salt-dev' pillar.items
salt-dev:
----------
docker-daemon:
|_
----------
action:
start
|_
----------
runlevel:
enabled
这是我在 if 语句中使用的值的输出,其中值 returns 与 jinja2 无关,但 returns 与 cli 的预期一样:
# salt 'salt-dev' pillar.get docker-daemon:action
salt-dev:
start
不正确的jinja2行是:
{% if salt['pillar.get']('docker-daemon:action') == 'start' %}
看起来:salt['pillar.get']('docker-daemon:action')
return没什么,但是从上面显示的 cli 中它做了 return 一些事情。
另外,如果我添加一个默认值,在这个 arg return 什么都不做的情况下使用,它也有效。
添加默认值的例子是:
{% if salt['pillar.get']('docker-daemon:action', 'def_value') == 'start' %}
我已经在下面的上下文中展示了它:
这是 if 语句有相同问题的状态文件:
{% if ( (grains['osfinger'] == 'Oracle Linux Server-6') and (grains['osarch'] == 'x86_64')) %}
sync_docker-init:
file.managed:
- name: /etc/init.d/docker
- source: salt://docker-daemon/templates/docker-init
- user: root
- group: root
- mode: 755
action_docker-init:
{% if salt['pillar.get']('docker-daemon:action') == 'start' %}
service.running:
{% endif %}
{% if salt['pillar.get']('docker-daemon:action') == 'stop' %}
service.dead:
{% endif %}
- name: docker
- require:
- pkg: install_docker-engine
- watch:
- file: sync_docker-init
{% if salt['pillar.get']('docker-daemon:runlevel') == 'enabled' %}
-- enable: True
{% endif %}
{% if salt['pillar.get']('docker-daemon:runlevel') == 'disabled' %}
-- enable: False
{% endif %}
{% else %}
event.send:
- tag: 'salt/custom/docker-init/failure'
- data: "Management of docker init failed, OS not permitted."
{% endif %}
我目前对 salt 和 jinja2 还很陌生,所以这是 101 个东西,但我希望能得到一些帮助,几个小时以来我什么也没找到。
我试图回应这一点,但似乎我只是得到了一个空白行
我找到了解决方案。
支柱文件 /srv/pillar/docker-daemon/docker-daemon.sls
形成为列表而不是地图。
我改成了这样:
docker-daemon:
action: restart
runlevel: disabled
我正在用 jinja2 包裹一些盐来处理 saltstack 状态。
当我尝试使用 jinja2 比较来自柱子的值时,参数似乎没有计算结果。
如果我使用 salt cli 查询该值,它 return 是预期值。
我想我在 jinja2 的 if 语句中错误地引用了值。
以下是理解和查看此问题所需的全部信息:
Salt Master id 是 salt-dev
Salt Minion id 在同一实例上并且是 salt-dev
这里是柱顶文件:
base:
'salt-dev':
- docker-daemon.docker-daemon
这是位于 /srv/pillar/docker-daemon/docker-daemon.sls
docker-daemon:
- action: start
- runlevel: enabled
这是 salt cli 命令的输出 returning minion salt-dev 的支柱内容:
# salt 'salt-dev' pillar.items
salt-dev:
----------
docker-daemon:
|_
----------
action:
start
|_
----------
runlevel:
enabled
这是我在 if 语句中使用的值的输出,其中值 returns 与 jinja2 无关,但 returns 与 cli 的预期一样:
# salt 'salt-dev' pillar.get docker-daemon:action
salt-dev:
start
不正确的jinja2行是:
{% if salt['pillar.get']('docker-daemon:action') == 'start' %}
看起来:salt['pillar.get']('docker-daemon:action')
return没什么,但是从上面显示的 cli 中它做了 return 一些事情。
另外,如果我添加一个默认值,在这个 arg return 什么都不做的情况下使用,它也有效。
添加默认值的例子是:
{% if salt['pillar.get']('docker-daemon:action', 'def_value') == 'start' %}
我已经在下面的上下文中展示了它:
这是 if 语句有相同问题的状态文件:
{% if ( (grains['osfinger'] == 'Oracle Linux Server-6') and (grains['osarch'] == 'x86_64')) %}
sync_docker-init:
file.managed:
- name: /etc/init.d/docker
- source: salt://docker-daemon/templates/docker-init
- user: root
- group: root
- mode: 755
action_docker-init:
{% if salt['pillar.get']('docker-daemon:action') == 'start' %}
service.running:
{% endif %}
{% if salt['pillar.get']('docker-daemon:action') == 'stop' %}
service.dead:
{% endif %}
- name: docker
- require:
- pkg: install_docker-engine
- watch:
- file: sync_docker-init
{% if salt['pillar.get']('docker-daemon:runlevel') == 'enabled' %}
-- enable: True
{% endif %}
{% if salt['pillar.get']('docker-daemon:runlevel') == 'disabled' %}
-- enable: False
{% endif %}
{% else %}
event.send:
- tag: 'salt/custom/docker-init/failure'
- data: "Management of docker init failed, OS not permitted."
{% endif %}
我目前对 salt 和 jinja2 还很陌生,所以这是 101 个东西,但我希望能得到一些帮助,几个小时以来我什么也没找到。
我试图回应这一点,但似乎我只是得到了一个空白行
我找到了解决方案。
支柱文件 /srv/pillar/docker-daemon/docker-daemon.sls
形成为列表而不是地图。
我改成了这样:
docker-daemon:
action: restart
runlevel: disabled