Главная

Saturday, 14 November 2020

Ускоряем Ansible #4.

Всем привет.

Финальная часть по ускорению сценариев Ansible.

#4 Параллелизм.

Для каждой задачи Ansible устанавливает соединения параллельно с несколькими хостами и запускает на них одну и ту же задачу параллельно. Однако Ansible необязательно будет устанавливать соединения сразу со всеми хостами -уровень параллелизма контролируется параметром по умолчанию, равным 5. Изменить его можно одним из двух способов. Можно настроить переменную среды ANSIBLE_FORKS, как это показано в примере 11.

Пример 11 Настройка ANSIBLE_FORKS

$ export ANSIBLE_FORKS=20

$ ansible-playbook playbook.yml

Можно также изменить настройки в файле конфигурации Ansible (ansible.cfg), определив параметр forks в секции default, как показано в примере 12.

Пример 12 ansible.cfg. Настройка параллелизма

[defaults]

forks = 26


#5 Асинхронное выполнение задач с помощью Async.

В Ansible появилось новое выражение async, позволяющее выполнять асинхронные действия и обходить проблемы с тайм-аутами SSH. Если время выполнения задачи превышает тайм-аут SSH, Ansible закроет соединение с хостом и сообщит об ошибке. Если добавить в определение такой задачи выражение async, это устранит риск истечения тайм-аута SSH. Однако механизм поддержки асинхронных действий можно также использовать для других целей, например чтобы запустить вторую задачу до окончания выполнения первой. Это может пригодиться, например, если обе задачи выполняются очень долго и не зависят друг от друта (то есть нет нужды ждать, пока завершится первая, чтобы запустить вторую). В примере 13 показан список задач, в котором имеется задача с выражением async, выполняющая клонирование большого репозитория Git. Так как задача отмечена как асинхронная, Ansible не будет ждать завершения клонирования репозитория и продолжит установку системных пакетов.

Пример 13 Использование async для параллельного выполнения задач

- name: install git

  apt: name=git update_cache=yes 

  become: yes

- name: clone Linus's git repo 

  git:

    repo: git://git.kernel.org/pub/scn/linux/kernel/git/torvalds/linux.git 

    dest: /hone/vagrant/linux 

    async: 3600  

    poll: 0 

    register: linux_clone 

- name: install several packages 

  apt:

    name: "{{ item )}" 

  with_items:

    - apt-transport-https

    - ca-certificates

    - linux-image-extra-virtual

    - software-properties-common

    - python-pip

  become: yes

- name: wait for Linux clone to complete

  async_status: 

    jid: "{{ linux_clone.ansible_job_id }}" 

  register: result

  until: result.finished 

  retries: 3600


где:

- определяем эту задачу как асинхронную, и что она должна выполняться не дольше

3600 секунд. Если время выполнения задачи превысит это значение, Ansible автома-

тически завершит процесс, связанный с задачей.

- значение 0 в аргументе роll сообщает системе Ansible, что она может сразу перейти

к следующей задаче после запуска этой. Если бы мы указали ненулевое значение,

Ansible не смогла бы перейти к следующей задаче. Вместо этого она периодически

опрашивала бы состояние асинхронной задачи, ожидая ее завершения, приостанав-

ливаясь между проверками на интервал времени, указанный в параметре роll (в се-

кундах).

- когда имеется асинхронная задача, необходимо добавить выражение register, чтобы

захватить результат ее выполнения. Объект result содержит значение ansible_job_id,

которое можно использовать позднее для проверки состояния задания.

- для опроса состояния асинхронного задания мы используем модуль async_status.

- для идентификации асинхронного задания необходимо указать значение jid.

- модуль async_status выполняет опрос только один раз. Чтобы продолжить опрос до

завершения задания, нужно указать выражение until и определить значение retries

максимального числа попыток.


На этом я заканчиваю материал про варианты ускорения сценариев Ansible. 

Еще раз напомню их вам:

-мультиплексирование SSН, 

-конвейерный режим, 

-кэширование фактов, 

-параллельное выполнения задач, 

-асинхронное выполнения задач.


Удачи.

No comments:

Post a Comment

А что вы думаете по этому поводу?