或者条件不适用于我的剧本中的 set_facts

Or condition is not working with set_facts in my playbook

我根据测试用例为运行任务创建了一个剧本,所以我创建如下

这里当我通过 ansible-playbook playbook.yml -e stage=1 时,它跳过了所有任务,当我调试 test_case * 我可以看到两者都处于错误状态的值,所以可以帮助我处理这段代码。

---
 - name: test
   hosts: localhost
   tasks:
     - name: setting the level
       set_fact:
        test_case_1: "{{ stage == 1 }}"
        test_case_2: "{{ stage == 1 or stage == 2 }}"
  
     - name: "running ls command"
       shell: "ls -l"
       register: testing
       when:
          - test_case_1 == true

     - debug:
           msg: "{{ testing.stdout_lines }}"
       when:
          - test_case_1 == true

     - name: "kickoff"
       shell: "df -Th"
       register: kick
       when:
          - test_case_2 == true

     - name: "printing kickoff"
       debug:
          msg: "{{ kick.stdout_lines }}"
       when:
          - test_case_2 == true

下面是我得到的错误结果

[root@server ~]# ansible-playbook playbook.yml -e stage=1


PLAY [test] ***********************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************
ok: [localhost]

TASK [setting the level] **********************************************************************************************
ok: [localhost]

TASK [running ls command] *********************************************************************************************
skipping: [localhost]

TASK [debug] **********************************************************************************************************
skipping: [localhost]

TASK [kickoff] ********************************************************************************************************
skipping: [localhost]

TASK [printing kickoff] ***********************************************************************************************
skipping: [localhost]

PLAY RECAP ************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=4    rescued=0    ignored=0

[root@server ~]#

应该是预期的结果,应该执行剧中的所有任务。

您的问题是您正在执行整数比较 (stage == 1),但是当您通过 -e stage=1 在命令行上提供一个值时,您设置的是一个字符串值。

您可能希望使用 int 过滤器将 stage 的值大小写为整数。

---
- name: test
  hosts: localhost
  tasks:
    - name: setting the level
      set_fact:
        test_case_1: "{{ stage|int == 1 }}"
        test_case_2: "{{ stage|int == 1 or stage|int == 2 }}"

通过此更改,事情似乎按预期进行。


与你的问题无关,但你可以这样重写第二个测试:

{{ stage|int in [1, 2] }}

这稍微简化了事情。