在 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 %}

第二个嵌套循环救了我,但如果我很久以前就想到这个解决方案,我无法接受但现在我的头在燃烧我需要一些能正常工作的东西,请改进这个代码,我通常追求干净、整洁和优雅的代码,需要这方面的帮助!