Автоматическая ssh-аутентификация Ansible с использованием закрытого ключа, защищенного парольной фразой
Кажется, я не могу автоматически получить добавленный мной идентификатор SSH, и если мне будет предложено ввести парольную фразу для моего закрытого ключа, моя парольная фраза, похоже, не будет принята, в то время как та же самая парольная фраза принимается только при использовании SSH. 'без ансибля. Если я изменю playbook, чтобы использовать директивы,become_user: <Windows user>
и скрипт запускается, но мне все равно приходится вводить парольную фразу несколько раз...
- Исходный хост — Raspberry Pi под управлением Debian Bullseye.
- Целевой хост — Thinkpad T580 под управлением Windows 11.
✅ SSH без анзибла
pi@raspberrypi:~ $ ssh-agent bash
pi@raspberrypi:~ $ ssh-add ~/.ssh/id_rsa
Enter passphrase for /home/pi/.ssh/id_rsa:
Identity added: /home/pi/.ssh/id_rsa (pi)
pi@raspberrypi:~ $ ssh my_user@192.168.178.170
...
Microsoft Windows [Version 10.0.22621.1265]
(c) Microsoft Corporation. All rights reserved.
my_user@MY_LAPTOP C:\Users\my_user>
// Works fine without any password or passphrase ✅
/etc/ansible/ansible.cfg
[defaults]
host_key_checking = False
[ssh_connection]
ssh_args = -o ForwardAgent=yes
/etc/ansible/hosts
[local]
my_laptop ansible_host=192.168.178.170 ansible_connection=ssh ansible_user=my_user
~/ansible/playbook.yml
---
- name: Fetch public key
hosts: my_laptop
gather_facts: yes
vars:
ansible_ssh_private_key_file: /home/my_user/.ssh/id_rsa # <- With or without?
tasks:
- name: Fetch temporary key
fetch:
src: ~/.ssh/id_rsa.pub
dest: /tmp/id_rsa.pub
flat: yes
❌ С:
Я ввожу парольную фразу 3 раза, затем продолжает говорить, что нет разрешения на создание/tmp/
каталог
Enter passphrase for key '/home/my_user/.ssh/id_rsa':
Enter passphrase for key '/home/my_user/.ssh/id_rsa':
Enter passphrase for key '/home/my_user/.ssh/id_rsa':
fatal: [my_laptop]: UNREACHABLE! => {
"changed": false,
"msg": "Failed to create temporary directory.In some cases, you may have been able to authenticate and did not have permissions on the target directory.
Consider changing the remote tmp path in ansible.cfg to a path rooted in \"/tmp\", for more error information use -vvv.
Failed command was: ( umask 77 && mkdir -p \"` echo ~/.ansible/tmp `\"&& mkdir \"` echo ~/.ansible/tmp/ansible-tmp-1676947350.1170616-19638-181124692161141 `\" && echo ansible-tmp-1676947350.1170616-19638-181124692161141=\"` echo ~/.ansible/tmp/ansible-tmp-1676947350.1170616-19638-181124692161141 `\" ), exited with result 1",
"unreachable": true
}
❌Без:
fatal: [my_laptop]: UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: my_user@192.168.178.170: Permission denied (publickey,password,keyboard-interactive).",
"unreachable": true
}
Журналы просмотра событий Windows:
sshd: Connection closed by authenticating user my_user 192.168.178.20 port 42742 [preauth]
❓ Вопросы
- Почему он запрашивает пароль при создании ssh-соединения без прямого входа в систему с помощью Ansible?
- Почему пишет, что у меня нет разрешения?
- Ответ : Это произошло из-за неиспользования
become
директиву в сочетании с правильнымbecome_user
(имя пользователя Windows).
- Ответ : Это произошло из-за неиспользования
- Когда речь идет об отсутствии разрешения, имеется ли в виду исходный хост?
pi@raspberrypi
или хост назначения?- Ответ : Хост назначения.
my_user@my_laptop
.
- Ответ : Хост назначения.
- Нужно ли мне создавать var
ansible_ssh_private_key_file
в моей пьесе? Или ansible должен автоматически найти личность вssh-agent
?
Заранее спасибо.
❗ Обновление
Мне удалось исправить некоторые проблемы;
- OpenSSH не был настроен должным образом на моем компьютере с Windows. Я нашел эту документацию Microsoft и это видео очень полезными.
- Мой сценарий был неправильным. При использовании хоста под управлением Windows с ansible убедитесь, что следующие директивы заполнены :
-
become: yes
-
become_user: <Your Windows user>
-
ansible_shell_type: cmd
(Установлен вcmd
или , но при использованииpowershell
необходима дополнительная конфигурация ).
-
~/playbook.yml
до сих пор:
---
- name: Fetch public key
hosts: my_laptop
gather_facts: yes
become: yes
become_user: my_user
vars_files:
- secrets.yml
vars:
ansible_ssh_private_key_file: /home/my_user/.ssh/id_rsa
ansible_shell_type: cmd
tasks:
- name: Fetch temporary key
fetch:
src: ~/.ssh/id_rsa.pub
dest: /tmp/id_rsa.pub
flat: yes
...
Сценарий запускается, но запрашивает парольную фразу 3 раза.
PLAY [Fetch public key] *************************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************************
Enter passphrase for key '/home/my_user/.ssh/id_rsa':
ok: [my_laptop]
TASK [Fetch temporary key] **********************************************************************************************************************************
Enter passphrase for key '/home/my_user/.ssh/id_rsa':
Enter passphrase for key '/home/my_user/.ssh/id_rsa':
ok: [my_laptop]
PLAY RECAP **************************************************************************************************************************************************
my_laptop : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
❓Новые вопросы:
- Почему он все еще запрашивает парольную фразу для закрытого ключа, а не берет его у ssh-агента?
- Почему я должен вводить парольную фразу 3 раза: один раз при сборе фактов и еще два раза при выполнении задачи?