Многокластерная среда с непрерывным перезапуском Ansible

У меня есть вариант использования, когда я хочу выполнить скользящий перезапуск в нескольких кластерах. В качестве первого шага я создал задачу для последовательного выполнения на хостах, переданных задаче, которая будет выполнять перезапуск по одному узлу за раз. В настоящее время для перезапуска узла требуется время O (n) при условии, что общее количество узлов во всем кластере равно n, и постоянное время для перезапуска узла. Я хочу оптимизировать выполнение этого доступного задания таким образом, чтобы задача перезапуска узлов выполнялась последовательно в кластере, но параллельно между кластерами, что приводило к эффективному времени перезапуска, пропорциональному максимальному количеству узлов в кластере. Пример данного инвентаря -

[Cluster_1]
host_1_a
host_1_b

[Cluster_2]
host- 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
a host- 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 b [Cluster_3] host_3_a host_3_b host_3_c

Текущее время выполнения - 7 * (reboot_time), и я хочу оптимизировать его до 3 * (reboot_time). Я не уверен, возможно ли это, и буду приветствовать любые предложения. Спасибо!

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

person arker296    schedule 14.06.2020    source источник
comment
Можете ли вы привести пример сценария, который в настоящее время выполняет серию между всеми хостами?   -  person Andy Shinn    schedule 15.06.2020
comment
Не уверен, что это может быть полезно для вас, но обратите внимание, что серийный номер - это не просто да / нет, вы также можете иметь более одного хоста на пакет или управлять пакетами с помощью массивов и процентов: docs.ansible.com/ansible/latest/user_guide/   -  person β.εηοιτ.βε    schedule 15.06.2020
comment
@AndyShinn добавил пьесу   -  person arker296    schedule 15.06.2020


Ответы (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 фильтр , чтобы удалить нулевые значения и сгладить окончательный результат.

---
- 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  
person Zeitounator    schedule 15.06.2020