Назад | Перейти на главную страницу

Ansible: выполнить tasks.yml из playbook.yml

Я много искал то же самое, что хотел сделать, но ничего не нашел. Итак, я здесь, чтобы спросить:

У меня есть playbook.yml, где определены некоторые задачи. Первая задача этой пьесы - проверка существования файла, и, если файл существует, я хочу выполнить только задачи, которые определены в файле tasks.yml, и прекращают выполнение задач из playbook.yml (или наоборот). Я, конечно, прежде всего прочитал документацию по Ansible. Но я все еще не понимаю, могу ли я делать именно то, что хочу, с модулями import / include_tasks (пробовал их оба).

Вопрос: "Проверка наличия файла"

A: Используйте стат. Например

- stat:
    path: /etc/foo.conf
  register: st

Вопрос: "Если файл существует, выполнить задачи, которые определены в файле tasks.yml"

A: Используйте include_tasks. Например

- include_tasks: tasks.yml
  when: st.stat.exists

Q: "Прекратить выполнение задач из playbook.yml"

A: Используйте мета. Например

- meta: end_play
  when: st.stat.exists

роли / includeandend / задачи / main.yml

---
- name: Unconditional include
  include_tasks: include.yml

- name: include only if file exists
  include_tasks: '{{ item }}'
  vars:
    params:
      files:
        - includeandend.yml
  #  query() returns a blank list for the loop if no files are found.
  loop: "{{ q('first_found', params, errors='ignore') }}"

- debug:
    msg: "If included, this will not execute"

роли / includeandend / задачи / include.yml

---
- debug:
    msg: "In an included file. Play will continue."

роли / includeandend / задачи / includeandend.yml

---
- debug:
    msg: "In an included file. Play will end now."

- meta: end_play

playbook.yml

---
- hosts: localhost
  gather_facts: False

  roles:
    - includeandend

В Ansible обычно предполагается, что файл задач существует в данном проекте. Так напишет автор пьесы.

Моя реализация работает вокруг этого, только включая, если существует с first_found уважать.

Из-за требования остановить playbook.yml я использую meta: end_play.