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

documentation for import_tasks提到

Any loops, conditionals and most other keywords will be applied to the included tasks, not to this statement itself.

这正是我想要的.不幸的是,当我尝试使import_tasks使用循环时

- import_tasks: msg.yml
  with_items:
    - 1
    - 2
    - 3

我收到了消息

ERROR! You cannot use loops on ‘import_tasks’ statements. You should use ‘include_tasks’ instead.

我不想要include_tasks行为,因为这会将循环应用于包含的文件,并复制任务.我特别想为每个循环变量运行第一个任务(作为一个带有标准with_items输出的任务),然后是第二个,依此类推.我怎么能得到这种行为?

具体来说,请考虑以下事项

假设我有以下文件:

playbook.yml

---                       

- hosts: 192.168.33.100
  gather_facts: no
  tasks:
  - include_tasks: msg.yml
    with_items:
      - 1
      - 2

msg.yml

---

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

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

我想要打印的消息

Message 1: 1
Message 1: 2
Message 2: 1
Message 2: 2

但是,使用import_tasks我得到一个错误,并且我得到了include_tasks

Message 1: 1
Message 2: 1
Message 1: 2
Message 2: 2

最佳答案 您可以添加一个with_items循环,将列表添加到导入文件中的每个任务,并使用您传递给内部with_items循环的变量调用import_tasks.这会将循环的处理移动到导入的文件,并且需要在所有任务上复制循环.

举个例子,这会将文件更改为:

playbook.yml

---

- hosts: 192.168.33.100
  gather_facts: no
  tasks:
  - import_tasks: msg.yml
    vars:
      messages:
        - 1
        - 2

msg.yml

---

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

- name: Message 2
  debug:
    msg: "Message 2: {{ item }}"
  with_items:
    - "{{ messages }}"
点赞