amarao (amarao_san) wrote,
amarao
amarao_san

Category:

идемпотентность у shell

Итак, задача: сделать миграцию, если она pending.

Есть flyway, устанавливающийся и конфигурирующися чуть ранее. Ему выдают sql'ки. В ответ он говорит в flyway info, есть ли pending миграции.

Идея: запросить flyway, распарсить результат, выставить флаг "надо мигриться", дальше сделать

- name Init
  command: flyway baseline
  when: migration_pending is defined
 
- name: Migrate
  command: flyway migrate
  when: migration_pending is defined


Тупо и просто, да?

А как нам делать flyway info? Так, чтобы его запуск не был засчитан за "выполнение"?

Тривиальное:
- name: Check if migration is required
  shell: flyway info
  register: migration_pending


(Я опускаю парсинг, он тут не важен). Проблема в том, что мы будем получать changed=1 на каждом запуске. Потому что команда, с сайдэффектами и всё такое.

Конгениальный ansible говоорит, что у shell есть параметр creates/removes с именем файла, и что если этот файл есть, то, типа, команда уже запускалась и полный успех и идемпотентность.

Но нам _нужно_ запускать команду каждый раз. И мы (с большой уверенностью) может обещать ансиблу, что она идемпотентна, хотя и может дать разный результат каждый раз.

То есть вопрос бюрократический большей частью. Модуль может трогать apt, или там какой service, и считаться при этом идемпотентным, а плейбука - нет.

Как бы запуск программы объявить идемпотентной? Не "запускать или нет", а "не засчитывать операцию в changed"?

Танцевать вокруг inventory providers? Писать модуль?

UPD: Правильный гугль гуглит правильно.

changed_when:
Tags: ansible
Subscribe

  • ансибло-философия

    А вот я хочу продолжить думать умное про ансибл, ci/cd и прочую рабочую фигню между гитом и сервером. Классическое программирование стремится…

  • APython

    troll mode: Специальный интерпретатор питона, написанный на ансибле с помощью конечного автомата на хэндлерах. В начале делается set_fact для code с…

  • molecule

    Мы всё-таки пытаемся притащить молекулу в продакшен (в смысле, в тесты кода для продакшена). Основная проблема состоит в том, что molecule…

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments