NPV-AM

← Все статьи

Ansible без SSH: local и delegate_to

10 июля 2026 · 8 мин чтения

Когда 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

Типичные сценарии

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