← Все статьи
Ansible без SSH: local и delegate_to
Когда SSH не нужен
Ansible по умолчанию подключается по SSH к managed nodes. Но есть задачи, которые нужно выполнить на контроллере, на другом хосте или локально. Для этого есть delegate_to и local_action.
delegate_to
Позволяет выполнить задачу на хосте, отличном от текущего:
- name: Извлечь файл из Docker на develop
shell: |
docker create --name extract conv-vpn/caddy:latest
docker cp extract:/usr/local/bin/caddy /tmp/caddy
docker rm extract
delegate_to: develop
run_once: true
Типичные сценарии
- Извлечение артефактов — скопировать файл из Docker на develop, затем доставить на vpn-prod
- fetch на контроллер — забрать файл с удалённого хоста на машину, где запущен ansible
- Запрос к API — вызвать внешний API с контроллера, а не с managed node
local_action vs delegate_to: localhost
# Вариант 1: local_action
- name: Собрать файлы
local_action:
module: shell
cmd: make build
# Вариант 2: delegate_to
- name: Собрать файлы
shell: make build
delegate_to: localhost
become: false
Рекомендуется delegate_to: localhost — он читаемее и явнее.
run_once
Когда у вас 10 хостов в инвентаре, но задачу нужно выполнить один раз:
- name: Забрать артефакт
fetch:
src: /tmp/file
dest: /tmp/file
flat: true
delegate_to: develop
run_once: true
Без run_once fetch попытается выполниться 10 раз и перезаписать файл.
Практический пример: деплой Caddy
Цепочка: Docker на develop → fetch на контроллер → copy на vpn-prod:
1. delegate_to: develop — docker cp caddy из контейнера
2. delegate_to: develop — fetch: src=/tmp/caddy dest=/tmp/caddy flat=true
3. copy: src=/tmp/caddy dest=/usr/local/bin/caddy — на vpn-prod
4. delegate_to: localhost — rm /tmp/caddy (cleanup)
Вывод
delegate_to — мощный инструмент для оркестрации задач между хостами. Используйте когда нужно выполнить действие не на целевом хосте, а на другом хосте в инфраструктуре.