有时候在Ansible的playbook中,使用set_fact和循环中的if语句可能无法正常工作。这是因为在循环中使用if时,Ansible默认只执行第一个符合条件的任务,并跳过其他任务。为了解决这个问题,我们可以使用break语句来中断Ansible的循环,确保只有一个任务被执行。
示例代码如下:
- name: Set fact if condition met
set_fact:
my_fact: "my_value"
when: item == "test"
loop:
- "hello"
- "test"
- "world"
- "test"
add the code below to ensure only one task is executed
register: result
until: result is succeeded
retries: 1
when: result is failed and 'No items found for' not in result.stdout
vars:
ansible_retry:
retries: 1
delay: 5
add the task below to break the loop
when: result.stdout is search("Changed: 1")
loop_control:
break: true
在上面的示例中,我们使用了若干个关键字来确保只有一个任务被执行并中断循环。我们首先将任务执行的条件设置为item == "test",而loop数组中包含了多个元素。这样,只有当循环中的元素为"test"时,才会执行set_fact任务。
接下来,我们使用register关键字将循环结果注册到result变量中,并添加了一些额外的参数。这个步骤可以延长失败的重试机会。
最后,我们检查result.stdout属性是否包含"Changed: 1",以判断任务是否已经成功执行。如果是,就使用loop_control.break来中断循环,确保只有一个任务被执行。