Tengo una tarea ansible que crea un nuevo usuario en ubuntu 12.04;
- name: Add deployment user
action: user name=deployer password=mypassword
se completa como se esperaba, pero cuando inicio sesión como ese usuario e intento sudo con la contraseña que configuré, siempre dice que es incorrecta. ¿Qué estoy haciendo mal?
password
se supone que su no debe estar en texto sin formato, sino más bien preash.Respuestas:
Si lee el manual de Ansible para el
user
módulo , lo dirigirá al repositorio de github de Ansible-examples para obtener detalles sobre cómo usar elpassword
parámetro .Allí verá que su contraseña debe tener hash.
Si su libro de jugadas o línea de comando ansible tiene su contraseña tal como está en texto sin formato, esto significa que el hash de su contraseña está registrado en su sombra archivo de es incorrecto. Eso significa que cuando intentas autenticarte con tu contraseña, su hash nunca coincidirá.
Además, consulte las preguntas frecuentes de Ansible sobre algunos matices del parámetro de contraseña y cómo usarlo correctamente.
fuente
openssl passwd -salt <salt> -1 <plaintext>
para generar el hash de la contraseña, en lugar del Python one-liner que tiene arriba. Tuve algunos problemas para obtener la salida correcta de Python, probablemente debido a mi propia incompetencia y el comando openssl funcionó mejor./etc/shadow
después de configurar la contraseña manualmente usandopasswd <user>
.Puede que sea demasiado tarde para responder esto, pero recientemente descubrí que los filtros jinja2 tienen la capacidad de manejar la generación de contraseñas cifradas. En mi
main.yml
estoy generando la contraseña cifrada como:"uusername" y "upassword" se pasan como
--extra-vars
en el libro de jugadas y observe que he usado el filtro jinja2 aquí para encriptar la contraseña pasada.He agregado el siguiente tutorial relacionado con esto en mi blog.
fuente
password={{upassword|password_hash('sha512', upassword_salt)}}
. Eso le permite poner sal en una bóveda de variables , como presumiblemente también lo haríaupassword
, manteniendo a ambos fuera de tasks.yml.update_password: on_create
módulo de usuario a esta respuesta para evitar que expiren las contraseñas de los usuarios ya creados.pip install passlib
. Luego de ser capaz de utilizar una bóveda encriptada cadena de línea que tenía que cambiar el formato con la siguiente adición:password: {{ upassword | string | password_hash('sha512') }}
. Esto evita el mensaje de errorsecret must be unicode or bytes, not ansible.parsing.yaml.objects.AnsibleVaultEncryptedUnicode
Quiero proponer otra solución más:
¿Por qué es mejor? Como ya se ha señalado aquí, las obras de Ansible deben ser idempotentes. Debe pensar en ellos no como una secuencia de acciones en estilo imperativo, sino como un estado deseado, estilo declarativo. Como resultado, debería poder ejecutarlo varias veces y obtener el mismo resultado, el mismo estado del servidor.
Todo esto suena muy bien, pero hay algunos matices. Uno de ellos es la gestión de usuarios. "Estado deseado" significa que cada vez que ejecutas una jugada que crea un usuario, se actualizará para que coincida exactamente con ese estado. Por "actualizado" me refiero a que su contraseña también se cambiará. Pero lo más probable es que no sea lo que necesitas. Por lo general, necesita crear un usuario, establecer y caducar su contraseña solo una vez, más ejecuciones de juego no deberían actualizar su contraseña.
Afortunadamente, Ansible tiene un
update_password
atributo en eluser
módulo que resuelve este problema. Mezclando esto con variables registradas , también puede caducar su contraseña solo cuando el usuario esté realmente actualizado.Tenga en cuenta que si cambia el shell del usuario manualmente (suponga que no le gusta el shell que el administrador malvado forzó en su juego), el usuario se actualizará, por lo que su contraseña expirará.
También tenga en cuenta cómo puede usar fácilmente las contraseñas iniciales de texto sin formato en las obras de teatro. No es necesario codificarlos en otro lugar y pegar hashes, puede usar el filtro Jinja2 para eso. Sin embargo, esto puede ser una falla de seguridad si alguien inicia sesión antes que usted inicialmente.
fuente
"{{ '{{vaulted_password}}' | password_hash('sha512') }}"
no parece funcionar ...{{ vaulted_password | password_hash('sha512') }}
, dóndevaulted_password
está la clave del valor en la bóveda?update_password: on_create
no parece funcionar (hay un error abierto al respecto desde 2017), por lo que las contraseñas cambiarán cada vez que haya un cambio de estado en un usuario.El módulo 'usuario' de Ansible gestiona usuarios, de forma idempotente . En el libro de jugadas a continuación, la primera tarea declara estado = presente para el usuario. Tenga en cuenta que ' register: newuser ' en la primera acción ayuda a la segunda acción a determinar si el usuario es nuevo (newuser.changed == True) o existente (
newuser.changed==False
), para generar la contraseña solo una vez.El libro de jugadas de Ansible tiene:
fuente
prueba así
fuente
El propósito del rol en esta respuesta es generar una contraseña aleatoria para new_user_name y caducar la contraseña inmediatamente. Se requiere new_user_name para cambiar la contraseña en su primer inicio de sesión.
create_user.yml:
roles / create_user / tasks / main.yml:
Cuando desee crear un nuevo usuario:
fuente
Esta es la forma fácil:
fuente
Así es como me funcionó
fuente
Solo para completar, publicaré el comando ad-hoc usando ansible, ya que también hay un problema.
Primero intente generar una contraseña encriptada usando la utilidad mkpasswd que está disponible en la mayoría de los sistemas Linux:
Luego prueba el comando ansible ad-hock:
Pero asegúrate:
--sudo
o terminas con un error como (useradd: cannot lock /etc/passwd; try again later
)fuente
La definición de tareas para el módulo de usuario debe ser diferente en la última versión de Ansible.
fuente
Combinando algunas soluciones anteriores, creé un libro de jugadas que genera automáticamente hashes de contraseña correctos basados en contraseñas de texto sin formato almacenadas en un archivo de bóveda ansible local cifrado:
Ejecute este comando usando la opción "--ask-vault-pass" para descifrar su archivo de bóveda (consulte ansible-vault para obtener información sobre cómo administrar una bóveda cifrada).
fuente
Cómo crear una contraseña encriptada para pasar a
password
var a lauser
tarea de Ansible (del comentario de @Brendan Wood):El resultado se verá así:
Ejemplo de
user
tarea:UPD: cripta con SHA-512, consulte aquí y aquí :
Pitón
Perl
Rubí
fuente
Puede usar ansible-vault para usar claves secretas en los libros de jugadas. Defina su contraseña en yml.
ex. pasar: secreto o
cifre su archivo de secretos con:
ansible-vault encrypt /path/to/credential.yml
ansible le pedirá una contraseña para cifrarlo. (explicaré cómo usar ese pase)
Y luego puedes usar tus variables donde quieras. Nadie puede leerlos sin clave de bóveda.
Uso de la clave de la bóveda:
a través de un argumento de paso al ejecutar el libro de jugadas.
o puede guardar en un archivo como password.txt y esconderse en algún lugar. (útil para usuarios de CI)
En su caso: incluya vars yml y use sus variables.
fuente
password={{user.pass}}
se expandirá para incluir la contraseña real, mientras que ansible espera el hash allí.Generando contraseña aleatoria para el usuario
primero es necesario definir la variable de usuarios y luego seguir a continuación
Tareas:
fuente
La respuesta de Mxx es correcta pero tú, la pitón.
crypt.crypt()
método no es seguro cuando están involucrados diferentes sistemas operativos (relacionado con el algoritmo hash glibc utilizado en su sistema).Por ejemplo, no funcionará si genera su hash desde MacOS y ejecuta un libro de jugadas en Linux. En tal caso, puede usar passlib (
pip install passlib
para instalar localmente).fuente
Ninguna de las soluciones funcionó directamente en mi Mac que controlaba Ubuntu. Entonces, por el bien de los demás, combinando las respuestas de Mxx y JoelB, aquí está la solución actual de Python 3:
El resultado será
$1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.
, como en la respuesta de Mxx.Mejor aún , use SHA512 en lugar de MD5:
Resultado:
fuente
He creado un libro de jugadas ansible que le permite crear una cuenta de Linux que permite la autenticación de contraseña.
Consulte CreateLinuxAccountWithAnsible .
La contraseña hash se genera usando el
mkpasswd
comando. He proporcionado las formas de instalarmkpasswd
en diferentes sistemas operativos.Estos son los pasos necesarios para usar mi script:
Reemplace
<your_user_name>
y<your_password>
adentrorun.sh
con su nombre de usuario y contraseña deseados.Cambie la información de conexión
inventory
para que ansible pueda conectarse a la máquina para crear un usuario.Ejecutar
./run.sh
para ejecutar el script.fuente
Si desea lograr esto como un comando ad-hoc de Ansible, puede hacer lo siguiente:
Salida del comando anterior:
fuente
Sé que llego tarde a la fiesta, pero hay otra solución que estoy usando. Puede ser útil para las distribuciones que no tienen el
--stdin
binario passwd.Label in
loop_control
es responsable de imprimir solo el nombre de usuario. Todo el libro de jugadas o solo las variables de usuario (que puede usarvars_files:
) deben estar encriptadas con ansible-vault.fuente
Mi solución es usar la búsqueda y generar una contraseña automáticamente.
fuente
Probé muchas utilidades, incluidas mkpasswd, Python, etc. Pero parece que hay algún problema de compatibilidad con Ansible al leer los valores HASH generados por otras herramientas. Así que finalmente funcionó con ansible # value.
ansible all -i localhost, -m debug -a "msg = {{'yourpasswd' | password_hash ('sha512', 'mysecretsalt')}}"
Libro de jugadas -
fuente
Bueno, llegué tarde a la fiesta :) Tenía la necesidad de un juego ansible que creara múltiples usuarios locales con contraseñas aleatorias. Esto es lo que se me ocurrió, utilicé algunos de los ejemplos de arriba y los combiné con algunos cambios.
crear-usuario-con-contraseña.yml
/roles/create-user-with-password/tasks/main.yml
fuente