使用jinja变量作为jinja for loop

时间:2017-01-15 19:34:16

标签: 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','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循环没有“中断”吗?

由于

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

据我所知,由于“server_name [0]”的“[0]”,我匹配(使用if语句)只有第一个元素,到目前为止我还没有做得更好,所以如果你有另一个改进按照我的需要工作,请:)

UPDATE_2:

好的,我终于得到了我为之奋斗的行为,但代码有点尴尬,所以如果有人有提示让它更加优雅,请把它扔到那里!

下面的答案中的工作解决方案。

2 个答案:

答案 0 :(得分:0)

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

其次,由于你的支柱数据包含服务器列表,我会提供一个空列表[]作为默认值,这样如果列中有列表,表达式的工作方式是否相同。 / p>

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

作为奖励:在dict上轻松迭代,我使用这种语法:

{% for key, value in dict %}

答案 1 :(得分:0)

工作解决方案:

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

第二个嵌套循环是什么救了我,但如果我很久以前想到这个解决方案,我无法接受它,但现在我的脑袋正在燃烧我需要一些正常工作的东西,请改进这个代码,我通常会去干净,整洁,优雅的代码,需要帮助!