Spec-Zone.ru › Ansible 2.11

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

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

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

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

Некоторые задачи всегда выполняются на контроллере. Эти задачи, включая include, add_host, и debug, нельзя делегировать.

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

Если вы хотите выполнить задачу на одном узле со ссылкой на другие узлы, используйте ключевое слово 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 отражает узел, к которому делегирована задача.

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

Делегирование задач 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 на GitHub

Многие примеры полных развертываний

Список рассылки пользователей

Есть вопрос? Заходите в группу Google!

irc.freenode.net

IRC-чат-канал #ansible

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

Spec-Zone.ru

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