Что-то не смог понять из примеров в документации - как же скопировать файл с удалённого сервера на локальный и наоборот? Вот есть модули copy и fetch, например. Вот я пишу в плейбуке:
- name: Copy file from remote host to local machine
fetch: src=/tmp/somefile dest=/tmp/fetched(взято из доки)
Как указать ansible, с какого хоста я хочу скопировать файл? Ну и соответственно, при копировании на удалённый хост, где указывать этот удалённый хост?
P.S. Немного разобрался:
Чтобы скопировать файл с удалённого хоста на локальный:
- hosts: localhost
vars_files:
- config.yml
tasks:
- include: ../share/dev.yml
- name: Get file from remote
fetch: src="{{ remote_sources_path }}/test.txt" dest="backup"
delegate_to: '{{ remote_host }}'
tags: fetch
Файл test.txt будет лежать в каталоге ./backup/localhost/{{ remote_sources_path }}
Скопировать с локального на удалённый:
- name: Send file to remote
copy: src="{{ local_sources_path }}/to_remote_test.txt" dest={{ remote_sources_path }}
delegate_to: '{{ remote_host }}'
tags: fetch
Подозреваю, что, если указать в начале - hosts: {{ remote_host }} вместо localhost, то delegate_to использовать не нужно.
Ответ
Ну зачем же так сложно? ))
Все эти задачи решаются и без мороки с Delegation и Local Actions, вам же самим потом сложнее будет разбираться в собственных плейбуках или читать чужие, написанные по-простому.
Смотрите.
В каждом плейбуке вы указываете на каких хостах запускать задачи - пишете hosts: '{{ target }}' (если хотите из командной строки управлять списком через --extra-vars "target=10.0.100.123") или hosts: dbservers (если фиксировать плейбук на группу хостов):
---
# This playbook for quick tests.
- name: quick tests
hosts: '{{ target }}'
become: true
become_user: root
roles:
- role1
- role2
tasks:
- name: install mc
yum: name=mc state=latest
- name: install wget
yum: name=wget state=latest
Эти хосты - "удалённый" сервер, ну а "локальный" - это само собой хост, на котором находится ваш плейбук.
Теперь:
Для копирования файла с локального сервера на удалённый -- используете модуль copy
Для копирования файла с удалённого сервера на локальный -- используете модуль fetch
И в copy и в fetch src - это откуда брать файл, а dest - это куда положить файл. Для copy src=local а dest=remote, для fetch -- наоборот src=remote, а dest=local.
Вот и всё. Вам кстати именно об этом говорили в комментарии к вашему последнему вопросу: "В целом Ansible подразумевает то, что ты уже на удаленном хосте", не надо нарезать лишние петли вокруг локалхоста.
PS Если нужно копировать с произвольного хоста на произвольный хост - то смотрите в сторону модуля syncronyze на основе rsync. Но вообще в 90% случаев вам понадобится копирование с локального хоста на удалённый и будете использовать copy или template.
Комментариев нет:
Отправить комментарий