Ansiblesync запрашивает парольную фразу, даже если она уже введена в начале

Модуль синхронизации Ansible (v1.6.5) запрашивает парольную фразу (введите парольную фразу для ключа) хотя я уже ввел ее в начале запуска playbook.

Есть идеи, почему?

Я запускаю свою книгу со следующими параметрами:

-u myuser --ask-sudo-pass --private-key=/path/to/id_rsa

Вот моя задача синхронизации:

- name: synchronize source files in src location
  sudo: yes
  synchronize: src={{local_src}} dest={{project_dirs.src}} archive=yes delete=yes rsync_opts=["--compress"]
  when: synchronize_src_files

ОБНОВЛЕНИЕ с помощью ssh-agent

По совету Лекенштейна попробовал с ssh-agent. У меня больше нет подсказки, но задача не выполняется. Что мне не хватает?

eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa

Ошибка:

TASK: [rolebooks/project | synchronize source files in src location] **********
failed: [10.0.0.101] => {"cmd": "rsync --delay-updates -FF --compress --delete-after --archive --rsh 'ssh -i /home/vagrant/.ssh/id_rsa -o StrictHostKeyChecking=no' --rsync-path=\"sudo rsync\" [--compress] --out-format='<<CHANGED>>%i %n%L' /projects/webapp [email protected]:/var/local/sites/project1/src", "failed": true, "rc": 12}
msg: sudo: no tty present and no askpass program specified
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [sender=3.1.0]

person Michael    schedule 15.07.2014    source источник


Ответы (5)


Команда synchronize (по крайней мере, до Ansible 1.6.6), похоже, игнорирует обычный сокет управления SSH, открытый Ansible. Ваша задача может расшириться до следующего:

{
    "cmd": "rsync --delay-updates -FF --compress --archive
        --rsh 'ssh  -o StrictHostKeyChecking=no'
        --out-format='<<CHANGED>>%i %n%L'
        /home/me/src/ user@host:/dest/",
    "failed": true,
    "rc": 23
}

Чтобы получить эти данные, запустите свой плейбук с параметром -v. В качестве обходного пути вы можете запустить ssh-agent и добавить в кэш свой SSH-ключ с помощью ssh-add. Обратитесь к их справочным страницам для получения подробной информации.

Дополнительные предостережения относительно модуля synchronize:

  • При запуске с sudo: yes ansible будет работать с --rsh 'sudo ssh', что сломается, если для удаленной конфигурации sudo потребуется пароль и/или TTY. Решение: установите sudo: no в определении задачи.
  • Пользователь, который входит в удаленную машину, является вашим пользователем SSH (ansible_ssh_user), а не пользователем sudo. Я не нашел способа переопределить этого пользователя (кроме непроверенного метода, который переопределяет пользователя с опцией -o User через одну из других опций (dest_port="22 -o User=your_user"?) в сочетании с set_remote_user=yes).

Это взято из моего файла задач:

- name: sync app files
  sudo: no
  synchronize: src={{app_srcdir}}/ dest={{appdir}}/
               recursive=yes
               rsync_opts=--exclude=.hg
# and of course Ubuntu 12.04 does not support --usermap..
#,--chown={{deployuser}}:www-data
# the above goes bad because ansible_ssh_user=user has no privileges
#  local_action: command rsync -av --chown=:www-data
#                 {{app_srcdir}}
#                 {{deployuser}}@{{inventory_hostname}}:{{appdir}}/
#  when: app_srcdir is defined
# The above still goes bad because {{inventory_hostname}} is not ssh host...
person Lekensteyn    schedule 17.07.2014
comment
хорошо, то, что я испытываю, - это нормальное поведение, это не проблема только в моем случае. Работает ли использование ssh-agent или рекомендуется попробовать? - person Michael; 18.07.2014
comment
Это нормальное поведение, но нежелательно, чтобы rsync не использовал контрольный сокет Ansible, что должно избежать необходимости повторной аутентификации. ssh-agent точно работает, это то, что делаю я (и, вероятно, большинство других людей). Он также упоминается в docs.ansible.com/intro_getting_started.html. - person Lekensteyn; 18.07.2014
comment
@YAmikep Ошибка исходит от sudo, что означает, что команда SSH выполнена успешно. Я уже упоминал, что считаю synchronize худшей, неинтегрированной частью ansible? - person Lekensteyn; 21.07.2014
comment
да согласен, этот модуль сейчас не самый лучший. Я не могу использовать модуль копирования, это занимает слишком много времени, поэтому то, что я сделал, это изменило владельца и разрешение удаленной папки перед использованием синхронизации. Я ответил на свой вопрос своим решением. Что вы думаете? - person Michael; 21.07.2014

Я думаю, что по умолчанию синхронизация явно устанавливает имя пользователя в команде rsync — вы можете предотвратить это и разрешить rsync работать из вашего конфигурационного файла ssh.

http://docs.ansible.com/synchronize_module.html

set_remote_user укажите user@ для удаленных путей. Если у вас есть пользовательская конфигурация ssh для определения удаленного пользователя для хоста, который не соответствует пользователю инвентаризации, вы должны установить для этого параметра значение «нет».

У меня есть удаленный пользователь, настроенный в моей конфигурации ssh, и мне нужно было добавить set_remote_user=no, чтобы синхронизация работала, иначе он пытался использовать неправильное имя пользователя, и ни ключ ssh, ни пароль не работали.

person Sean Burlington    schedule 20.03.2015

Отключение tty_tickets в /etc/sudoers на удаленной машине устраняет эту проблему (за счет небольшого снижения безопасности). Например.,

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset,!tty_tickets
# ...
person nwk    schedule 25.09.2015

Я пытался использовать модуль копирования, но это занимает слишком много времени. Итак, чтобы модуль синхронизации заработал, я сделаю следующее. Это не идеально, но, по крайней мере, это работает.

  1. изменить владельца и разрешения целевой удаленной папки на пользователя, которого я использую

  2. использовать синхронизацию без sudo

  3. вернуть права собственности и разрешения удаленного получателя на то, что я хотел раньше

person Michael    schedule 21.07.2014
comment
Если синхронизация не удалась, (3) не будет выполнено, что может привести к нарушению вашего развертывания. Это можно обойти, добавив ignore_errors: True и добавив дополнительную проверку после register: sync_result, но это тоже не идеально. Возможно, кто-то уже сообщал об этом в системе отслеживания ошибок Ansible? - person Lekensteyn; 22.07.2014
comment
@Lekensteyn Существует отчет об ошибке, связанный с тем, что модуль Synchronize запрашивает пароль во время запуска playbook github.com/ansible /ансибл/проблемы/7071 - person Michael; 22.07.2014

Лучший способ приблизиться к этому - установить ваш ключ в ssh author_keys для пользователя root на удаленный сервер.

person podarok    schedule 24.03.2015
comment
Это, вероятно, было преждевременно отклонено, учитывая, что многие удаленные службы контейнеров (такие как EC2) технически уже поддерживают вход в систему root (через ssh ec2-user@node; sudo su). Таким образом, копирование ключей в root не представляет реальной угрозы безопасности. Во всяком случае, это упрощает жизнь. - person robert; 10.03.2016
comment
Удаление ключа у удаленного пользователя root после завершения synchronize ограничит угрозу безопасности узким временным окном. - person Derek Mahar; 15.12.2016