Определение

Директива 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