【问题标题】:Nesting for loops in if statements in ansible在ansible中的if语句中嵌套for循环
【发布时间】:2017-12-16 06:19:24
【问题描述】:

我需要遍历一个变量列表并将<debug nested for loop> 代码嵌入到一个jinja2 模板中。

这就是剧本的样子

 vars:
  env:
  - dev
  - prod
  - staging

 tasks:
 - name: set variable
   set_fact:
   denv: 'dev'

 - name: debug for loop
   debug: msg='{% for i in env %} {{i}} {% endfor %}'

 - name: debug nested for loop
   debug: msg='{% if denv =='{% for i in env %} {{i}} {% endfor %}' %} yay {% else %} nay {% endif %}'

目标是遍历env 列表,如果值匹配denv,则打印yay,否则打印nay

关于如何更好地编写这个的任何想法?目前的写法是触发错误。

【问题讨论】:

  • 就像使用iffor 处理任何其他语言一样。看起来像是儿童最基本的编程课程第一个月的问题。您发布的示例甚至令人痛苦。
  • 如果您对您发布的某些代码(包含结构if a=(for i in ...) then .. else ...)违反基本编程知识的评论感到深深的冒犯,那是您个人的问题。如果你按照常识写for i in ...; if a=f(i)... then ... else ...,你的编程“问题”就有了解决方案,虽然没有机会展示你的大嘴巴。

标签: ansible jinja2


【解决方案1】:

我不确定为什么需要嵌套循环。您想要的是检查列表中的值吗?尝试使用 when 关键字。这样,您的调试消息只会在找到正确的值时才显示 Yay。

---

- hosts: localhost
  connection: local
  gather_facts: False
  vars:
    envs:
    - dev
    - prod
    - staging

  tasks:
    - name: set variable
      set_fact:
        denv: 'dev'
    - name: find dev
      debug: msg="Yay it's {{ item }}"
      with_items: "{{ envs }}"
      when: item == denv 

【讨论】:

  • 脚本需要进入 jinja2 格式的模板,这就是我使用原始语句的原因。
  • 在一个jinja2模板中,使用同样的逻辑:循环envs然后使用条件{% for e in envs %}{% if denv == e %} Yay it's {{ e }} {% else %} Nay it's not {{ e }} {% endif %}{% endfor %}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多