Quiero proponer otra solución más:
- name: Create madhead user
user:
name: madhead
password: "{{ 'password' | password_hash('sha512') }}"
shell: /bin/zsh
update_password: on_create
register: madhead
- name: Force madhead to change password
shell: chage -d 0 madhead
when: madhead.changed
¿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 el user
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.
password
se supone que su no debe estar en texto sin formato, sino más bien preash.