在 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".
我为 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".