Автоматическая 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]

❓ Вопросы

  1. Почему он запрашивает пароль при создании ssh-соединения без прямого входа в систему с помощью Ansible?
  2. Почему пишет, что у меня нет разрешения?
    • Ответ : Это произошло из-за неиспользованияbecomeдирективу в сочетании с правильнымbecome_user(имя пользователя Windows).
  3. Когда речь идет об отсутствии разрешения, имеется ли в виду исходный хост?pi@raspberrypiили хост назначения?
    • Ответ : Хост назначения.my_user@my_laptop.
  4. Нужно ли мне создавать varansible_ssh_private_key_fileв моей пьесе? Или ansible должен автоматически найти личность вssh-agent?

Заранее спасибо.

Обновление

Мне удалось исправить некоторые проблемы;

  • OpenSSH не был настроен должным образом на моем компьютере с Windows. Я нашел эту документацию Microsoft и это видео очень полезными.
  • Мой сценарий был неправильным. При использовании хоста под управлением Windows с ansible убедитесь, что следующие директивы заполнены :

~/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

❓Новые вопросы:

  1. Почему он все еще запрашивает парольную фразу для закрытого ключа, а не берет его у ssh-агента?
  2. Почему я должен вводить парольную фразу 3 раза: один раз при сборе фактов и еще два раза при выполнении задачи?

0 ответов

Другие вопросы по тегам