pública puttygen publicas privadas por keygen generar como claves clave autenticación ansible ansible-playbook

ansible - puttygen - cómo definir la clave privada ssh para servidores recuperados por inventario dinámico en archivos



ssh-keygen windows (5)

Estoy usando la siguiente configuración:

#site.yml: - name: Example play hosts: all remote_user: ansible become: yes become_method: sudo vars: ansible_ssh_private_key_file: "/home/ansible/.ssh/id_rsa"

Encontré un problema de configuración al codificar el libro de jugadas ansible para el archivo de clave privada ssh.

Como sabemos, podemos definir la combinación de servidor privado, IP y clave privada ssh relacionada en el archivo de hosts ansible para servidores de inventario estáticos.

Pero no tengo idea de cómo definir eso con los servidores de inventario dinámico.

Ex:

--- - hosts: tag_Name_server1 gather_facts: no roles: - role1 - hosts: tag_Name_server2 gather_facts: no roles: - roles2

El comando below se usa para llamar a ese libro de jugadas:

ansible-playbook test.yml -i ec2.py --private-key ~/.ssh/SSHKEY.pem

Mi pregunta es:

  1. ¿Cómo puedo definir ~ / .ssh / SSHKEY.pem en archivos ansible en lugar de en la línea de comandos?
  2. Supongo que puede haber un parámetro en el libro de jugadas como "gather_facts" para definir qué clave privada se debe usar para los hosts anteriores, pero parece que no hay tal parámetro.
  3. Si no hay forma de definir la clave privada en los archivos, ¿qué se debe definir en la línea de comando si se usará un archivo de clave diferente para diferentes servidores de búsqueda dinámica para un libro de estrategias?

gracias por tus comentarios


La mejor solución que pude encontrar para este problema es especificar el archivo de clave privada en ansible.cfg (generalmente lo guardo en la misma carpeta que un libro de jugadas):

[defaults] inventory=ec2.py vault_password_file = ~/.vault_pass.txt host_key_checking = False private_key_file = /Users/eric/.ssh/secret_key_rsa

Sin embargo, todavía establece clave privada global para todos los hosts en el libro de estrategias.

Nota: Debe especificar la ruta completa al archivo de clave - ~ user / .ssh / some_key_rsa ignorado en silencio.


Simplemente puede definir la clave para usar directamente al ejecutar el comando:

ansible-playbook / / # Super verbose output incl. SSH-Details: -vvvv / / # The Server to target: (Keep the trailing comma!) -i "000.000.0.000," / / # Define the key to use: --private-key=~/.ssh/id_rsa_ansible / / # The `env` var is needed if `python` is not available: -e ''ansible_python_interpreter=/usr/bin/python3'' / # Needed if `python` is not available / # Dry–Run: --check / deploy.yml

Copiar pegar:

ansible-playbook -vvvv --private-key=/Users/you/.ssh/your_key deploy.yml


Tuve un problema similar y lo resolví con un parche para ec2.py y agregué algunos parámetros de configuración a ec2.ini. El parche toma el valor de ec2_key_name, lo antepone con ssh_key_path, y agrega ssh_key_suffix al final, y escribe ansible_ssh_private_key_file como este valor.

Las siguientes variables deben agregarse a ec2.ini en una nueva sección ''ssh'' (esto es opcional si los valores predeterminados coinciden con su entorno):

[ssh] # Set the path and suffix for the ssh keys ssh_key_path = ~/.ssh ssh_key_suffix = .pem

Aquí está el parche para ec2.py:

204a205,206 > ''ssh_key_path'': ''~/.ssh'', > ''ssh_key_suffix'': ''.pem'', 422a425,428 > # SSH key setup > self.ssh_key_path = os.path.expanduser(config.get(''ssh'', ''ssh_key_path'')) > self.ssh_key_suffix = config.get(''ssh'', ''ssh_key_suffix'') > 1490a1497 > instance_vars["ansible_ssh_private_key_file"] = os.path.join(self.ssh_key_path, instance_vars["ec2_key_name"] + self.ssh_key_suffix)


TL; DR: especifique el archivo de clave en el archivo de variable de grupo, ya que ''tag_Name_server1'' es un grupo.

Nota: Supongo que está utilizando el script de inventario externo EC2 . Si está utilizando algún otro enfoque de inventario dinámico, es posible que deba modificar esta solución.

Este es un problema con el que he estado luchando, de manera intermitente, durante meses, y finalmente he encontrado una solución, gracias a la sugerencia de Brian Coca here . El truco es usar los mecanismos de las variables de grupo de Ansible para pasar automáticamente el archivo de clave SSH correcto para la máquina con la que está trabajando.

El script de inventario EC2 configura automáticamente varios grupos que puede usar para referirse a los hosts. Estás usando esto en tu libro de jugadas: en la primera jugada, le dices a Ansible que aplique ''role1'' a todo el grupo ''tag_Name_server1''. Queremos indicar a Ansible que use una clave SSH específica para cualquier host en el grupo ''tag_Name_server1'', que es donde entran los archivos de variables de grupo.

Asumiendo que su libro de jugadas esté ubicado en el directorio ''mis-libros de jugadas'', cree archivos para cada grupo bajo el directorio ''group_vars'':

my-playbooks |-- test.yml +-- group_vars |-- tag_Name_server1.yml +-- tag_Name_server2.yml

Ahora, cada vez que se refiera a estos grupos en un libro de jugadas, Ansible verificará los archivos apropiados y cargará las variables que haya definido allí.

Dentro de cada archivo var de grupo, podemos especificar el archivo de clave que se utilizará para conectarse a hosts en el grupo:

# tag_Name_server1.yml # -------------------- # # Variables for EC2 instances named "server1" --- ansible_ssh_private_key_file: /path/to/ssh/key/server1.pem

Ahora, cuando ejecuta su libro de jugadas, ¡debería recoger automáticamente las teclas correctas!

Usando entornos vars para la portabilidad

A menudo ejecuto playbooks en muchos servidores diferentes (local, servidor de compilación remoto, etc.), así que me gusta parametrizar las cosas. En lugar de usar una ruta fija, tengo una variable de entorno llamada SSH_KEYDIR que apunta al directorio donde están almacenadas las claves SSH.

En este caso, los archivos vars de mi grupo se ven así:

# tag_Name_server1.yml # -------------------- # # Variables for EC2 instances named "server1" --- ansible_ssh_private_key_file: "{{ lookup(''env'',''SSH_KEYDIR'') }}/server1.pem"

Futuras mejoras

Probablemente hay muchas maneras de mejorar esto. Por un lado, aún necesita especificar manualmente qué tecla usar para cada grupo. Dado que el script de inventario EC2 incluye detalles sobre el par de claves utilizado para cada servidor, probablemente haya una forma de obtener el nombre de la clave directamente del script. En ese caso, podría proporcionar el directorio en el que están ubicadas las claves (como se indica más arriba) y hacer que elija las claves correctas según los datos del inventario.