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 уйдет чуть меньше и в итоге в какой-то момент времени уже и вопроса не будет возникать.