如何解决使用 ansible
我们有一个包含数十台服务器的 Ansible 清单,每个微服务按服务器分组。假设我们的清单中有多个应用程序组,其中包含服务器。
说:
[group1]
server1
server2
server3
server20
server27
server38
[group2]
server4
server5
[group3]
server7
server8
server9
server6
此库存已用于数十场比赛,因此不能仅更改它。我需要处理这个设置。
我需要知道的是,是否有可能在每个组的一台服务器上并行运行一个游戏,而无需在剧中明确命名它们? (组和服务器可以由其他人添加,我需要玩才能应付)
所以当播放开始时,它可能会在 server1、server4 和 server7 上并行处理。 server2 上的处理可能会在 server1 完成时开始,server5 的处理可能会在 server4 完成时开始,等等。我猜你明白我的意思。这意味着,一开始,每个组的一个服务器被处理,但随着时间的推移,较小的组将完成,而在较大的组中仍然会进行处理。
有没有办法实现这一点?
硫亚
解决方法
这里已经有一个关于如何在多个主机上运行剧本的答案Ansible: deploy on multiple hosts in the same time
也许你可以从那里开始形成。但是,如果您只对并行运行第一台服务器感兴趣,那将会更加困难,因为它需要编写自定义脚本或类似的东西
,Q: "在每组中的 1 个服务器上并行运行...在服务器 1、服务器 4 和服务器 7 上并行处理。服务器 1 完成后,服务器 2 上的处理可能开始,服务器 5 的处理可能开始当 server4 完成时,等等......迭代编写代码时未知的多个组和服务器。"
A:作为一个不完整的提示,下面的剧本
- hosts: all
gather_facts: false
vars:
_groups: "{{ groups.keys()|difference(['all','ungrouped']) }}"
# _hosts: [0,1,2] # Range of minimal common leght perhaps?
_groups_len_min: "{{ _groups|map('extract',groups)|map('length')|min }}"
_hosts: "{{ range(_groups_len_min|int) }}"
my_hosts: "{{ query('cartesian',_hosts,_groups) }}"
tasks:
- add_host:
name: "{{ groups[item.1][item.0] }}"
groups: my_group
loop: "{{ my_hosts }}"
run_once: true
- hosts: my_group
gather_facts: false
serial: 3 # TODO: Number of the groups involved
order: inventory
tasks:
- debug:
var: inventory_hostname
给予
PLAY [my_group] ***************************************************
TASK [debug] ******************************************************
ok: [server4] =>
inventory_hostname: server4
ok: [server1] =>
inventory_hostname: server1
ok: [server7] =>
inventory_hostname: server7
PLAY [my_group] ***************************************************
TASK [debug] ******************************************************
ok: [server2] =>
inventory_hostname: server2
ok: [server5] =>
inventory_hostname: server5
ok: [server8] =>
inventory_hostname: server8
PLAY [my_group] ***************************************************
TASK [debug] ******************************************************
ok: [server6] =>
inventory_hostname: server6
ok: [server3] =>
inventory_hostname: server3
ok: [server9] =>
inventory_hostname: server9
如果你想包括所有主机,用哑元填充缺失的主机,例如给定库存
shell> cat hosts
[group1]
server1
server2
server3
[group2]
server4
server5
[group3]
server7
剧本
- hosts: all
gather_facts: false
vars:
_groups: "{{ groups.keys()|difference(['all','ungrouped']) }}"
_groups_len_max: "{{ _groups|map('extract',groups)|map('length')|max }}"
_hosts: "{{ range(_groups_len_max|int) }}"
my_hosts: "{{ query('cartesian',_groups) }}"
tasks:
- add_host:
name: "{{ groups[item.1][item.0]|default('dummy-' ~ ansible_loop.index) }}"
groups: my_group
loop: "{{ my_hosts }}"
loop_control:
extended: true
run_once: true
- hosts: my_group
gather_facts: false
serial: 3 # TODO: Number of the groups involved
order: inventory
tasks:
- name: Proceed if not dummy
block:
- debug:
var: inventory_hostname
when: inventory_hostname is not match('^dummy-\d*$')
给予
PLAY [my_group] *****************************************************
TASK [debug] ********************************************************
ok: [server1] =>
inventory_hostname: server1
ok: [server4] =>
inventory_hostname: server4
ok: [server7] =>
inventory_hostname: server7
PLAY [my_group] *****************************************************
TASK [debug] ********************************************************
skipping: [dummy-6]
ok: [server2] =>
inventory_hostname: server2
ok: [server5] =>
inventory_hostname: server5
PLAY [my_group] *****************************************************
TASK [debug] ********************************************************
ok: [server3] =>
inventory_hostname: server3
skipping: [dummy-8]
skipping: [dummy-9]
注意事项
一个简单的选择是创建动态组,例如
- hosts: all
gather_facts: false
vars:
my_groups:
my_group1: [[group1,0],[group2,[group3,0]]
my_group2: [[group1,1],1]]
my_group3: [[group1,2],2]]
tasks:
- add_host:
name: "{{ groups[item.1.0][item.1.1] }}"
groups: "{{ item.0.key }}"
with_subelements:
- "{{ my_groups|dict2items }}"
- value
run_once: true
- hosts: my_group1
gather_facts: false
tasks:
- debug:
var: inventory_hostname
- hosts: my_group2
gather_facts: false
tasks:
- debug:
var: inventory_hostname
- hosts: my_group3
gather_facts: false
tasks:
- debug:
var: inventory_hostname
给出(删减)
PLAY [my_group1] *******************************************************
TASK [debug] ***********************************************************
ok: [server1] =>
inventory_hostname: server1
ok: [server7] =>
inventory_hostname: server7
ok: [server4] =>
inventory_hostname: server4
PLAY [my_group2] *******************************************************
TASK [debug] ***********************************************************
ok: [server5] =>
inventory_hostname: server5
ok: [server2] =>
inventory_hostname: server2
ok: [server8] =>
inventory_hostname: server8
PLAY [my_group3] *******************************************************
TASK [debug] ***********************************************************
ok: [server3] =>
inventory_hostname: server3
ok: [server6] =>
inventory_hostname: server6
ok: [server9] =>
inventory_hostname: server9
下一个选项是创建一个具有所需主机顺序的组并设置 serial 和 order,例如
- hosts: all
gather_facts: false
vars:
my_groups:
my_group1: [[group1,2]]
tasks:
- add_host:
name: "{{ groups[item.1.0][item.1.1] }}"
groups: my_group
with_subelements:
- "{{ my_groups|dict2items }}"
- value
run_once: true
- hosts: my_group
gather_facts: false
serial: 3
order: inventory
tasks:
- debug:
var: inventory_hostname
给出(删减)
PLAY [my_group] ****************************************************
TASK [debug] *******************************************************
ok: [server1] =>
inventory_hostname: server1
ok: [server7] =>
inventory_hostname: server7
ok: [server4] =>
inventory_hostname: server4
PLAY [my_group] ****************************************************
TASK [debug] *******************************************************
ok: [server2] =>
inventory_hostname: server2
ok: [server5] =>
inventory_hostname: server5
ok: [server8] =>
inventory_hostname: server8
PLAY [my_group] ****************************************************
TASK [debug] *******************************************************
ok: [server3] =>
inventory_hostname: server3
ok: [server6] =>
inventory_hostname: server6
ok: [server9] =>
inventory_hostname: server9
为了避免手动编写大型矩阵的繁琐工作,可以动态创建结构,例如下面的播放创建了相同的动态组
- hosts: all
gather_facts: false
vars:
_groups: [group1,group2,group3]
_hosts: [0,2]
_dgroups: [my_group1,my_group2,my_group3]
_groups_hosts: "{{ query('cartesian',_groups)|
batch(_dgroups|length) }}"
my_groups: "{{ dict(_dgroups|zip(_groups_hosts)) }}"
tasks:
- add_host:
name: "{{ groups[item.1.1][item.1.0] }}"
groups: my_group
with_subelements:
- "{{ my_groups|dict2items }}"
- value
run_once: true
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。