Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
条件Ansible角色在已执行时失败_Ansible_Ansible Role - Fatal编程技术网

条件Ansible角色在已执行时失败

条件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

我有一个角色,我希望执行多次,每次执行都使用不同的变量。但是,我也希望其中一些执行是有条件的

这是一个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 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([]) }}"