1

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

这是一个 main.yml:

- hosts: localhost
  roles:
    - { role: test, test_files_group: 'a'}
    - { role: test, test_files_group: 'b', when: False}

这是来自“测试”角色 ( ) 的 main.yml roles/test/tasks/main.yml

- name: List files
  command: "find . ! -path . -type f"
  args:
    chdir: "{{ role_path }}/files/{{ test_files_group }}"
  register: files
- debug: var=files.stdout_lines

- name: do something with the files
  shell: "echo {{ item }}"
  with_items: "{{ files.stdout_lines }}"

这是 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”,但随后do something with the files为 b 执行任务,即使我设置了when: False.

我觉得我错过了一些东西 - 我想要的是roles/test/tasks/main.yml用相应的 var 设置执行所有内容test_files_group,或者根本不执行。我究竟做错了什么?:)

4

1 回答 1

2

您可能想了解如何when使用包含角色

在您的情况下,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

跳过第一个和第二个任务(请参阅您的输出),并在第三个任务when语句中应用于每次迭代,但是...起初 Ansible 尝试评估但with_items: "{{ files.stdout_lines }}"未能这样做,因为List files任务被跳过,所以有没有files.stdout_lines

如果要解决此问题,请使用默认的 for 循环参数,例如:

with_items: "{{ files.stdout_lines | default([]) }}"

但我建议重构你的代码,不要对角色使用“条件”。

于 2017-01-16T18:57:02.910 回答