Estoy configurando un servidor MySQL y quiero que Ansible establezca la mysql-root
contraseña durante la instalación.
Con la ayuda de internet se me ocurrió esta solución:
- name: Set MySQL root password before installing
debconf: name='mysql-server' question='mysql-server/root_password' value='{{mysql_root_pwd | quote}}' vtype='password'
- name: Confirm MySQL root password before installing
debconf: name='mysql-server' question='mysql-server/root_password_again' value='{{mysql_root_pwd | quote}}' vtype='password'
- name: Install Mysql
apt: pkg=mysql-server state=latest
mysql_root_pwd
es una variable cargada desde la Bóveda de Ansible. Esto funciona bien, pero ahora en el servidor hay muchas líneas en el registro:
Apr 10 14:39:59 servername ansible-debconf: Invoked with value=THEPASSWORD vtype=password question=mysql-server/root_password name=mysql-server unseen=None
Apr 10 14:39:59 servername ansible-debconf: Invoked with value=THEPASSWORD vtype=password question=mysql-server/root_password_again name=mysql-server unseen=None
¿Cómo puedo evitar que Ansible escriba contraseñas de texto claro en los archivos de registro?
El comportamiento observado parece ser un error en el módulo debconf. Presenté un informe de error .
El usuario bcoca en github señaló que se puede usar la
no_log: true
directiva en tareas, que establecen contraseñas, para evitar el registro. Esta es una solución alternativa, que funciona para mí hasta que se solucione el error.fuente
ERROR: no_log is not a legal parameter in an Ansible task or handler
sudo apt-add-repository ppa:ansible/ansible
,sudo apt-get update
,sudo apt-get install ansible
Lo resolví actualizando la versión Ansible a 1.6.1
fuente
Según los documentos de Ansible :
Parece que la configuración
log_path
en su nodo de control dará como resultado que no haya registros en los nodos de destino.fuente
vtype='password'
. Eso debería ser lo suficientemente explícito en mi humilde opinión? Supongo que el mensaje de registro también es creado por el módulo debconf.Hay una mejor manera que simplemente no_log: True
Como puede ver, necesita agregar:
Y luego realice la salida del resultado del comando con regex_replace, donde:
Con este enfoque, no solo ocultará las contraseñas y los inicios de sesión, sino que también obtendrá el resultado de su operación
fuente
Esta es una adición a la respuesta de TheDESTROS de este hilo:
wrapper-script.sh.j2
Necesita un poco menos de código y puede encontrar los comandos en sus registros. Solo hay una caverna, si hay un secreto en los comandos stdout. Si desea evitar la plantilla externa, el
copy
módulo con el parámetrocontent
puede ayudar a escribir un pequeño script de envoltura sobre la marcha.fuente
El
no_log: true
enfoque se utilizará como último recurso si otros intentos fallan porque hará que la ejecución de la tarea sea totalmente opaca y no tendrá idea de cuándo falla.Las prácticas de seguridad recomiendan dar credenciales de stdin o, cuando no sea posible, usar archivos de credenciales (o incluso ejecutables).
Aquí hay un ejemplo sobre cómo realizar un inicio de sesión de podman seguro evitando exponer la contraseña:
Con esto, el secreto no se expondrá,
result
pero aún podrá ver la salida del comando.La mayoría de las herramientas que necesitan iniciar sesión implementan uno de los enfoques más seguros mencionados. Usar credenciales en CLI en el código es como tener
123456
como contraseña de su banco.fuente