条件Ansible角色在已执行时失败
我有一个角色,我希望执行多次,每次执行都使用不同的变量。但是,我也希望其中一些执行是有条件的 这是一个main.yml:条件Ansible角色在已执行时失败,ansible,ansible-role,Ansible,Ansible Role,我有一个角色,我希望执行多次,每次执行都使用不同的变量。但是,我也希望其中一些执行是有条件的 这是一个main.yml: - hosts: localhost roles: - { role: test, test_files_group: 'a'} - { role: test, test_files_group: 'b', when: False} 下面是来自“test”角色的main.yml(roles/test/tasks/main.yml): 以下是ansible
- hosts: localhost
roles:
- { role: test, test_files_group: 'a'}
- { role: test, test_files_group: 'b', when: False}
下面是来自“test”角色的main.yml(roles/test/tasks/main.yml
):
以下是ansible playbook命令输出的一部分:
TASK [test : List files]
*******************************************************
changed: [localhost]
TASK [test : debug] ************************************************************
ok: [localhost] => {
"files.stdout_lines": [
"./testfile-a"
]
}
TASK [test : do something with the files] **************************************
changed: [localhost] => (item=./testfile-a)
TASK [test : List files] *******************************************************
skipping: [localhost]
TASK [test : debug] ************************************************************
skipping: [localhost]
TASK [test : do something with the files] **************************************
fatal: [localhost]: FAILED! => {"failed": true, "msg": "'dict object' has no attribute 'stdout_lines'"}
“a”的一切都按预期工作,但随后会对b执行对文件做点什么
任务,即使我将设置为when:False
我觉得我遗漏了什么-我想要的是
roles/test/tasks/main.yml
中的所有内容都使用test\u files\u组
var相应地执行,或者根本不执行。我做错了什么?:) 您可能想了解何时使用include和roles
在您的情况下,when:false
附加到第二次运行中的每个任务,因此您有:
- name: List files
command: "find . ! -path . -type f"
args:
chdir: "{{ role_path }}/files/{{ test_files_group }}"
register: files
when: false
- debug: var=files.stdout_lines
when: false
- name: do something with the files
shell: "echo {{ item }}"
with_items: "{{ files.stdout_lines }}"
when: false
跳过第一个和第二个任务(参见您的输出),在第三个任务中,当
语句应用于每个迭代时,,但是。。。首先,Ansible尝试使用以下项计算“{{files.stdout\u lines}}”
,但失败,因为列表文件任务被跳过,因此没有文件.stdout\u行
如果要解决此问题,请对循环参数使用默认值,例如:
with_items: "{{ files.stdout_lines | default([]) }}"
但我建议重构代码,不要对角色使用“条件”
with_items: "{{ files.stdout_lines | default([]) }}"