Ansible:从 playbook.yml 执行 task.yml

Ansible:从 playbook.yml 执行 task.yml

我搜索了很多与我想做的事情完全相同的东西,但一无所获。所以,我在这里问:

我有一个 playbook.yml,其中定义了一些任务。该剧本的第一个任务是检查文件是否存在,如果文件存在,我想执行仅有的在tasks.yml文件中定义的任务,并停止执行playbook.yml中的任务(反之亦然)。当然,我首先已经阅读了Ansible文档。但我仍然不明白我是否能够使用import/include_tasks模块(尝试了两者)准确地完成我想要做的事情。

答案1

问:“检查文件是否存在

答:使用统计。 例如

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

问:“如果文件存在,则执行在tasks.yml文件中定义的任务”

答:使用包括任务。 例如

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

问:“停止执行 playbook.yml 中的任务

答:使用。 例如

- meta: end_play
  when: st.stat.exists

答案2

角色/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

剧本.yml

---
- hosts: localhost
  gather_facts: False

  roles:
    - includeandend

在 Ansible 中,通常假设给定项目中存在一个任务文件。剧本作者将以此方式编写它。

我的实现解决了这个问题,通过仅包含查找是否存在first_found

因为需要停止playbook.yml,所以我使用meta: end_play

相关内容