【问题标题】:Ansible rolling restart multi cluster environmentAnsible 滚动重启多集群环境
【发布时间】:2020-06-14 21:15:14
【问题描述】:

我有一个用例,我想在多个集群中执行滚动重启。作为第一步,我创建了一个任务以在传递给任务的主机上串行执行,该任务将一次执行重新启动一个节点。目前,假设所有集群中的节点总数为 n 并且节点重启的时间恒定,则节点重启需要 O(n) 时间。我想优化这个ansible作业的执行,以便重启节点的任务在集群中串行执行,但在集群中并行执行,从而导致有效的重启时间与集群中的最大主机数成正比。给定库存示例 -

[Cluster_1]
host_1_a
host_1_b

[Cluster_2]
host_2_a
host_2_b

[Cluster_3]
host_3_a
host_3_b
host_3_c

当前执行时间是 7*(reboot_time),我想优化到 3*(reboot_time)。我不确定这是否可能在 ansible 中,并欢迎任何建议。谢谢!

Ansible playbook 重启服务:

- name: Rolling reboot
  hosts: all
  serial: 1
  gather_facts: no

  tasks:
    - name: stop service
      service:
        name: xyz
        state: stopped

    - name: start service
      service:
        name: xyz
        state: started

    - name: wait for service to start
      uri:
        url: "http://localhost:8081/node-health"
        method: GET
      register: http_status
      until: http_status.status == 200
      retries: 60
      delay: 10

【问题讨论】:

  • 您能否举一个当前在所有主机之间进行连续播放的示例剧本?
  • 不确定这是否对您有帮助,但请注意,串行不仅仅是是/否,您还可以每批次拥有多个主机,或者使用数组和百分比控制批次: docs.ansible.com/ansible/latest/user_guide/…
  • @AndyShinn 添加了剧本

标签: ansible ansible-2.x ansible-inventory ansible-facts ansible-template


【解决方案1】:

解决此问题的一种非常简单的方法是为每个集群并行启动一次 playbook。这实际上是我的首选解决方案。

ansible-playbook -i inventory -l Cluster_1 playbook.yml 2>&1 > mylog1.txt &
ansible-playbook -i inventory -l Cluster_2 playbook.yml 2>&1 > mylog2.txt &
ansible-playbook -i inventory -l Cluster_3 playbook.yml 2>&1 > mylog3.txt &

同时,如果您真的想在一次运行中保留它,这里有一个(可能的开始)解决方案。这个想法是动态创建一个混合现有集群服务器列表的服务器列表。请注意,这绝对不是万无一失的,使其完全可扩展可能最终会成为一场噩梦。

无论如何,如果这能给你一些想法的话。关键是使用zip_longest filter 创建列表,然后映射select filter 以删除空值并展平最终结果。

---
- name: Create a dynamic group mixing hosts from each cluster
  hosts: localhost
  gather_facts: false

  tasks:
    - add_host:
        name: "{{ item }}"
        groups:
          - all_clusters_imbricated
      loop: "{{ groups['Cluster_1'] | zip_longest(groups['Cluster_2'], groups['Cluster_3']) | list | map('select') | map('list') | flatten }}"

- name: Loop serially over all clusters
  hosts: all_clusters_imbricated
  gather_facts: false
  serial: 3

  tasks:
    - debug:
        msg: I would restart host {{ inventory_hostname }}

您当前的示例库存:

PLAY [Create a dynamic group mixing hosts from each cluster] ***************************************************************************************************************************************************************************

TASK [add_host] ************************************************************************************************************************************************************************************************************************
changed: [localhost] => (item=host_1_a)
changed: [localhost] => (item=host_2_a)
changed: [localhost] => (item=host_3_a)
changed: [localhost] => (item=host_1_b)
changed: [localhost] => (item=host_2_b)
changed: [localhost] => (item=host_3_b)
changed: [localhost] => (item=host_3_c)

PLAY [Loop serially over all clusters] *************************************************************************************************************************************************************************************************

TASK [debug] ***************************************************************************************************************************************************************************************************************************
ok: [host_1_a] => {
    "msg": "I would restart host host_1_a"
}
ok: [host_2_a] => {
    "msg": "I would restart host host_2_a"
}
ok: [host_3_a] => {
    "msg": "I would restart host host_3_a"
}

PLAY [Loop serially over all clusters] *************************************************************************************************************************************************************************************************

TASK [debug] ***************************************************************************************************************************************************************************************************************************
ok: [host_1_b] => {
    "msg": "I would restart host host_1_b"
}
ok: [host_2_b] => {
    "msg": "I would restart host host_2_b"
}
ok: [host_3_b] => {
    "msg": "I would restart host host_3_b"
}

PLAY [Loop serially over all clusters] *************************************************************************************************************************************************************************************************

TASK [debug] ***************************************************************************************************************************************************************************************************************************
ok: [host_3_c] => {
    "msg": "I would restart host host_3_c"
}

PLAY RECAP *****************************************************************************************************************************************************************************************************************************
host_1_a                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host_1_b                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host_2_a                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host_2_b                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host_3_a                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host_3_b                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host_3_c                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多