Код-ревью 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. Ошибкастрока 1
    hosts: all и нет serial: все 40 серверов обновятся и перезапустятся одновременно, сервис ляжет на время выкатки.
  2. Безопасностьстрока 4
    Пароль открытым текстом в плейбуке и в git. Хранить в ansible-vault или внешнем хранилище.
  3. Ошибкастрока 7
    shell: apt-get install не идемпотентен и всегда changed. Нужен модуль apt с state: present.
  4. Ошибкастрока 12
    Рестарт nginx отдельной задачей при каждом прогоне. Нужен handler, уведомляемый изменением конфига, и reloaded вместо restarted.
  5. Ошибкастрока 9
    Конфиг копируется без validate: битый файл уронит nginx на всех хостах.
  6. Ошибкастрока 17
    Миграция запускается на каждом из 40 хостов параллельно. Её нужно выполнять один раз (run_once: true) и до обновления кода.
  7. Ошибкастрока 17
    git pull на сервере: непредсказуемая версия, нет отката. Деплоить конкретный артефакт или тег.
  8. Безопасностьстрока 20
    Пароль выводится в лог. Не печатать секреты, для задач с ними no_log: true.

Разбор

Плейбук работает на тестовом сервере и превращается в аварию на сорока. Правильная версия: модули вместо shell, handlers вместо безусловных рестартов, serial с выводом из балансировщика, миграция один раз через run_once, конкретная версия артефакта и секреты в vault.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.