Страницы

Поиск по вопросам

пятница, 26 октября 2018 г.

Копирование файлов посредством ansible

Что-то не смог понять из примеров в документации - как же скопировать файл с удалённого сервера на локальный и наоборот? Вот есть модули 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.

Комментариев нет:

Отправить комментарий