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

问题描述

我创建了一个剧本来根据测试用例运行任务,因此我如下创建

在这里,当我通过 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] }}

这使事情简化了。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...