Назад | Перейти на главную страницу

Ansible - для чего нужен ключ run_once в файле задачи .yml?

В файле задачи, роль которого заключается в установке php на удаленном сервере (ах)

кто-то использует этот модуль (после модуля, предназначенного для установки) для обновления новой установки:

  command:
    php update.php --quick
  run_once: yes
  delegate_to: "{{item}}"
  with_items: "{{servernetwork.nodes}}"

Так что я не понимаю, что afaik, задачи со сценарием Ansible изначально имеют 3 результата при анализе (когда сценарий запускается на удаленном сервере): что-то вроде либо
- хорошо (уже было сделано до этого звонка),
- изменено (это новое требование, поэтому оно было выполнено),
- или я не помню третье состояние.
Но как бы то ни было, потому что в основном Ansible будет выполнять только те шаги рецепта, которые отсутствуют в текущем состоянии сервера. Документы и люди любят использовать слово «indempotent» для обозначения подобного дельте поведения.

Так зачем нам уточнять run_once ? Я что-то пропустил в его ключевых концепциях?

run_once означает, что это будет выполнено на первом узле из списка servernetwork.node, а затем его результаты (переменные / факты) будут использоваться для всех узлов в списке. И не будет выполняться на других узлах (кроме первого).

run_once по документация следующая:

В некоторых случаях может потребоваться только запустить задачу один раз за пачку хостов. Этого можно добиться, настроив run_once по задаче. [Полужирный шрифт мой.]

- command: /opt/application/upgrade_db.py
  run_once: true
  delegate_to: web01.example.org

Он имеет широкий набор вариантов использования.

  • Применить миграции базы данных. (Нет смысла применять миграции на каждом хосте. Одного вполне достаточно)

  • Создать резервную копию базы данных. Запустив playbook на группе хостов, было бы полезно сделать резервную копию на одном из них.

  • Сделайте такой API-вызов, который требует запуска с определенных хостов. (И сделай это однажды ...)

  • [...]

Очень часто используется с local_action или delegate_to. В этом случае вы запускаете действие на группе хостов, но выполняете его. locally или совсем в другом месте.


Идемпотентность это что-то совершенно не связанное с run_once

По определению Идемпотентность такая операция f(x), что если f(x)=y, затем f(f(x))=y. В соответствии с человеческим пониманием мы можем сказать, что применение этой функции дважды к одному и тому же аргументу не меняет результата. Вы можете думать о функции как о роли и y является результатом вашего кода.