via the publickey permission password failed ansible

the - Especificando la clave ssh en el archivo de libro de juego ansible



ansible user (3)

El nombre de la variable que está buscando es ansible_ssh_private_key_file .

Deberías configurarlo en el nivel ''vars'':

  • en el archivo de inventario:

    myHost ansible_ssh_private_key_file=~/.ssh/mykey1.pem myOtherHost ansible_ssh_private_key_file=~/.ssh/mykey2.pem

  • en el host_vars :

    # hosts_vars/myHost.yml ansible_ssh_private_key_file: ~/.ssh/mykey1.pem # hosts_vars/myOtherHost.yml ansible_ssh_private_key_file: ~/.ssh/mykey2.pem

  • en un archivo group_vars si usa la misma clave para un grupo de hosts

  • en la sección vars de tu juego EDITAR : esta solución no funciona porque es demasiado tarde para definir la variable.

    - hosts: myHost remote_user: ubuntu vars_files: - vars.yml vars: ansible_ssh_private_key_file: "{{ key1 }}" tasks: - name: Echo a hello message command: echo hello

Documentación de inventario

Ansible Playbook puede especificar la clave utilizada para la conexión ssh usando --key-file en la línea de comandos.

ansible-playbook -i hosts playbook.yml --key-file "~/.ssh/mykey.pem"

¿Es posible especificar la ubicación de esta clave en el archivo de libro de jugadas en lugar de usar --key-file en la línea de comandos?

Porque quiero escribir la ubicación de esta clave en un archivo var.yaml , que será leído por un libro de vars_files: ansible con vars_files:

Los siguientes son partes de mi configuración:

archivo vars.yml

key1: ~/.ssh/mykey1.pem key2: ~/.ssh/mykey2.pem

archivo playbook.yml

--- - hosts: myHost remote_user: ubuntu key_file: {{ key1 }} # This is not a valid syntax in ansible. Does there exist this kind of directive which allows me to specify the ssh key used for this connection? vars_files: - vars.yml tasks: - name: Echo a hello message command: echo hello

He intentado agregar ansible_ssh_private_key_file debajo de vars . Pero no funciona en mi máquina.

vars_files: - vars.yml vars: ansible_ssh_private_key_file: "{{ key1 }}" tasks: - name: Echo a hello message command: echo hello

Si ejecuto ansible-playbook con el playbook.yml arriba. Tuve el siguiente error:

TASK [Gathering Facts] ****************************************************************************************************************************** Using module file /usr/local/lib/python2.7/site-packages/ansible/modules/system/setup.py <192.168.5.100> ESTABLISH SSH CONNECTION FOR USER: ubuntu <192.168.5.100> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ubuntu -o ConnectTimeout=10 -o ControlPath=/Users/myName/.ansible/cp/2d18691789 192.168.5.100 ''/bin/sh -c ''"''"''echo ~ && sleep 0''"''"'''' <192.168.5.100> (255, '''', ''Permission denied (publickey)./r/n'') fatal: [192.168.5.100]: UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey)./r/n", "unreachable": true } to retry, use: --limit @/Users/myName/playbook.retry

No encuentro el nombre de mi archivo de clave en el comando ssh. Es extraño.


Puede usar el archivo ansible.cfg, debería verse así (hay otros parámetros que tal vez quiera incluir):

[defaults] inventory: <YOUR INVENTORY> remote_user = <YOUR USER> private_key_file = <PATH TO KEY_FILE>

Espero que esto te ahorra algo de escritura


Si ejecuta su libro de jugadas con ansible-playbook -vvv verá que se está ejecutando el comando real, de modo que puede verificar si la clave está siendo incluida realmente en el comando ssh (y puede descubrir que el problema fue el nombre de usuario incorrecto en lugar de la clave que falta).

Estoy de acuerdo con el comentario de Brian anterior (y con la edición de zigam) de que la sección vars es demasiado tarde. También probé incluyendo la clave en la definición sobre la marcha del host como este

# fails - name: Add all instance public IPs to host group add_host: hostname={{ item.public_ip }} groups=ec2hosts ansible_ssh_private_key_file=~/.aws/dev_staging.pem loop: "{{ ec2.instances }}"

pero eso también falla.

Así que esto no es una respuesta. Sólo un poco de ayuda de depuración y cosas para no intentar.