Вопрос или проблема
Я хочу синхронизировать структуру каталогов с одного удаленного сервера на другой, используя playbook.yml Ansible. Во время выполнения команды rsync через модуль shell Ansible возникает ошибка. Я знаю причину – используется исполняемый файл ssh по умолчанию от поставщика в качестве основы команды rsync. Необходимо использовать версию ssh с поддержкой kerberos, которая также находится на удаленной системе. Если я вручную войду на remoteA и выполню ту же команду rsync, указанную в сценарии absible (с использованием -e /path/to/Kerberos/ssh), все работает нормально. Но, похоже, Ansible не учитывает флаг -e для указания, какой ssh использовать, и, следовательно, возникает ошибка аутентификации Kerberos.
Существует ли способ заставить его использовать правильную версию ssh с исполняемым файлом rsync? Именно это и сообщало -e /desired/version/of/ssh, но снова же, по какой-то причине ansible, похоже, не может это использовать.
- name: "rsync base_directory remoteA ==> remoteB"
shell:
cmd: 'rsync -av -e /path/to/kerberos/version/ssh base_directory [email protected]:/path/to/desired/location/'
chdir: '/path/to/remtoteA/parentDir/for/base_directory'
Ответ или решение
Решение проблемы с использованием команды rsync через Ansible с поддержкой Kerberos SSH
Введение
В данной статье мы рассмотрим проблему, с которой столкнулись при использовании Ansible для копирования директорий с помощью команды rsync, когда возникает необходимость использовать Kerberos-авторизованный SSH. Проблема заключается в том, что Ansible не использует указанный вами SSH-адаптер, что в свою очередь приводит к ошибкам аутентификации Kerberos.
Суть проблемы
Вы сообщаете, что команда rsync не выполняется должным образом из-за использования SSH-бинари по умолчанию, вместо версии, которая поддерживает Kerberos. В то время как при ручном выполнении команды с использованием флага -e
, указывающего конкретный SSH, все работает корректно, Ansible игнорирует этот флаг.
Причины возникновения проблемы
Ansible предоставляет возможность указывать используемый SSH в своем конфигурационном файле, однако внутри задач shell и command использование флага -e
может не сработать должным образом. Это связано с тем, что Ansible обрабатывает команды по другому алгоритму и, возможно, не передает нужные параметры, которые вы указали.
Решение
Чтобы решить данную проблему, вы можете использовать несколько подходов:
1. Настройка ansible_ssh_executable
Параметр ansible_ssh_executable
позволяет указать, какую версию SSH использовать Ansible. Добавьте следующий код в ваш playbook или инвентарный файл:
- hosts: remoteA
vars:
ansible_ssh_executable: /path/to/kerberos/version/ssh
tasks:
- name: "rsync base_directory remoteA ==> remoteB"
shell: 'rsync -av -e /path/to/kerberos/version/ssh base_directory [email protected]:/path/to/desired/location/'
args:
chdir: '/path/to/remoteA/parentDir/for/base_directory'
2. Использование модуля rsync Ansible
Ansible предоставляет специализированный модуль ansible.posix.synchronize
, который идет в комплекте с функциональностью rsync и может использовать настроенный SSH по умолчанию. Используйте его вместо shell:
- hosts: remoteA
vars:
ansible_ssh_executable: /path/to/kerberos/version/ssh
tasks:
- name: "Synchronize base_directory from remoteA to remoteB"
ansible.posix.synchronize:
mode: push
src: base_directory
dest: [email protected]:/path/to/desired/location/
Этот способ более предпочтителен, потому что он использует внутренние механизмы Ansible для управления ssh-соединениями и может работать более стабильно.
3. Проверка конфигурации SSH
Убедитесь, что ваш SSH-клиент (в данном случае Kerberos-версия) правильно настроен. Возможно, вам потребуется внести изменения в файл конфигурации (~/.ssh/config
), чтобы убедиться, что для конкретного хоста будет использоваться нужный SSH:
Host remoteA
HostName remoteA.com
User your_user
IdentityFile /path/to/identity
ForwardAgent yes
Port 22
PreferredAuthentications gssapi-with-mic
Заключение
Теперь вы знаете, как настроить Ansible для использования Kerberos-версии SSH при запуске команды rsync. Важно помнить, что использование специализированных модулей, таких как synchronize
, может значительно упростить процесс автоматизации. Я надеюсь, что данные рекомендации помогут вам эффективно решать аналогичные задачи в будущем.
Если у вас возникнут дополнительные вопросы, пожалуйста, не стесняйтесь обращаться за помощью.