【问题标题】:Ansible include_tasks with loop failed to check when condition带有循环的 Ansible include_tasks 无法检查何时条件
【发布时间】:2020-05-17 04:18:25
【问题描述】:

我想根据任务中设置的条件来包含任务。

tasks:
- name: SET INIT STATUS
  set_facts:
    passed: true

- name: INCLUDE TASKS WITH LOOP
  include_tasks: update_status.yml
  loop: [1, 2, 3]
  when: passed

update_status.yml:

- name: OUTPUT THE STATUS
  debug: msg="ITEM: {{item}} has status {{passed}}"
- name: UPDATE the Status
  set_fact:
    passed: false

我期望它只会为项目 1 运行一次,因为在它运行后,它会将状态更改为 false,然后条件检查失败。但它实际上运行了 3 次,所以看起来它不会在循环期间再次检查状态。

这是输出

TASK: [SET INIT STATUS]
ok: [localhost]

TASK: [INCLUDE TASKS WITH LOOP]
included: simple.yml for localhost
included: simple.yml for localhost
included: simple.yml for localhost

TASK: [OUTPUT THE STATUS]
ok: [localhost] => {
    "msg": ITEM 1 has status True
}

TASK: [UPDATE the Status]
ok: [localhost]

TASK: [OUTPUT THE STATUS]
ok: [localhost] => {
    "msg": ITEM 2 has status False
}

TASK: [UPDATE the Status]
ok: [localhost]

TASK: [OUTPUT THE STATUS]
ok: [localhost] => {
    "msg": ITEM 3 has status False
}

TASK: [UPDATE the Status]
ok: [localhost]

【问题讨论】:

    标签: loops ansible


    【解决方案1】:

    在尝试了不同的方法后,我能够通过将循环放在一个块中来实现我想要的。

    - name: LOOP WITH INCLUDE_TASK INSIDE BLOCK
      block:
        - name: LOOP WITH INCLUDE_TASK
          include_tasks: simple.yml
          loop: [1, 2, 3]
      when: passed
    

    这是结果

    TASK [SET passed] ******************************************************************************************
    ok: [localhost]
    
    TASK [LOOP WITH INCLUDE_TASK] ******************************************************************************************
    included: /home/richard/samples/simple.yml for localhost
    included: /home/richard/samples/simple.yml for localhost
    included: /home/richard/samples/simple.yml for localhost
    
    TASK [SHOW THE STATUS] ******************************************************************************************
    ok: [localhost] => {
        "msg": "Item 1 has status True"
    }
    
    TASK [CHANGE THE STATUS] ******************************************************************************************
    ok: [localhost]
    
    TASK [SHOW THE STATUS] ******************************************************************************************
    skipping: [localhost]
    
    TASK [CHANGE THE STATUS] ******************************************************************************************
    skipping: [localhost]
    
    TASK [SHOW THE STATUS] ******************************************************************************************
    skipping: [localhost]
    
    TASK [CHANGE THE STATUS] ******************************************************************************************
    skipping: [localhost]
    

    【讨论】:

      【解决方案2】:

      问:“循环检查条件失败。”

      A:有必要了解2点来解释这里发生了什么。

      1) 条件when: passed,当应用于include_tasks 时,将扩展为when: true,并将被所有包含的任务继承。这将使 update_status.yml 中的任务看起来更有效

      - name: OUTPUT THE STATUS
        debug: msg="ITEM: {{item}} has status {{passed}}"
        when: true
      
      - name: UPDATE the Status
        set_fact:
          passed: false
        when: true
      

      2) 同时,条件when: passed,应用于loop,决定循环是否开始。一旦循环开始,它将不再考虑条件并运行所有迭代。

      这解释了任务的结果。

      注意事项:

      • ATM(Ansible 2.9 版)无法在 Ansible 中中断循环。

      • 在条件 when: passed|bool 中显式转换布尔裸变量是个好主意。见Bare variables in conditionals


      代码中有2个语法错误:

      • “错误!无法解析模块/操作‘set_facts’”。没有模块set_facts

      正确的语法

      - name: SET INIT STATUS
        set_fact:
          passed: true
      
      • “加载 YAML 时出现语法错误。在此上下文中不允许映射值 ... - 名称:输出状态\n 调试:msg=\”项目:{{item}} 的状态为 {{passed}}\ "

      正确的语法

      - name: OUTPUT THE STATUS
        debug:
          msg: "ITEM: {{ item }} has status {{ passed }}"
      

      【讨论】:

        【解决方案3】:

        我认为你遇到了一个有趣的 Jinja 副作用。试试这个作为你的条件。

        when: passed|bool

        这将确保它被评估为骨骼表达式。

        【讨论】:

          猜你喜欢
          • 2022-12-07
          • 2022-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-09
          • 2017-11-07
          • 2011-09-09
          • 2017-11-12
          相关资源
          最近更新 更多