Здесь показаны различия между двумя версиями данной страницы.
| Следующая версия | Предыдущая версия | ||
|
linux:ansible:async [2023/11/30 14:08] werwolf создано |
linux:ansible:async [2023/11/30 14:22] (текущий) werwolf |
||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====== Асинхронность в Ansible ====== | ====== Асинхронность в Ansible ====== | ||
| - | + | В Ansible есть понятие Async Actions. Ansible устанавливает подключение к целевым серверам через SSH. Это означает, что соединения SSH остаются активными на протяжении всего выполнения таска в плейбуке. Иногда нам может понадобиться выполнить длительный таск или процесс, который превышает тайм-аут SSH. | |
| - | IBM Senior DevOps Engineer & Integration Architect. Официальный DevOps ментор и коуч в IBM | + | |
| - | + | ||
| - | Привет, Хабр! Давайте поговорим про асинхронность в Ansible, а именно о том, что это и зачем использовать.\\ \\ В Ansible есть понятие Async Actions. Ansible устанавливает подключение к целевым серверам через SSH. Это означает, что соединения SSH остаются активными на протяжении всего выполнения таска в плейбуке. Иногда нам может понадобиться выполнить длительный таск или процесс, который превышает тайм-аут SSH. | + | |
| Мы можем просто не захотеть, чтобы SSH-соединение оставалось активным на протяжении всей операции или же можем захотеть запустить несколько процессов одновременно и проверить их позже. Или другой вариант использования, возможно, для запуска одного или нескольких процессов, даже не удосужившись проверить их статус. Все это может быть достигнуто с помощью асинхронных действий. | Мы можем просто не захотеть, чтобы SSH-соединение оставалось активным на протяжении всей операции или же можем захотеть запустить несколько процессов одновременно и проверить их позже. Или другой вариант использования, возможно, для запуска одного или нескольких процессов, даже не удосужившись проверить их статус. Все это может быть достигнуто с помощью асинхронных действий. | ||
| Строка 20: | Строка 17: | ||
| Устанавливаем значение poll на 60. Давайте добавим еще один таск для мониторинга, например, баз данных и дадим ему шесть минут на выполнение и poll каждые 60 секунд. | Устанавливаем значение poll на 60. Давайте добавим еще один таск для мониторинга, например, баз данных и дадим ему шесть минут на выполнение и poll каждые 60 секунд. | ||
| - | <code> | + | <code yaml> |
| name: Deploy WebApp | name: Deploy WebApp | ||
| hosts: webhost1 | hosts: webhost1 | ||
| Строка 49: | Строка 46: | ||
| Для этого сначала нужно зарегистрировать результат тасок в переменной. Итак, в этом случае мы регистрируем результат первой таски, которая отслеживает веб-приложение, в переменную с именем ''webapp_result''. Также регистрируем результат второй таски, которая заключается в мониторинге базы данных, в переменную ''db_result''. | Для этого сначала нужно зарегистрировать результат тасок в переменной. Итак, в этом случае мы регистрируем результат первой таски, которая отслеживает веб-приложение, в переменную с именем ''webapp_result''. Также регистрируем результат второй таски, которая заключается в мониторинге базы данных, в переменную ''db_result''. | ||
| - | <code> | + | <code yaml> |
| name: Deploy WebApp | name: Deploy WebApp | ||
| hosts: webhost1 | hosts: webhost1 | ||
| Строка 66: | Строка 63: | ||
| Так мы получим новую таску до конца, которая называется проверка статуса таска. Для проверки статуса таски используем модуль ''async_status''. | Так мы получим новую таску до конца, которая называется проверка статуса таска. Для проверки статуса таски используем модуль ''async_status''. | ||
| - | <code> | + | <code yaml> |
| name: Deploy WebApp | name: Deploy WebApp | ||
| hosts: webhost1 | hosts: webhost1 | ||
| Строка 94: | Строка 91: | ||
| Нам нужно добавить плей в плейбук, который будет мониторить веб-апку в течении 5 минут, чтобы убедиться что с приложением все в порядке, но мы не хотим держать открытым ssh-соединение все это время. Также у нас есть второй плей на мониторинг базы данных, оба плея будут выполняться параллельно. Результаты выполнения зарегистрируем в переменные: | Нам нужно добавить плей в плейбук, который будет мониторить веб-апку в течении 5 минут, чтобы убедиться что с приложением все в порядке, но мы не хотим держать открытым ssh-соединение все это время. Также у нас есть второй плей на мониторинг базы данных, оба плея будут выполняться параллельно. Результаты выполнения зарегистрируем в переменные: | ||
| - | <code> | + | <code yaml> |
| - | - | ||
| name: Deploy a Postgres | name: Deploy a Postgres | ||
| Строка 125: | Строка 122: | ||
| </code> | </code> | ||
| - | В современном мире развития программного обеспечения необходимость быстрого и автоматизированного деплоя становится все более важной. Однако использование инструментов, таких как Kubernetes, не всегда доступно или оправдано. Ansible же является гибким и мощным инструментом, который может быть использован в любой обстановке. Приглашаю вас на [[https://otus.pw/J3OF/|бесплатный вебинар]], в рамках которого мои коллеги поделятся с вами своими знаниями и опытом в области использования Ansible для деплоя приложений. Вы узнаете, как настроить автоматический процесс развертывания с помощью Ansible и Docker, минуя сложности и необходимость в Kubernetes. | + | ==== Пример с until ==== |
| + | |||
| + | <code yaml> | ||
| + | --- | ||
| + | - name: user | ||
| + | hosts: demo | ||
| + | any_errors_fatal: true | ||
| + | tasks: | ||
| + | - name: PreConfig block | ||
| + | block: | ||
| + | - name: sleep | ||
| + | command: /bin/sleep 15 | ||
| + | async: 1000 | ||
| + | poll: 0 | ||
| + | register: sleep | ||
| + | - debug: | ||
| + | var: sleep | ||
| + | - name: Echo | ||
| + | command: echo "Done" | ||
| + | become: true | ||
| + | - name: Check sleep status | ||
| + | async_status: | ||
| + | jid: {{ sleep.ansible_job_id }} | ||
| + | register: job_result | ||
| + | until: job_result.finished | ||
| + | retries: 100 | ||
| + | delay: 1 | ||
| + | become: true | ||
| + | </code> | ||