或者条件不适用于我的剧本中的 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] }}
这稍微简化了事情。
我根据测试用例为运行任务创建了一个剧本,所以我创建如下
这里当我通过 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] }}
这稍微简化了事情。