В файле задачи, роль которого заключается в установке 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
является результатом вашего кода.