我有 80 多个主机运行我的应用程序,我正在更新一个长期存在的 ansible 剧本来更改我们的负载均衡器。在我们当前的负载均衡器设置中,可以通过一次 ansible 操作从负载均衡器中添加/删除主机,只需使用 AWS CLI 即可。但是,我们正在切换到在我们自己的少数主机上配置的负载均衡器,我们将通过使用 ansible 操作这些主机上的文本文件来添加和删除主机。本质上,我需要在使用串行的同时在剧本中的不同主机上进行内部循环。
我在构建剧本时遇到了麻烦,以便我可以在将命令部署到具有序列号:25% 的80 台主机时将命令分发blockinfile
到组中的主机。tag_Type_edge
tag_Type_app
以下是我想要做的事情:
---
- hosts: tag_Type_app
serial: "25%"
pre_tasks:
- name: Gathering ec2 facts
action: ec2_metadata_facts
- name: Remove from load balancers
debug:
msg: "This is where I'd fan out to multiple different hosts from group tag_Type_edge to manipulate
text files to remove the 25% of hosts from tag_Type_app from the load balancer"
tasks:
- name: Do a bunch of work to upgrade the app on the tag_Type_app machines while out of the load balancer
debug:
msg: "deploy new code, restart service"
post_tasks:
- name: Put back in load balancer
debug:
msg: "This is where I'd fan out to multiple different hosts from group tag_Type_edge to manipulate
text files to *add* the 25% of hosts from tag_Type_app back into the load balancer"
我怎样构造它才能允许内部循环在tag_Type_edge
所有盒子上使用串行:25%tag_Type_app
?
答案1
在 Ansible 中,实际上在一台主机上运行一项任务,但代表另一台主机,可能需要使用一种称为代表团。文档中的一个示例确实是将主机从负载均衡器中取出。
与任何任务一样,它可以在某些主机名上循环运行多次。不是播放循环,而是任务循环。下面是一个示例,采用您的框架:
---
- name: Example loop over load balancers for each app server
hosts: tag_Type_app
serial: "25%"
pre_tasks:
- name: Gathering ec2 facts
action: ec2_metadata_facts
- name: Remove from load balancers
debug:
msg: "Remove app instance {{ inventory_hostname }} from edge node {{ item }}"
delegate_to: "{{ item }}"
loop: "{{ query('inventory_hostnames', 'tag_Type_edge') }}"
tasks:
- name: Do a bunch of work to upgrade the app on the tag_Type_app machines while out of the load balancer
debug:
msg: "deploy new code, restart service"
post_tasks:
- name: Put back in load balancer
debug:
msg: "Add app instance {{ inventory_hostname }} to edge node {{ item }}"
delegate_to: "{{ item }}"
loop: "{{ query('inventory_hostnames', 'tag_Type_edge') }}"
inventory_hostnames 是一个执行库存模式的查找插件,任何模式都可以放在那里。
这其中有几个棘手的问题。“边缘”循环中的任何故障都会导致“应用”主机发生故障。这将导致部分边缘主机处于启用状态,而另一些则未启用。除非您有某种退出机制,例如带有可撤消它的救援的块。
--limit
作为任务循环,一些库存和播放相关功能将不适用。您无法在命令行上进一步限制边缘主机。您也无法使用serial
它们进行批处理,这已经在播放中了。
此外,它将运行相对大量的任务,至少是 app ✕ edge ✕ 2。这可能会有点慢。可以通过增加 fork 来缓解。
如果您的多主机负载均衡器有一个控制平面,则不需要接触那么多主机。每个应用服务器执行一项任务。您目前可能还没有为此做好准备,但这是值得考虑的事情。