Как стать автором
Обновить

Cotea: программный контроль исполнения Ansible

Время на прочтение11 мин
Количество просмотров5.7K
Всего голосов 12: ↑12 и ↓0+12
Комментарии7

Комментарии 7

Странное впечатление. Как будто сделан свой велосипед ради просто велосипеда. Зачем реализовывать внешнюю обвязку над ансиблом для дублирования его логики с помощью питона? В чем сакральный смысл?

Можно применить модули Ansible, но часто бывает, что необходимого модуля нет – или никто не сделал, или нет модуля для нужной версии Ansible. А через сotea для такой промежуточной обработки можно применить любые Python-библиотеки, потому что мы даем программный доступ к результатам выполнения.

Если необходимого вам модуля нет или функционала имеющихся не хватает - не проще ли написать просто дополнительный модуль/плагин для ансибла, используя его нативные механизмы интеграции, а не обмазываться гораздо большим объемом внешнего кода, который никак не интегрирован в экосистему ансибла?

Спасибо за отзыв. Cotea расширяет возможности Ansible, добавляя новые функции, а не просто копирует то, что уже есть. Инструмент позволяет управлять исполнением Ansible прямо из программы на Python, таким образом, можно проверять и регулировать процесс после каждого таска, используя все возможности Python. В сравнении с этим, команда ansible-playbook - 'черный ящик', без возможности вмешательства в процесс.

Также благодаря cotea и gocotea, существенно проще встраивать Ansible в программы на Python и Golang, потому что не нужно запускать внешние команды через exec, что часто может быть неудобно и неэффективно.

не проще ли написать просто дополнительный модуль/плагин для ансибла

Не всегда у разработчиков есть время на это. Иногда им просто нужно быстро обработать результат (например, просто stdout) от предыдущего таска и двигаться дальше. Cotea дает возможность легко обрабатывать эти данные с помощью Python, а не ограничиваться возможностями Ansible.

Инструмент позволяет управлять исполнением Ansible прямо из программы на Python, таким образом, можно проверять и регулировать процесс после каждого таска, используя все возможности Python.

Ансиблом и так можно управлять из программы на Python с помощью нативного API. Я все еще не понимаю - в чем смысл своего велосипеда в данном контексте.

Не всегда у разработчиков есть время на это. Иногда им просто нужно быстро обработать результат (например, просто stdout) от предыдущего таска и двигаться дальше. Cotea дает возможность легко обрабатывать эти данные с помощью Python, а не ограничиваться возможностями Ansible.

Не очень понятно, на чем именно экономится время и в каком месте? Если вам нужно реализовать какую-то специфичную логику на питоне, вам в любом случае придется ее реализовать и написать для этого весь код. Просто тут вы еще зачем-то занимаетесь реверс-инжинирингом и залезаете внутрь процессов ансибла своим кодом, вместо того, чтобы пользоваться готовыми возможностями фреймворка, расширяя функционал именно там, где вам чего-то не хватает. Какой конкретный юзкейс помогает решить ваш велосипед, что не покрывается простым написанием своего плагина к ансиблу?

Ансиблом и так можно управлять из программы на Python с помощью нативного API.

Вынужден Вас расстроить, но без cotea этого делать нельзя)
Нет Python API, позволяющего запускать конкретный таск либо плей, добавлять новый таск или Ansible-переменную по ходу выполнения и тд (всё то, что предоставляет cotea).
Если Вы про страничку Python API документации Ansible, то там плейбук запускается разом, как и при запуске Ansible из командной строки. То есть, возможности контроля между тасками не предоставляется. Также там сказано, что это API для внутреннего использования и external use is not supported by Ansible. И далее приводится ссылка на ansible-runner, который упоминался в статье (он также не предоставляет возможности программного итерирования по таскам).

Не очень понятно, на чем именно экономится время и в каком месте?

Разработка Ansible модуля - это куда более общая задача, требущая бОльшего времени разработки, чем, к примеру, парсинг строки в конкретной ситуации. При написании playbook-ов, разработчики обычно выкручиваются, используя существующий функционал Ansible, т.к. это всё равно быстрее написания и отладки собственного модуля. Cotea же предлагает выкручиваться, используя всё богатсво Python;)

Если Вы про страничку Python API документации Ansible, то там плейбук запускается разом, как и при запуске Ansible из командной строки. То есть, возможности контроля между тасками не предоставляется.

