Spec-Zone.ru › Ansible

Управление выполнением задач: делегирование и локальные действия

По умолчанию Ansible собирает факты и выполняет все задачи на машинах, которые соответствуют строке hosts вашего плейбука. Эта страница показывает, как делегировать задачи другой машине или группе, делегировать факты определённым машинам или группам или выполнить весь плейбук локально. Используя эти подходы, вы можете точно и эффективно управлять взаимосвязанными средами. Например, при обновлении веб-серверов вам может потребоваться временно удалить их из балансирующего пула. Вы не можете выполнить эту задачу на самих веб-серверах. Делегировав задачу на localhost, вы сохраните все задачи в рамках одного плейбука.

  • Задачи, которые нельзя делегировать
  • Делегирование задач
  • Шаблонизация в контексте делегирования
  • Делегирование и параллельное выполнение
  • Делегирование фактов
  • Локальные плейбуки

Задачи, которые нельзя делегировать

Некоторые задачи всегда выполняются на контрольном узле. Эти задачи, включая include, add_host, и debug, нельзя делегировать. Вы можете определить, можно ли делегировать действие из документации атрибута connection. Если атрибут connection указывает, что support является False или None, то действие не использует подключение и не может быть делегировано.

Делегирование задач

Если вы хотите выполнить задачу на одном хосте со ссылкой на другие хосты, используйте ключевое слово delegate_to в задаче. Это идеально подходит для управления узлами в балансируемом пуле или для контроля окон простоев. Вы можете использовать делегирование с ключевым словом последовательный, чтобы контролировать количество хостов, выполняющих задачу одновременно:

---
- hosts: webservers
  serial: 5

  tasks:
    - name: Take out of load balancer pool
      ansible.builtin.command: /usr/bin/take_out_of_pool {{ inventory_hostname }}
      delegate_to: 127.0.0.1

    - name: Actual steps would go here
      ansible.builtin.yum:
        name: acme-web-stack
        state: latest

    - name: Add back to load balancer pool
      ansible.builtin.command: /usr/bin/add_back_to_pool {{ inventory_hostname }}
      delegate_to: 127.0.0.1

Первая и третья задачи в этом плейбуке выполняются на 127.0.0.1, что является машиной, на которой работает Ansible. Также есть сокращённый синтаксис, который вы можете использовать для каждой задачи: local_action. Вот тот же плейбук, что и выше, но с использованием сокращённого синтаксиса для делегирования 127.0.0.1:

---
# ...

  tasks:
    - name: Take out of load balancer pool
      local_action: ansible.builtin.command /usr/bin/take_out_of_pool {{ inventory_hostname }}

# ...

    - name: Add back to load balancer pool
      local_action: ansible.builtin.command /usr/bin/add_back_to_pool {{ inventory_hostname }}

Вы можете использовать локальное действие для вызова ‘rsync’ для рекурсивного копирования файлов на управляемые серверы:

---
# ...

  tasks:
    - name: Recursively copy files from management server to target
      local_action: ansible.builtin.command rsync -a /path/to/files {{ inventory_hostname }}:/path/to/target/

Обратите внимание, что для этого должны быть настроены ключи SSH без паролей или ssh-agent, в противном случае rsync запросит пароль.

Для указания дополнительных аргументов используйте следующий синтаксис:

---
# ...

  tasks:
    - name: Send summary mail
      local_action:
        module: community.general.mail
        subject: "Summary Mail"
        to: "{{ mail_recipient }}"
        body: "{{ mail_body }}"
      run_once: True

Примечание

  • Переменная ansible_host и другие переменные подключения, если они присутствуют, отражают информацию о хосте, к которому делегирована задача, а не inventory_hostname.
  • Хост, к которому делегируется задача, не наследует переменные с хоста, который делегирует задачу.

Предупреждение

Хотя вы можете delegate_to хост, который не существует в инвенторно (добавив IP-адрес, имя DNS или любое требование плагина подключения), это не добавляет хост в ваш инвентарь и может вызвать проблемы. Делегированные таким образом хосты наследуют переменные из группы «all» (предполагая, что ПРЕИМУЩЕСТВО_ПЕРЕМЕННЫХ включает all_inventory). Если вам необходимо delegate_to не-инвентарный хост, используйте модуль добавить хост.

