在 ansible 中使用来自 with_items 的变量过滤主机

Filter hosts using a variable from with_items in ansible

我为 Ansible 设置了以下设置,我想参数化一个将循环的过滤器,并过滤掉特定的主机。

- name: run on hosts
  hosts: "{{ item }}"

  roles: 
    - directory/role-name

  with_items:
    - us-east-1a
    - us-east-1b
    - us-east-1c

结果将是名为 role-name 的角色首先在 us-east-1a 主机上 运行,然后 us-east-1b... 等等

上面的简单错误用

ERROR! 'with_items' is not a valid attribute for a Play

有没有办法完成我正在尝试做的事情,即将我的主机列表分成组,然后运行对他们使用相同的角色,一次一个?

下面实现了我正在寻找的结果,但是很笨重,而且长度不是动态的。

- name: run on us-east-1a
  hosts: "us-east-1a"
  roles:
    - my-role


- name: run on us-east-1b
  hosts: "us-east-1b"
  roles:
    - my-role


- name: run on us-east-1c
  hosts: "us-east-1c"
  roles:
    - my-role

host patterns会做这份工作吗?:

- name: run on us-east-1a
  hosts: us-east-1a,us-east-1b,us-east-1c
  roles:
    - my-role

更新:@techraf 的评论让我大开眼界——单靠主机模式无法完成这项工作。
它只会连接来自所有组的所有主机。
但是以可预测的方式,在某些情况下可用于分别迭代每个组中的主机。
有关详细信息,请参阅

我认为 (1) 拥有通用代码和 (2) 每组主机序列化播放执行的唯一方法(目标在一组 运行 中并行)是将您的剧本分成二:

playbook-main.yml

---
- import_playbook: playbook-sub.yml
  vars:
    host_group_to_run: us-east-1a
- import_playbook: playbook-sub.yml
  vars:
    host_group_to_run: us-east-1b
- import_playbook: playbook-sub.yml
  vars:
    host_group_to_run: us-east-1c

playbook-sub.yml

- hosts: "{{ host_group_to_run }}"
  roles:
    - my-role

  # other common code

如果您想按主机序列化,则有一个 serial declaration that might be used in conjunction with ,但尽管您发表了评论和编辑,但仍不清楚,因为一旦您将 us-east-1a 称为 "host" 以单数形式,其他时候作为 "group of hosts" 或 "availability zone".