Кажется, у меня проблема, когда Ansible не использует мой кеш агента SSH. Я выполнил следующее:
eval `ssh-agent`
ssh-add /tmp/key
Затем я успешно вхожу в один из хостов из своего инвентаря, и это нормально:
ssh -i /tmp/key ec2-user@1.2.3.4
При использовании ansible на моем компьютере с Windows в WSL следующее заканчивается странным однострочным тройным запросом (по одному для каждого в моем инвентаре)
ansible --key-file /tmp/key -i ./hosts all -m ping
Вывод:
Enter passphrase for key '/tmp/key': Enter passphrase for key '/tmp/key': Enter passphrase for key '/tmp/key':
repo | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).",
"unreachable": true
}
follower | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).",
"unreachable": true
}
leader | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).",
"unreachable": true
}
Я считаю, что Ansible должен использовать Paramiko для SSH, но предполагаю, что он все равно будет разговаривать с моим агентом SSH. Есть догадки, почему это не работает?
Это также работает на WSL в Windows 10, если это важно.
Вот результат с "-vvv":
ssh -C -o ControlMaster=auto -o ControlPersist=60s -o 'IdentityFile="/tmp/key"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/mnt/c/Users/me/.ansible/cp/58691c2f88 1.2.3.4 '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''
Это время истекает при запуске из командной строки
Удаление парольной фразы полностью удаляет приглашение, но я продолжаю получать те же ошибки, поэтому может быть, что это видно каждый раз, когда Ansible не может аутентифицироваться на удаленных хостах?
Тьфу. PEBCAK. Проблема в том, что Ansible использует здесь неправильное имя пользователя.
Для других моим обходным решением было указать пользователя в инвентаре:
all:
vars:
ansible_user: "ec2-user"
hosts:
leader:
ansible_host: 1.2.3.1
follower:
ansible_host: 1.2.3.2
repo:
ansible_host: 1.2.3.3
Не указывайте файл ключа, и Ansible просто запустит и использует агент, но, указав ключ, вы сообщаете Ansible этот ключ пользователю напрямую, а не агенту.