For loop 在jinja for循环中使用的salt函数中使用jinja变量作为参数

For loop 在jinja for循环中使用的salt函数中使用jinja变量作为参数,for-loop,jinja2,salt-stack,For Loop,Jinja2,Salt Stack,我已经搜索了很多次了,但是我的新思维阻止我找到一个有效的解决方案! 这是我的问题(不是那么复杂,或者我是这么想的): 我的支柱数据: server_access: ops: - salt-dev ps: - client-salt.example.com rd: ops_trainees: 然后我的jinja模板摘录: {% set ldap_search_filter_additionnal = [] %} {% for group in ['ops','p

我已经搜索了很多次了,但是我的新思维阻止我找到一个有效的解决方案! 这是我的问题(不是那么复杂,或者我是这么想的):

我的支柱数据:

server_access:
  ops: 
    - salt-dev
  ps:
    - client-salt.example.com
  rd:
  ops_trainees:
然后我的jinja模板摘录:

{% 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语句不正确,您能确认jinja循环不会“中断”吗

谢谢

更新\u 1

在@Christophe Drevet Droguet的第一个命题之后: 我试过了,但我不能让它工作,或者至少不能满足我的需要,但我确实找到了“某种”工作的东西,除非我只让它在第一个元素上工作,通过以下尝试:

{%- 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]”,到目前为止我还做不到更好的事情,因此如果您有其他改进,以便按照我的需要进行工作,请:)

更新\u 2:

{%- 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 %}
好吧,我终于明白了我一直在争取的行为,但是代码有点笨拙,所以如果有人有让它更经典的技巧,请把它扔到那里


工作解决方案如下。

首先,您不能使用
{{group}
语法,因为您已经在一个jinja表达式中。因此,您必须使用以下语法:
'server\u access:'+group

其次,由于您的支柱数据包含服务器列表,我将提供一个空列表作为默认值,
[]
,以便在支柱中是否存在列表时,表达式的工作方式相同

{% for servers in salt['pillar.get']('server_access:' + group, []) %}
Jinja通常不会在虚假陈述上破口大骂。但是,如果变量不是您期望的类型,它很容易中断。因此,默认值为
[]

作为奖励:为了在dict上轻松迭代,我使用以下语法:

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

第二个嵌套循环救了我,但是如果我很久以前想到这个解决方案,我不能接受它,但是现在我的脑袋烧焦了,我需要一些可以正常工作的东西,请改进这个代码,我通常选择干净、整洁和优雅的代码,需要帮助

非常感谢Christophe的回答,我终于找到了答案,请查看接受的答案。如果您只是将
serverName
替换为
serverList
serverNameFull
替换为
serverName
,那么您的代码应该更容易理解。问题是,您的支柱中有每个组的服务器列表,而不是服务器名称。如果您只需要一台服务器,则不应使用列表,而应使用简单的值,并且不需要第二个循环。感谢Christophe,您对我的变量名的看法是正确的!我实际上需要多台服务器,这就是为什么我使用了一个列表,每个组中只有一台服务器用于我的测试(我同意这不是很聪明),但我确实在每个组中有多台服务器。。。非常感谢你的洞察力