Условные роли Ansible не работают, когда они уже выполнены

У меня есть роль, которую я хотел бы выполнять несколько раз, каждое выполнение с другой переменной. Однако я бы также хотел, чтобы некоторые из этих казней были условными.

Вот файл 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 выполнялось с соответствующим установленным test_files_group var или не выполнялось вовсе. Что я делаю неправильно? :)


person Mark    schedule 16.01.2017    source источник


Ответы (1)


Возможно, вы захотите прочитать, как when работает с includes и ролями.

В вашем случае 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

1-я и 2-я задачи пропускаются (см. Ваш вывод), а в 3-й задаче оператор when применяется к каждой итерации, но ... сначала Ansible пытается оценить with_items: "{{ files.stdout_lines }}" и не может этого сделать, потому что List files < / em> задача пропущена, значит нет files.stdout_lines.

Если вы хотите исправить это, используйте аргумент цикла по умолчанию, например:

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

Но я бы рекомендовал провести рефакторинг вашего кода и не использовать «условные выражения» с ролями.

person Konstantin Suvorov    schedule 16.01.2017