¿Cómo establecer el nombre de usuario / contraseña Ansible predeterminado para la conexión SSH?

60

Estoy usando Ansible y tengo esta configuración en mi inventario / todo:

[master]
192.168.1.10 ansible_connection=ssh ansible_ssh_user=vagrant ansible_ssh_pass=vagrant

[slave]
192.168.1.11 ansible_connection=ssh ansible_ssh_user=vagrant ansible_ssh_pass=vagrant
192.168.1.12 ansible_connection=ssh ansible_ssh_user=vagrant ansible_ssh_pass=vagrant

[app]
192.168.1.13 ansible_connection=ssh ansible_ssh_user=vagrant ansible_ssh_pass=vagrant

[all:children]
master
slave

No quiero repetir todos los parámetros para cada nueva instancia. ¿Cómo puedo configurarlos en un solo lugar? ¿Hay algún archivo con estos parámetros?

Robert
fuente
3
~/.ssh/config
ceejayoz
1
@ceejayoz ¿Podría explicar un poco
Robert
No soy un administrador de Ansible, y los documentos están nublados sobre el tema (¿ es esto una "variable" o un "parámetro" y hay alguna diferencia? ) Pero parece que de alguna manera puedes definir variables a nivel de grupo.
DerfK

Respuestas:

74

Puede agregar la siguiente sección a su archivo de inventario:

[all:vars]
ansible_connection=ssh
ansible_user=vagrant
ansible_ssh_pass=vagrant

Nota: Antes de Ansible 2.0 ansible_userera ansible_ssh_user.

Alexey Labzov
fuente
2
Por encima de Ansible 2.0, debería ser: [all:vars] ansible_connection=ssh ansible_port=22 ansible_user=admin
zx1986
2
@ zx1986 ¿dónde leíste eso?
030
2
@ 030 aquí: docs.ansible.com/ansible/…
zx1986
Tenga en cuenta que el puerto 22 es el predeterminado ansible_port, por lo que no necesita especificarlo explícitamente a menos que sea diferente. Interesado si alguien sabe cómo aplicar variables a más de un grupo a la vez (pero no 'todos'), la separación por coma no parece funcionar.
William Turrell
1
@WilliamTurrell un poco tarde pero ... puedes crear un grupo de grupos (con el modificador: children) y luego configurar las variables después (con el modificador: vars).
Lasse Halberg Haarbye
23

Variables de grupo

Puede establecer variables que se apliquen a todos los hosts utilizando el diseño del libro de jugadas especificado en el documento de Mejores prácticas de Ansible y creando un group_vars/allarchivo donde los defina .

---
# file: group_vars/all
ansible_connection: ssh 
ansible_ssh_user: vagrant 
ansible_ssh_pass: vagrant

[editar] Aunque estoy confundido con lo que estás tratando de hacer. No debería necesitar especificar el usuario o la contraseña de Ansible en el inventario. Si está utilizando Vagrant, definitivamente no lo hace, y si está llamando a Ansible desde la línea de comandos, puede especificar el usuario con --user=vagranty pedirle que solicite la contraseña --ask-pass.

Philip Wilson
fuente
1
Solo necesito hacer una mejor organización de mi infraestructura. Si siempre usaré vagrant: vagrant Quiero poner la configuración en algún lugar donde Ansible cargue por defecto, pero no sé dónde. Cada conexión a ejecutar tiene que usarla.
Robert
¿Debe el nombre del archivo group_vars/all/main.ymlo simplemente group_vars/all?
realtebo
éste trabajó para mí después de instalar sshpass-"you must install the sshpass program"
user9869932
1
@realtebo El archivo debe tener nombre group_vars/all.
xloto
1
-k for ask pass no es muy divertido para "todos" cuando cada host tiene una contraseña diferente. Sí, necesitas sshpass, y sí, probablemente necesites sembrar "hosts conocidos" si nunca antes te has conectado ~ ~ .ssh \ config es el camino a seguir.
mckenzm
5

Creo que es mejor usar la instalación de la clave ssh en todos los servidores a través de la extracción. Debe ejecutar ssh-copy-id solo por nodo e instalar su clave ssh en todas partes para que Ansible pueda iniciar sesión con su clave ssh. Será más seguro no guardar contraseñas en el libro de jugadas / inventario.

Para hacer esto, debe generar su par de claves ssh y ejecutar ssh-copy-id para todos los servidores después.

podarok
fuente
1
Si alguien puede robar la contraseña de su archivo de configuración, probablemente también podrá acceder a sus claves ssh. Y esto no tiene nada que ver con responder la pregunta de los OP. Esta pregunta no era pedir opiniones sobre alternativas.
Muh Fugen
@MuhFugen> ¿Cómo puedo configurarlos solo en un lugar? ¿Hay algún archivo con estos parámetros? Esta es una frase exacta que deja la puerta a la opinión y la respuesta da una comprensión de la dirección correcta. Robar configuración (que podría vivir en el repositorio de git en algún lugar) no es lo mismo que robar clave privada.
podarok
4

Añadir a continuación a los hosts de inventario.

Para Ansible <2.0:

[all:vars]
ansible_connection=ssh
ansible_ssh_user=vagrant 
ansible_ssh_pass=vagrant

Para Ansible> = 2.0 :

[all:vars]
ansible_connection=ssh # actually default mode smart is OK
ansible_user=vagrant
ansible_pass=vagrant # or ansible_ssh_pass=vagrant
Mitril
fuente
El enlace menciona ansible_ssh_pass, no ansible_pass.
Matthias Weiler
2

Descargo de responsabilidad: solo he probado esto en OSX. Según los diversos documentos, espero que funcione en otras plataformas.

"directorio del proyecto" se refiere al directorio base del proyecto Vagrant, el directorio que contiene Vagrantfile.

Archivo de inventario Ansible generado automáticamente por Vagrant:

Vagrant crea un archivo de inventario con los valores de conexión Ansible predeterminados. Búscalo en <project directory>/.vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory.

Vagrant regenerará este archivo según sea necesario, por lo que se sobrescribirán las ediciones manuales. Sin embargo, de acuerdo con los documentos de Vagrant, puede especificar varias máquinas, grupos de variables, etc., Vagrantfiley se agregarán a este archivo de inventario.

Configure Ansible como predeterminado para este archivo de inventario:

Para hacer que este archivo sea el predeterminado que usa el ansiblecomando cuando está en el directorio del proyecto (en el host), agregue un ansible.cfgarchivo en el directorio del proyecto con estos contenidos, cambiando la ruta según sea necesario:

[defaults]
inventory = ./path/to/inventory

Para confirmar que este archivo de inventario se está utilizando, búsquelo como el predeterminado informado por ansible:

(desde dentro del directorio del proyecto)

$ ansible | grep inventory ERROR! Missing target hosts -i INVENTORY, --inventory-file=INVENTORY specify inventory host path (default=./.vagrant/provis ioners/ansible/inventory/vagrant_ansible_inventory) or

Para confirmar sus anfitriones:

$ ansible all --list-hosts hosts (2): master slave

Usando Ansible con estos hosts:

Desde el directorio del proyecto, debería poder usarlo ansiblenormalmente con los hosts que definió Vagrantfile.

Por ejemplo:

ansible slave -a 'hostname'
Kentr
fuente