Amazon ec2 使用ansible中带有\u项的变量筛选主机

Amazon ec2 使用ansible中带有\u项的变量筛选主机,amazon-ec2,ansible,ansible-inventory,Amazon Ec2,Ansible,Ansible Inventory,我为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主机上运行。。。等等

我为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
你愿意做这项工作吗

- name: run on us-east-1a
  hosts: us-east-1a,us-east-1b,us-east-1c
  roles:
    - my-role
更新:@techraf的评论让我大开眼界——光靠主机模式是不行的。
它将连接所有组中的所有主机。
但以一种可预测的方式,在某些情况下可用于分别迭代每个组中的主机。
有关详细信息,请参阅。

将完成此工作吗

- 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
- hosts: "{{ host_group_to_run }}"
  roles:
    - my-role

  # other common code
playbook-sub.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
- hosts: "{{ host_group_to_run }}"
  roles:
    - my-role

  # other common code

如果您想对每个主机进行序列化,那么有一个可能会与一起使用,但尽管您进行了评论和编辑,这还不清楚,因为一旦您以单数形式将
us-east-1a
称为“主机”,其他时候则称为“主机组”或“可用性区域”。

我认为唯一的方法是(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
- hosts: "{{ host_group_to_run }}"
  roles:
    - my-role

  # other common code
playbook-sub.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
- hosts: "{{ host_group_to_run }}"
  roles:
    - my-role

  # other common code



如果您想对每个主机进行序列化,那么有一个可能会与一起使用,但尽管您进行了评论和编辑,但还不清楚,因为一旦您以单数形式将
us-east-1a
称为“主机”,其他时间称为“主机组”或“可用性区域”。

我正在尝试循环主机组,按可用性区域,一次一个。所以我们所有人先是东区1a,然后是1b。。。等。
按可用性区域,一次一个
有助于更清楚地了解我是否遗漏了什么,但我只是试图针对一组主机运行相同的角色,一次一个。因此,与其将上述内容分为三个不同的运行,不如。。。我想在每次迭代中筛选出目标可用性区域的主机。您是否尝试动态构建库存组并在下一个剧本中引用该组?(请参阅)我正在尝试按可用性区域逐个循环主机组。所以我们所有人先是东区1a,然后是1b。。。等。
按可用性区域,一次一个
有助于更清楚地了解我是否遗漏了什么,但我只是试图针对一组主机运行相同的角色,一次一个。因此,与其将上述内容分为三个不同的运行,不如。。。我想在每次迭代中筛选出目标可用性区域的主机。您是否尝试动态构建库存组并在下一个剧本中引用该组?(看)我可以检查一下。。。那群人会一次一个吗?应该会的。至少对于Ansible 2.3来说是这样的。我必须添加额外的标签。。。所以它看起来像这样<代码>主机:“tag\u Name\u value:&us-east-1a,tag\u Name\u value:&us-east-1b”@KonstantinSuvorov“这会一次一组吗?”——“应该。”——怎么会呢?它将从三个组的串联中创建一组主机,并根据此结果运行,而不是按顺序针对每个组中的主机运行。感谢您让我大开眼界。它将创建一个“排序”集:第一组的所有主机,然后是第二组的所有主机,依此类推。。。那群人会一次一个吗?应该会的。至少对于Ansible 2.3来说是这样的。我必须添加额外的标签。。。所以它看起来像这样<代码>主机:“tag\u Name\u value:&us-east-1a,tag\u Name\u value:&us-east-1b”@KonstantinSuvorov“这会一次一组吗?”——“应该。”——怎么会呢?它将从三个组的串联中创建一组主机,并根据此结果运行,而不是按顺序针对每个组中的主机运行。感谢您让我大开眼界。它将创建一个“排序”集:第一组的所有主机,然后是第二组的所有主机,依此类推。。。我想这就是我想要的。是的,我抓到了
主持人
的问题并编辑了它。
us-east-1a
是一组主机的过滤器。我不需要它们连续运行,就像我认为你的答案在这里完成的那样,只需要分块运行。好的。。。我想这就是我想要的。是的,我抓到了
主持人
的问题并编辑了它。
us-east-1a
是一组主机的过滤器。我不需要它们连续运行,只需要按块运行,因为我认为您的答案在这里就完成了。