在 ansible 中已经使用串行时,扇出到其他主机

在 ansible 中已经使用串行时,扇出到其他主机

我有 80 多个主机运行我的应用程序,我正在更新一个长期存在的 ansible 剧本来更改我们的负载均衡器。在我们当前的负载均衡器设置中,可以通过一次 ansible 操作从负载均衡器中添加/删除主机,只需使用 AWS CLI 即可。但是,我们正在切换到在我们自己的少数主机上配置的负载均衡器,我们将通过使用 ansible 操作这些主机上的文本文件来添加和删除主机。本质上,我需要在使用串行的同时在剧本中的不同主机上进行内部循环。

我在构建剧本时遇到了麻烦,以便我可以在将命令部署到具有序列号:25% 的80 台主机时将命令分发blockinfile到组中的主机。tag_Type_edgetag_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 来缓解。

如果您的多主机负载均衡器有一个控制平面,则不需要接触那么多主机。每个应用服务器执行一项任务。您目前可能还没有为此做好准备,但这是值得考虑的事情。

相关内容