Определение
Директива run_once: true
позволяет выполнить задачу единожды, независимо от количества управляемых хостов
Зачем это может быть нужно? Например:
- Если настроен кластер и изменения нужно производить только на мастер узле
- Если нужно выполнить запрос по API лишь один раз
- Если нужно сгенерировать или получить токен
run_once
и register
Интересно, что результат выполнения модуля через директиву register:
будет передан и для всех остальных хостов в рамках play, например, следующий play выполнит команду date
на одном из хостов (не делайте так в реальных плейбуках) и затем выведет содержимое результата этой команды на всех хостах этого play:
- name: A simple example
hosts: all
tasks:
- name: Run this ask only on one of the hosts
ansible.builtin.command: date
run_once: true
register: host_kernel
- name: Show it on all hosts
ansible.builtin.debug:
var: host_kernel
run_once
и set_fact
В отличие от register:
, set_fact:
является модулем, а следовательно переменная из set_fact
будет принадлежать лишь хосту, который был выбран для run_once:
, но я напомню, что set_fact
может передаваться между различными play’ями (подробнее в посте про set_fact)
- name: A simple example
hosts: all
tasks:
- name: Run this ask only on one of the hosts
ansible.builtin.set_fact:
sample_variable: Played on {{ ansible_host }}
run_once: true
# Эта таска упадет с ошибкой на всех других хостах
- name: Try to show it on all hosts
ansible.builtin.debug:
var: sample_variable
run_once
и handlers
С хендлерами же run_once
работает иначе, чем с register:
, в этом примере хендлер будет вызван только один раз, на хосте, который был выбран для run_once
(почитать подробнее про хендлеры можно в соответствующем посте):
- name: A simple example
hosts: all
handlers:
- name: Say hello
ansible.builtin.debug:
msg: Hello from {{ ansible_host }}
tasks:
- name: Run this ask only on one of the hosts
ansible.builtin.command: /bin/true
run_once: true
notify: Say hello
run_once
и delegate_to
Используя run_once
и delegate_to
можно явно указать на каком хосте из группы нужно выполнить задачу:
- name: A simple example
hosts: all
tasks:
- name: Run this ask only on localhost
ansible.builtin.command: /bin/true
run_once: true
delegate_to: localhost