What I Am Learned Using Ansible Almost Every Working Day
Чему я научился используя Ansible на работе почти каждый день?
Disclaimer - Отказ от ответственности.
Я могу быть не прав, поэтому рекомендую читателям не принимать все на веру как есть.
Предыстория
Когда-то еще в двухтысячные я с трудом освоил Perl, затем мне попались книги Damien Conway (я и сейчас рекомендую все их прочесть), прочитав книги мои навыки в Perl поднялись до приемлимого уровня. И большинство системных и вспомогательных скриптов в 2004 - 2011 годы мною было написано на Perl.
Затем я заметил, что на Bash я могу реализовать тот же функционал, что и на Perl. Начался плавный переход и отказ от использования Perl и замены на Bash (gawk, sed, curl, jq). Хронологически с 2010 по 2020 годы практически все скрипты я уже реализовывал на Bash.
В 2013 - 2015 годы я изучал, внедрял Chef, это потребовало еще и немного Ruby, DSL. Для более лучшего управления уже парком серверов.
В 2020 году уже везде требовался Ansible, меня часто спрашивали об этом на различных интервью, ну я честно отвечал, что тоже самое могу сделать и на Bash. Но рынок требовал, поэтому я решил всерьез выделить время и изучить Ansible. Как раз тогда без работы и сидел.
Позже в конце 2021 года я купил книгу Ansible for Devops by Jeff Geerling. Очень рекомендую всем, кто хочет изучить Ansible. Это очень хорший учебник, который начинается с малого, чтобы довести вас до больших вещей.
Так чему же я научился и порекомендую другим?
- Рекомендую всем прочитать книгу Ansible for Devops by Jeff Geerling;
- Всегда используйте ansible-lint чтобы привести форматирование к единому порядку. Надо себя заставлять, ну еще ansible-lint поможет с ошибками форматирования YAML;
- Всегда используйте molecule test для проверки ролей. Особенно часто будете страдать из-за ошибок, которые возникают из-за идемпотентности.
- Всегда используйте test infra, goss для проверки результатов выполнения роли.
- Всегда выставляйте поля owner, group, mode;
- Всегда используйте somedict[‘somefield’] вместо somedict.somefield. Так как иногда может оказаться, что somefield - это зарезервированное слово и уйдет много времени на debug;
- Создайте отдельное venv окружение для запуска Ansible. Точно не помешает, когда кроме Ansible пользуетесь и другими приложениями на базе Python;
- Создайте отдельный Docker image, который будет содержать рабочую версию Ansible;
- Заменяйте скрипты на Bash + curl + jq на Ansible playbook с Ansible.builtin.uri.
- Изучите вопрос и разделите Ansible роли на те, которые стоит запускать вместе с Packer, на те роли, которые стоит запускать вместе с Terraform. Это поможет;
- “Как же при Rust похорошел Python” - в 2025 рекомендую использовать uv, ruff взамен python-venv, python-pip, python-lint. Работает быстрее, Docker images стали собираться быстрее;
- Всякий раз, когда возникает желание - за пять минут напишу скрипт на Bash, боритесь с этим желанием, лучше вложите 1-2 часа своего времени, напишите все как Ansible-playbook, ansible role, это окупится. В следующий раз времени на написание Ansible уйдет чуть меньше и в итоге в какой-то момент времени уже и вопроса не будет возникать.