Шаблонизация в контексте делегирования

Обратите внимание, что в режиме делегирования интерпретатор выполнения (обычно Python), connection, become, и shell параметры плагина теперь будут шаблонизированы с использованием значений с хоста, к которому делегирована задача. Все переменные, кроме inventory_hostname, будут теперь получены с этого хоста, а не с исходного хоста задачи. Если вам нужны переменные с исходного хоста задачи для этих параметров, вы должны использовать hostvars[inventory_hostname]['varname'], даже если inventory_hostname_short относится к хосту, которому делегирована задача.

Делегирование и параллельное выполнение

По умолчанию задачи Ansible выполняются параллельно. Делегирование задачи не изменяет этого и не обрабатывает проблемы с параллельностью (несколько вилок, записывающих в один и тот же файл). Чаще всего пользователи сталкиваются с этим при обновлении одного файла на одном делегированном хосте для всех хостов (например, с использованием модулей copy, template, или lineinfile). Они всё ещё будут работать в параллельных вилках (по умолчанию 5) и перезаписывать друг друга.

Это можно решить несколькими способами:

- name: "handle concurrency with a loop on the hosts with `run_once: true`"
  lineinfile: "<options here>"
  run_once: true
  loop: '{{ ansible_play_hosts_all }}'

Используя промежуточный плейбук с serial: 1 или используя throttle: 1 на уровне задачи, для более подробной информации см. Управление выполнением плейбука: стратегии и многое другое

Делегирование фактов

Делегирование задач Ansible подобно делегированию задач в реальной жизни – ваши продукты относятся к вам, даже если кто-то другой их доставит к вам домой. Аналогично, все собранные фактами делегированной задачи по умолчанию назначаются на inventory_hostname (текущий хост), а не на хост, который сгенерировал эти факты (хост, которому делегирована задача). Чтобы вместо текущего хоста назначить собранные факты на хост, которому делегирована задача, установите delegate_facts в true.

---
- hosts: app_servers

  tasks:
    - name: Gather facts from db servers
      ansible.builtin.setup:
      delegate_to: "{{ item }}"
      delegate_facts: true
      loop: "{{ groups['dbservers'] }}"

Эта задача собирает факты для машин в группе dbservers и назначает факты этим машинам, даже если плейбук ориентирован на группу app_servers. Таким образом, вы можете использовать hostvars[‘dbhost1’][‘ansible_default_ipv4’][‘address’], даже если dbservers не были частью плейбука или исключены с помощью --limit.

Локальные плейбуки

Иногда может быть полезно использовать плейбук локально на удалённом хосте, а не подключаясь через SSH. Это может быть полезно для обеспечения конфигурации системы, поместив плейбук в crontab. Это также можно использовать для запуска плейбука внутри установщика ОС, например, Anaconda kickstart.

Чтобы запустить весь плейбук локально, просто установите строку hosts: в hosts: 127.0.0.1 и затем запустите плейбук следующим образом:

ansible-playbook playbook.yml --connection=local

В качестве альтернативы, локальное соединение может быть использовано в одном плейбуке, даже если другие плейбуки в плейбуке используют тип удалённого подключения по умолчанию:

---
- hosts: 127.0.0.1
  connection: local

Примечание

Если вы установили соединение на локальное и нет установленного ansible_python_interpreter, модули будут выполняться в /usr/bin/python, а не в {{ ansible_playbook_python }}. Убедитесь, что вы установили ansible_python_interpreter: “{{ ansible_playbook_python }}” в host_vars/localhost.yml, например. Вы можете избежать этой проблемы, используя local_action или delegate_to: localhost вместо.

См. также

Плейбуки Ansible

Введение в плейбуки

Управление выполнением плейбука: стратегии и многое другое

Дополнительные способы управления тем, как и где Ansible выполняет действия

Связь

Есть вопросы? Нужна помощь? Хотите поделиться своими идеями? Посетите руководство по общению Ansible

© 2012–2018 Michael DeHaan
© 2018–2024 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_delegation.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API