【发布时间】:2017-01-19 04:52:32
【问题描述】:
我已经搜索了很多,但我的新手阻止我找到有效的解决方案! 这是我的问题(不是那么复杂,或者我认为):
我的支柱数据:
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 %}
我知道我只匹配(使用 if 语句)第一个元素,因为“server_name[0]”的“[0]”,到目前为止我不能做得更好,所以如果你有另一个改进请按我的需要工作:)
UPDATE_2:
好的,我终于得到了我一直在争取的行为,但是代码有点尴尬,所以如果有人有让它更优雅的提示,请把它扔在那里!
以下答案中的工作解决方案。
【问题讨论】:
标签: for-loop jinja2 salt-stack