Код-ревью Middle Ansible обновлено
Код-ревью: плейбук деплоя
Вопрос
Плейбук запускается на 40 продовых серверах при каждом релизе. Найдите проблемы.
- hosts: all
become: true
vars:
db_password: "Qwerty123"
tasks:
- name: Install packages
shell: apt-get install -y nginx python3
- name: Copy config
copy:
src: app.conf
dest: /etc/nginx/conf.d/app.conf
- name: Restart nginx
service:
name: nginx
state: restarted
- name: Deploy app
shell: cd /opt/app && git pull && ./migrate.sh
- name: Show env
debug:
msg: "DB password is {{ db_password }}"
Коротко
Плейбук работает на тестовом сервере и превращается в аварию на сорока. Правильная версия: модули вместо shell, handlers вместо безусловных рестартов, serial с выводом из балансировщика, миграция один раз через runonce, конкретная версия артефакта и секреты в vault.
Что должен найти ревьюер
- Ошибкастрока 1
hosts: allи нетserial: все 40 серверов обновятся и перезапустятся одновременно, сервис ляжет на время выкатки. - Безопасностьстрока 4Пароль открытым текстом в плейбуке и в git. Хранить в ansible-vault или внешнем хранилище.
- Ошибкастрока 7
shell: apt-get installне идемпотентен и всегдаchanged. Нужен модульaptсstate: present. - Ошибкастрока 12Рестарт nginx отдельной задачей при каждом прогоне. Нужен handler, уведомляемый изменением конфига, и
reloadedвместоrestarted. - Ошибкастрока 9Конфиг копируется без
validate: битый файл уронит nginx на всех хостах. - Ошибкастрока 17Миграция запускается на каждом из 40 хостов параллельно. Её нужно выполнять один раз (
run_once: true) и до обновления кода. - Ошибкастрока 17
git pullна сервере: непредсказуемая версия, нет отката. Деплоить конкретный артефакт или тег. - Безопасностьстрока 20Пароль выводится в лог. Не печатать секреты, для задач с ними
no_log: true.
Разбор
Плейбук работает на тестовом сервере и превращается в аварию на сорока. Правильная версия: модули вместо shell, handlers вместо безусловных рестартов, serial с выводом из балансировщика, миграция один раз через run_once, конкретная версия артефакта и секреты в vault.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Обновление одного хоста в rolling-плейбуке
Следующий вопрос
Rolling-обновление в Ansible