Ansible: Cómo cambiar la contraseña de root del servidor MySQL al reaprovisionar el servidor

14

He aprovisionado mi servidor con el libro de jugadas Ansible. He usado el libro de jugadas root / bedrock-Ansible .

Una de las tareas era configurar el servidor mysql junto con la contraseña de usuario root de mysql.

Ahora necesito urgentemente cambiar esta contraseña. Los pasos que tomé:

  1. Actualicé variables para roles Ansible
  2. ansible-playbook -i hosts/staging server.ymlEjecuté el comando para reaprovisionar el servidor

Todas las tareas se ejecutaron como se esperaba (sin cambios), pero el script falló [mariadb | Set root user password]con este mensaje:

msg: unable to connect to database, check login_user and login_password are correct or ~/.my.cnf has the credentials

Supongo que una vez que se ha establecido la contraseña de root de MySQL, el nuevo servidor no puede cambiar esta contraseña.

¿Es posible cambiar la contraseña de root de MySQL reprovisionando el servidor con Ansible? ¿Cuáles son mis opciones?

luqo33
fuente

Respuestas:

15

El problema que tiene es que Ansible está tratando de usar la misma contraseña de root para iniciar sesión, ya que desea cambiarla a:

- name: Set root user password
  mysql_user: name=root
              host="{{ item }}"
              password="{{ mysql_root_password }}"
              check_implicit_admin=yes
              login_user="{{ mysql_user }}"
              login_password="{{ mysql_root_password }}"
              state=present

Obviamente, esto nunca va a funcionar si quieres usar esta jugada para cambiarla.

En cambio, debes cambiar la jugada anterior para que sea algo así como:

- name: Set root user password
  mysql_user: name=root
              host="{{ item }}"
              password="{{ mysql_root_password }}"
              check_implicit_admin=yes
              login_user="{{ mysql_user }}"
              login_password="{{ mysql_old_root_password }}"
              state=present

Y luego actualice los archivos de inventario relevantes para agregar esta nueva variable.

Entonces tu group_vars/productionahora debería contener:

mysql_old_root_password: productionpw
mysql_root_password: newproductionpw

Parece que este libro de jugadas usa la contraseña de root tanto en el roles/mariadb/tasks/main.ymllibro de jugadas como en el libro de jugadas, roles/wordpress-setup/tasks/database.ymlpor lo que es posible que desee ejecutar todo el server.ymllibro de jugadas para asegurarse de que esté configurado correctamente.

ydaetskcoR
fuente
Muchas gracias por una gran respuesta. Este es definitivamente el camino a seguir. Terminé restableciendo la contraseña de root en la consola con mysqladmin- pero esto fue antes de ver su respuesta
luqo33
7

Puede usar mal ~ / .my.cnf para poder cambiar la contraseña de root de mysql.

El truco es tener una tarea "Establecer contraseña de root" (nr.1), que establecerá la contraseña. Luego, tiene una tarea, que crea un ~ / .my.cnf con las credenciales correctas (nr.2).

En un nuevo sistema, ~ / .my.cnf no está presente. La tarea n. 1 creará mysql-root-user con credenciales dadas. En un sistema actual, las credenciales de ~ / .my.cnf se utilizan para iniciar sesión y establecer la contraseña en mysql_root_password . La tarea n. 2 creará ~ / .my.cnf , sobrescribirá las credenciales antiguas existentes ~ / .my.cnf con otras nuevas.

La gran ventaja de este enfoque es tener solo una variable "mysql_root_password", que siempre es la correcta desde el punto de vista de un libro de jugadas. En los sistemas actuales, ~ / .my.cnf es una especie de almacenamiento para las credenciales locales de mysql actuales.

- name: Set root user password
  # If .my.cnf already exists, this will cause an mysql-root-password update.
  mysql_user:
    name: root
    password: "{{ mysql_root_password}}"
    check_implicit_admin: true

- name: Create .my.cnf
  template:
   src: "client.my.cnf.j2"
   dest: "/root/.my.cnf"
   owner: root
   group: root
   mode: 0600

con client.my.cnf.j2:

[client]
user=root
password={{ mysql_root_password }}

Otras lecturas

Notas relevantes de ansible-mysql_user_module-documentation :

  • Nota 1:

    Para proteger a este usuario como parte de un libro de jugadas idempotente, debe crear al menos dos tareas: la primera debe cambiar la contraseña del usuario raíz, sin proporcionar detalles de login_user / login_password. El segundo debe soltar un archivo ~ / .my.cnf que contenga las nuevas credenciales raíz. Las ejecuciones posteriores del libro de jugadas tendrán éxito al leer las nuevas credenciales del archivo. ansible-mysql_user_module, notas

  • Nota 2:

    Se requieren login_password y login_user cuando pasa credenciales. Si no hay ninguno presente, el módulo intentará leer las credenciales de ~ / .my.cnf, y finalmente volverá a utilizar el inicio de sesión predeterminado de MySQL de 'root' sin contraseña. ansible-mysql_user_module, notas

Markus Schulte
fuente
Me gusta mucho este enfoque y es mucho mejor que la versión en mi respuesta. Probablemente debería ser la respuesta aceptada.
ydaetskcoR
2
Esto es útil, pero en muchos sistemas en realidad hay 4 usuarios 'root' creados, con Hosts 127.0.0.1, localhost, :: 1 y cualquiera que sea el nombre de host local. Lo anterior solo modifica root @ localhost, dejando otras tres cuentas raíz con contraseñas en blanco.
robo
Una lista de todos los usuarios root: mysql --database mysql --execute "select host from user where user = 'root';". Esta publicación hace lo mismo que esta respuesta, pero tiene un código para configurar todas las contraseñas.
hlovdal
2

Para la próxima persona que viene buscando respuestas por aquí. Si bien la respuesta aceptada es verdadera, debe ser muy diligente si está utilizando MySQL 5.7 porque no se permite el inicio de sesión anónimo en mysqld en modo demonizado (servicio). En su lugar, DEBE raspar el /var/log/mysqld.log para obtener una contraseña TEMPORAL que alguien decidió crear y usar en login_password = ydaetskcoR. Esta fue una característica que decidieron implementar en la versión 5.7 del repositorio de desarrollo, por lo que si desea evitarla, use una versión anterior (5.6).

Documentación aquí: https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_initialize-insecure

http://mysqlserverteam.com/initialize-your-mysql-5-7-instances-with-ease/

einarc
fuente
1

Hay un libro de jugadas Ansible utilizado para fortalecer MySQL.

https://github.com/dev-sec/ansible-mysql-hardening

Esto no solo cambió la contraseña de root, sino que también realiza algunos pasos adicionales para fortalecer el servidor.

Echa un vistazo al archivo Léame.

ww12z
fuente
No parece que maneje el cambio de la contraseña de root cuando está en blanco.
flickerfly