Отказ модуля Ansible синхронизации между vagrant box и удаленным хостом
Примечание. Все примеры кода в этом вопросе доступны для просмотра в контексте по адресу https://github.com/discopatrick/ansible-pocs/tree/feature/sync (обратите внимание на конкретную ветку). Я также предоставил ссылки на конкретные строки, где это уместно.
Полезная информация:
- ОС: OSX El Capitan 10.11.6
- Ansible версия: 2.2.1.0
- Все остальные версии пакета находятся в файле требований: https://github.com/discopatrick/ansible-pocs/blob/feature/sync/requirements.txt
Вопрос: как я могу использовать модуль синхронизации Ansible между бродячей коробкой и удаленным хостом?
Я собираюсь продемонстрировать свою проблему, сначала показав успешный вариант использования, а затем продемонстрировав, как мой нужный вариант сбоя завершается неудачей.
синхронизировать между двумя удаленными хостами: успешно
Я использовал модуль синхронизации между двумя удаленными хостами, используя параметр Delegate_to, и он прекрасно работает:
https://github.com/discopatrick/ansible-pocs/blob/feature/sync/rsync-remote.yml#L39-L52
## This playbook is run against host ansible-pocs-1, but this task is
## delegated to ansible-pocs-2. In practice this means that the task
## first ssh's into ansible-pocs-2 and then runs rsync in PUSH mode
## using ansible-pocs-1 as the destination.
- name: sync remote folder to remote folder
synchronize:
src: /home/admin/syncthis-pocs2/
dest: /home/admin/syncthis-pocs1/
delete: yes
delegate_to: ansible-pocs-2
Выход:
ЗАДАЧА [синхронизировать удаленную папку с удаленной папкой] ************************************** изменил: [ansible-pocs-1 -> Нет]
Обратите внимание, что обе удаленные машины используют одну и ту же пару ключей для входа в систему ("~/.ssh/id_rsa" на моем локальном хосте), одно и то же имя пользователя ("admin") и один и тот же порт ssh (22).
Вот пример подробного вывода из этой задачи - я думаю, что это может стать значительным позже:
... изменено: [ansible-pocs-1 -> нет] => { "изменено": true, "cmd": "/usr/bin/rsync --delay-updates -F --compress --delete-after --archive --rsh 'ssh -S none -o StrictHostKeyChecking=no -o Port=22' --out-format='<>%i %n%L' \"/home/admin/syncthis-pocs2/\" \"178.62.50.236:/home/admin/syncthis-pocs1/\"", ...
синхронизировать между vagrant box и удаленным хостом: не удается
Я сейчас пытаюсь сделать то же самое между бродячей коробкой и удаленным хостом, но получаю ошибку. Вот код задачи. Для ясности, бродячая коробка называется "альфа":
https://github.com/discopatrick/ansible-pocs/blob/feature/sync/rsync-vagrant-1step.yml#L26-L35
## This playbook is run against host ansible-pocs-1, but this task is
## delegated to alpha. In practice this means that the task
## first ssh's into alpha and then runs rsync in PUSH mode
## using ansible-pocs-1 as the destination.
- name: sync vagrant folder to remote folder
synchronize:
src: /home/vagrant/syncthis-alpha/
dest: /home/admin/syncthis-pocs1/
delete: yes
delegate_to: alpha
Вот ошибка:
фатальный: [ansible-pocs-1 -> None]: не удалось! => {"Изменено": false, "cmd": "/usr/bin/rsync --delay-updates -F --compress --delete-after --archive --rsh 'ssh -i /Users/patrick/ Документы / Разработка / ansible-pocs /.vagrant / машины /alpha/virtualbox/private_key -S нет -o StrictHostKeyChecking = нет -o порт =2200' --out-format='<>%i %n%L' \"/home/vagrant/syncthis-alpha/\" \"178.62.50.236:/home/admin/syncthis-pocs1/\"", failed": true, "msg": " Предупреждение: файл идентификации / Users / patrick / Документы / Разработка /ansible-pocs/.vagrant/machines/alpha/virtualbox/private_key недоступны: нет такого файла или каталога.\ Nssh: подключиться к хосту 178.62.50.236 порт 2200: соединение отклонено \r\nrsync: соединение неожиданно закрыто (Получено 0 байт) [sender]\nrsync error: ошибка в потоке данных протокола rsync (код 12) в io.c(226) [sender=3.1.0]\n", "rc": 12}
В этом сообщении об ошибке есть две интересные вещи: порт SSH и путь к закрытому ключу.
Ansible пытается использовать неправильный порт SSH
Ansible пытается подключиться к порту 2200 на моем удаленном хосте. Это не сработает; 2200 - это порт ssh на блочном блоке, но удаленный хост использует порт 22. Кажется, что Ansible использует параметры из файла инвентаризации группы разработки при подключении удаленного хоста промежуточной группы.
Вот инвентарь разработки:
alpha ansible_ssh_host=127.0.0.1 ansible_ssh_port=2200 ansible_ssh_user='vagrant' ansible_ssh_private_key_file='/Users/patrick/Documents/Development/ansible-pocs/.vagrant/machines/alpha/virtualbox/private_key'
...
Вот промежуточная инвентаризация без указания порта (неявно с использованием порта 22):
ansible-pocs-1 ansible_ssh_host=178.62.50.236
ansible-pocs-2 ansible_ssh_host=178.62.96.61
...
Я могу исправить эту проблему, явно указав порт для использования на моих удаленных хостах:
ansible-pocs-1 ansible_ssh_host=178.62.50.236 ansible_ssh_port=22
...
Теперь вывод гласит:
... -o порт =22 ...
На следующую интересную точку:
Ansible пытается получить доступ к закрытому ключу по пути, существующему на хост-машине, а не по бродячему гостевому ящику.
Предупреждение: файл идентификации /Users/patrick/Documents/Development/ansible-pocs/.vagrant/machines/alpha/virtualbox/private_key недоступен: такого файла или каталога нет.\ N Правда запрещена (publickey).
Этот путь существует на моей хост-машине. Почему Ansible пытается передать его в команду rsync, которая выполняется на гостевой машине? Может ли это быть ошибкой в модуле синхронизации?
Кроме того, почему модуль синхронизации не имеет этой проблемы при попытке соединения между двумя удаленными хостами? Если вы посмотрите выше на подробный вывод из следующей задачи удаленной синхронизации, то нет попытки получить доступ к несуществующему пути. В этом случае я считаю, что переадресация ssh-ключей очень хорошо заботится о вещах.
Я попытался исправить эту проблему таким же образом, как и предыдущий вопрос, указав в промежуточном файле хоста, какой файл закрытого ключа использовать:
ansible-pocs-1 ansible_ssh_host=178.62.50.236 ansible_ssh_port=22 ansible_ssh_private_key_file=~/.ssh/id_rsa
... но это приводит к тому же сообщению об ошибке.
Может ли быть проблема в том, что имя пользователя ssh для vagrant и удаленного ящика различно? Похоже, что это не имеет значения для остальных задач в пьесе, которая с радостью переключается между выполнением задач на разных хостах с использованием Delegate_to. Несмотря на это, я мог бы попытаться указать в инвентаре, какой пользователь должен подключиться к коробке:
ansible-pocs-1 ansible_ssh_host=178.62.50.236 ansible_ssh_port=22 ansible_ssh_private_key_file=~/.ssh/id_rsa ansible_ssh_user=admin
... опять то же сообщение об ошибке.
Дальнейшее расследование
Я также попытался вставить свой открытый ключ по умолчанию в файл авторизованный ящик vagrant box, в надежде, что использование одного и того же ключа на всех компьютерах (как vagrant, так и удаленных) может помочь. Вот код, который делает это (в настоящее время частично прокомментирован, поскольку это не решило проблему):
https://github.com/discopatrick/ansible-pocs/blob/feature/sync/Vagrantfile
# config.ssh.insert_key = false # don't insert secure key, use default insecure key
# config.ssh.private_key_path = [
# "~/.ssh/id_rsa", # the first key in the list is the one used by ansible
# "~/.vagrant.d/insecure_private_key", # vagrant will attempt to use subsequent keys on a \`vagrant ssh\`
# ]
# add host default public ssh key to guest authorized_keys file
config.vm.provision "file",
source: "~/.ssh/id_rsa.pub",
destination: "~/host_id_rsa.pub"
config.vm.provision "shell",
inline: "cat ~/host_id_rsa.pub >> ~/.ssh/authorized_keys",
privileged: false # runs with sudo by default
Сообщение об ошибке почти идентично, за исключением того, что теперь он пытается найти путь к /Users/patrick/.ssh/id_rsa
на бродячем ящике, которого, конечно, не существует:
фатальный: [ansible-pocs-1 -> None]: не удалось! => {"Изменено": false, "cmd": "/usr/bin/rsync --delay-updates -F --compress --delete-after --archive --rsh 'ssh -i /Users/patrick/.ssh/id_rsa -S нет -o StrictHostKeyChecking = нет -o порт =22' --out-format='<>%i %n%L' \"/home/vagrant/syncthis-alpha/\" \"178,62.50.236:/home/admin/syncthis-pocs1/\"", "failed": true, "msg": "Предупреждение: файл идентификации /Users/patrick/.ssh/id_rsa недоступен: такого файла или каталога нет.\nPermission denied (publickey).\r\nrsync: соединение неожиданно закрыто (пока получено 0 байт) [отправитель] \ nrsync error: ошибка в потоке данных протокола rsync (код 12) на io.c (226) [sender = 3.1. 0] \ n "," rc ": 12}
Ошибка пользователя или ошибка?
Я думал, что опубликую это здесь, в Stack Overflow, прежде чем сообщать об этом как об ошибке в команде Ansible, потому что, несмотря на то, что, как я чувствую, дотошный, я мог упустить что-то простое.
Кто-нибудь может помочь?
0 ответов
Возникла та же проблема, и следующий обходной путь помог, если вы поставили его перед synchronize
задача:
- name: Set correct ssh key path
set_fact:
ansible_ssh_private_key_file: "{{ ansible_ssh_private_key_file | realpath }}"
when: ansible_ssh_private_key_file is defined