在 jinja for 循环中使用 jinja 变量作为 salt 函数的参数
Using jinja variable as an argument in salt function used in a jinja for loop
我已经搜索了很多,但我的新手使我无法找到有效的解决方案!
这是我的问题(不是那么复杂,或者我认为如此):
我的支柱数据:
server_access:
ops:
- salt-dev
ps:
- client-salt.example.com
rd:
ops_trainees:
然后是我的神社模板摘录:
{% set ldap_search_filter_additionnal = [] %}
{% for group in ['ops','ps','rd','ops_trainees'] %}
{% for servers in salt['pillar.get']('server_access:{{ group }}', {}) %}
{% if grains['fqdn'] == servers %}
{% set ldap_search_filter_additionnal = ldap_search_filter_additionnal.append('(isMemberOf="cn={{ group }},ou=test,dc=example,dc=com")') %}
{% endif %}
{% endfor %}
{% endfor %}
我期望循环遍历前 4 个值,然后是第二个(嵌套)循环以使用这 4 个值中的每一个作为 salt 函数的参数,然后如果它匹配 fqdn 添加一些 ldap 搜索过滤器和等等...
但是似乎不能在 salt 函数调用中使用 jinja 变量,对吗?
如果不是,您的专家建议是什么以获得预期的行为?
奖励:当 if 语句不正确时,你能确认神社循环不会 "break" 吗?
谢谢
UPDATE_1 :
在@Christophe Drevet-Droguet 的第一个命题之后:
我试过了,但我无法让它工作,或者至少不能满足我的需要,但我确实找到了 "kind of" 可以工作的东西,除非我只让它对第一个元素工作,通过以下尝试:
{%- set ldap_search_filter_additionnal = [] -%}
{%- for server_group, server_name in pillar['server_access'].iteritems() -%}
{%- if grains['fqdn'] == server_name[0] -%}
{%- set testo = '(isMemberOf=\"cn='+server_group+',ou=interne,dc=example,dc=com\")' -%}
{%- set ldap_search_filter_additionnal = ldap_search_filter_additionnal.append(testo) -%}
{%- endif -%}
{% endfor %}
我知道我只匹配(使用 if 语句)第一个元素,因为 "server_name[0]" 的“[0]”,到目前为止我不能做得更好,所以如果你有另一个改进请按我的需要制作作品:)
UPDATE_2 :
好吧,我终于得到了我为之奋斗的行为,但是代码有点笨拙,所以如果有人有让它更优雅的技巧,请把它扔在那里!
下面答案中的工作解决方案。
首先,您不能使用 {{ group }}
语法,因为您已经在 jinja 表达式中了。所以你必须使用这个语法:'server_access:' + group
其次,由于您的 pillar 数据包含服务器列表,我会提供一个空列表 []
作为默认值,这样无论 pillar 中是否有列表,表达式都以相同的方式工作.
{% for servers in salt['pillar.get']('server_access:' + group, []) %}
Jinja 通常不会因虚假陈述而中断。但是,如果变量不是您期望的类型,它很容易中断。因此 []
默认值。
作为奖励:为了轻松迭代字典,我使用以下语法:
{% for key, value in dict %}
工作解决方案:
{%- set ldap_search_filter_additionnal = [] -%}
{%- for serverGroup, serverName in pillar.get('server_access', {}).iteritems() -%}
{%- for serverNameFull in serverName -%}
{%- if serverNameFull == grains['fqdn'] -%}
{%- set testo = '(isMemberOf=\"cn='+serverGroup+',ou=interne,dc=eloquant,dc=com\")' -%}
{%- set ldap_search_filter_additionnal = ldap_search_filter_additionnal.append(testo) -%}
{%- endif -%}
{% endfor %}
{% endfor %}
第二个嵌套循环救了我,但如果我很久以前就想到这个解决方案,我无法接受但现在我的头在燃烧我需要一些能正常工作的东西,请改进这个代码,我通常追求干净、整洁和优雅的代码,需要这方面的帮助!
我已经搜索了很多,但我的新手使我无法找到有效的解决方案! 这是我的问题(不是那么复杂,或者我认为如此):
我的支柱数据:
server_access:
ops:
- salt-dev
ps:
- client-salt.example.com
rd:
ops_trainees:
然后是我的神社模板摘录:
{% set ldap_search_filter_additionnal = [] %}
{% for group in ['ops','ps','rd','ops_trainees'] %}
{% for servers in salt['pillar.get']('server_access:{{ group }}', {}) %}
{% if grains['fqdn'] == servers %}
{% set ldap_search_filter_additionnal = ldap_search_filter_additionnal.append('(isMemberOf="cn={{ group }},ou=test,dc=example,dc=com")') %}
{% endif %}
{% endfor %}
{% endfor %}
我期望循环遍历前 4 个值,然后是第二个(嵌套)循环以使用这 4 个值中的每一个作为 salt 函数的参数,然后如果它匹配 fqdn 添加一些 ldap 搜索过滤器和等等...
但是似乎不能在 salt 函数调用中使用 jinja 变量,对吗?
如果不是,您的专家建议是什么以获得预期的行为?
奖励:当 if 语句不正确时,你能确认神社循环不会 "break" 吗?
谢谢
UPDATE_1 :
在@Christophe Drevet-Droguet 的第一个命题之后: 我试过了,但我无法让它工作,或者至少不能满足我的需要,但我确实找到了 "kind of" 可以工作的东西,除非我只让它对第一个元素工作,通过以下尝试:
{%- set ldap_search_filter_additionnal = [] -%}
{%- for server_group, server_name in pillar['server_access'].iteritems() -%}
{%- if grains['fqdn'] == server_name[0] -%}
{%- set testo = '(isMemberOf=\"cn='+server_group+',ou=interne,dc=example,dc=com\")' -%}
{%- set ldap_search_filter_additionnal = ldap_search_filter_additionnal.append(testo) -%}
{%- endif -%}
{% endfor %}
我知道我只匹配(使用 if 语句)第一个元素,因为 "server_name[0]" 的“[0]”,到目前为止我不能做得更好,所以如果你有另一个改进请按我的需要制作作品:)
UPDATE_2 :
好吧,我终于得到了我为之奋斗的行为,但是代码有点笨拙,所以如果有人有让它更优雅的技巧,请把它扔在那里!
下面答案中的工作解决方案。
首先,您不能使用 {{ group }}
语法,因为您已经在 jinja 表达式中了。所以你必须使用这个语法:'server_access:' + group
其次,由于您的 pillar 数据包含服务器列表,我会提供一个空列表 []
作为默认值,这样无论 pillar 中是否有列表,表达式都以相同的方式工作.
{% for servers in salt['pillar.get']('server_access:' + group, []) %}
Jinja 通常不会因虚假陈述而中断。但是,如果变量不是您期望的类型,它很容易中断。因此 []
默认值。
作为奖励:为了轻松迭代字典,我使用以下语法:
{% for key, value in dict %}
工作解决方案:
{%- set ldap_search_filter_additionnal = [] -%}
{%- for serverGroup, serverName in pillar.get('server_access', {}).iteritems() -%}
{%- for serverNameFull in serverName -%}
{%- if serverNameFull == grains['fqdn'] -%}
{%- set testo = '(isMemberOf=\"cn='+serverGroup+',ou=interne,dc=eloquant,dc=com\")' -%}
{%- set ldap_search_filter_additionnal = ldap_search_filter_additionnal.append(testo) -%}
{%- endif -%}
{% endfor %}
{% endfor %}
第二个嵌套循环救了我,但如果我很久以前就想到这个解决方案,我无法接受但现在我的头在燃烧我需要一些能正常工作的东西,请改进这个代码,我通常追求干净、整洁和优雅的代码,需要这方面的帮助!