如何将Ansible with_items循环应用于所包含的任务?

Chr*_*ley 7 ansible

提及的文档import_tasks

任何循环,条件语句和大多数其他关键字都将应用于所包含的任务,而不是此语句本身。

这正是我想要的。不幸的是,当我尝试import_tasks循环工作时

- import_tasks: msg.yml
  with_items:
    - 1
    - 2
    - 3
Run Code Online (Sandbox Code Playgroud)

我收到消息

错误!您不能在“ import_tasks”语句上使用循环。您应该改用“ include_tasks”。

我不希望这种include_tasks行为,因为这会将循环应用于包含的文件,并重复执行任务。我特别想为每个循环变量运行第一个任务(作为具有标准with_items输出的一个任务),然后运行第二个,依此类推。我如何获得这种行为?


具体来说,请考虑以下几点:

假设我有以下文件:

playbook.yml

---                       

- hosts: 192.168.33.100
  gather_facts: no
  tasks:
  - include_tasks: msg.yml
    with_items:
      - 1
      - 2
Run Code Online (Sandbox Code Playgroud)

msg.yml

---

- name: Message 1
  debug:
    msg: "Message 1: {{ item }}"

- name: Message 2
  debug:
    msg: "Message 2: {{ item }}"
Run Code Online (Sandbox Code Playgroud)

我希望打印出来的消息是

消息1:1
消息1:2
消息2:1
消息2:2

但是,随着import_tasks我得到一个错误,随着include_tasks我得到

消息1:1
消息2:1
消息1:2
消息2:2

Chr*_*ley 9

您可以with_items向导入文件中的每个任务添加一个带有列表的循环,并import_tasks使用传递给内部with_items循环的变量进行调用。这会将循环的处理移至导入的文件,并且需要在所有任务上重复循环。


鉴于您的示例,这会将文件更改为:

剧本.yml

---

- hosts: 192.168.33.100
  gather_facts: no
  tasks:
  - import_tasks: msg.yml
    vars:
      messages:
        - 1
        - 2
Run Code Online (Sandbox Code Playgroud)

msg.yml

---

- name: Message 1
  debug:
    msg: "Message 1: {{ item }}"
  with_items:
    - "{{ messages }}"

- name: Message 2
  debug:
    msg: "Message 2: {{ item }}"
  with_items:
    - "{{ messages }}"
Run Code Online (Sandbox Code Playgroud)