Там просто пример с иллюстрацией. Все возможности там есть, если смотреть на код.

Также там сказано, что это API для внутреннего использования и external use is not supported by Ansible.

Ну да. Эта не основная возможность, и упор в ансибле сделан не на нее. Но если очень хочется, то никаких препятствий нет. Как вся эта апишка вызывается и используется, можно посмотреть в коде самого же ансибла.

Разработка Ansible модуля - это куда более общая задача, требущая бОльшего времени разработки, чем, к примеру, парсинг строки в конкретной ситуации.

При чем тут парсинг строки? Речь о написании обвязки типа той же cotea. Ну, и если говорить про парсинг строки, то я что-то сильно сомневаюсь, что разработка cotea потребовала меньше времени, чем плагин из двух строчек на питоне.

При написании playbook-ов, разработчики обычно выкручиваются, используя существующий функционал Ansible, т.к. это всё равно быстрее написания и отладки собственного модуля. Cotea же предлагает выкручиваться, используя всё богатсво Python;)

В чем преимущество велосипеда в виде cotea по сравнению с написанием собственного модуля? В cotea какой-то свой особый питон? Я все еще не понимаю, где и что именно вы выигрываете. Можно более конкретный пример увидеть?

Там просто пример с иллюстрацией. Все возможности там есть, если смотреть на код.

Но если очень хочется, то никаких препятствий нет. Как вся эта апишка вызывается и используется, можно посмотреть в коде самого же ансибла.

Этих возможностей там нет)))
Их не было 1.5 года во время разработки cotea и их нет и сейчас. Напомню, что речь идёт о специальных интерфейсах для внешнего использования, по типу запустить плей, таск, добавить переменную. Подобных интерфейсов вы там не найдете, их всё равно необходимо было бы писать вручную, и их код содержал бы кучу манипуляций внутренними объектами Ansible, в не совсем естественном для них ключе. Именно поэтому было принято решение встраиваться в Ansible декораторами (для чего мы провели немало времени в изучении исходного кода Ansible, ссылку на репозиторий которого Вы любезно предоставили).
Ну а если Вы вдруг знаете это заветное место в репозитории, которое никак не задокументировано и где объявлены те самые интерфейсы, то мы конечно же будем рады ссылкам.

При чем тут парсинг строки?

В чем преимущество велосипеда в виде cotea по сравнению с написанием собственного модуля? Можно более конкретный пример увидеть?

Возьмём пример, описанный в статье. Нам нужно было понимать, запущен ли уже конкретный podman контейнер. Модуля для podman в той версии Ansible на тот момент не существовало. Для решение же задачи достаточно распарсить stdout команды podman ps.
В этой ситуации, разработчик плейбука может написать свой модуль для podman или просто распарсить вывод podman ps и пойти дальше. Очевидно, второй вариант быстрее, да и к тому же, официальный модуль для podman рано или поздно появиться.
И в случае со вторым вариантом, cotea позволяет решать такие задачи "в питоне", а не "в ансибле".

 Речь о написании обвязки типа той же cotea

Мы разрабатывали cotea по ряду причин, в числе которых контроль исполнения (итерирование по таскам), встраивание в другие системы (нужно было вызывать Ansible из Go) и возможности отладки. Реализованное API можно использовать, к примеру (и у нас есть это в планах), для создания полноценного отладчика Ansible в виде плагина к IDE, чего нельзя было сделать с штатным отладчиком Ansible, т.к. у него нет API и реализован он также с помощью декораторов. Пример с обработкой результатов таска - это лишь один из use case-ов.

Возьмём пример, описанный в статье. Нам нужно было понимать, запущен ли уже конкретный podman контейнер. Модуля для podman в той версии Ansible на тот момент не существовало. Для решение же задачи достаточно распарсить stdout команды podman ps.
В этой ситуации, разработчик плейбука может написать свой модуль для podman или просто распарсить вывод podman ps и пойти дальше. Очевидно, второй вариант быстрее, да и к тому же, официальный модуль для podman рано или поздно появиться.

Опять непонятно. В чем быстрота? Для парсинга вывода команд в ансибле есть готовые модули. Но если очень хочется свой велосипед, то модуль, который будет парсить вывод и выводить нужное займет буквально пару строчек на питоне. А в вашем случае не питон используется для парсинга?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий