Ansible: So ändern Sie das Root-Passwort des MySQL-Servers, indem Sie den Server neu einrichten

14

Ich habe meinen Server mit Ansible Playbook ausgestattet. Ich habe das Root / Bedrock-Ansible-Playbook verwendet .

Eine der Aufgaben bestand darin, den MySQL-Server zusammen mit dem MySQL-Root-Benutzerpasswort einzurichten.

Jetzt muss ich dieses Passwort dringend ändern. Die Schritte, die ich unternahm:

  1. Ich habe Variablen für Ansible-Rollen aktualisiert
  2. Ich habe den Befehl ausgeführt, ansible-playbook -i hosts/staging server.ymlum den Server erneut bereitzustellen

Alle Aufgaben wurden wie erwartet ausgeführt (keine Änderungen), das Skript schlug jedoch [mariadb | Set root user password]mit der folgenden Meldung fehl :

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

Ich vermute, dass nach dem Festlegen des MySQL-Root-Passworts durch eine erneute Bereitstellung des Servers dieses Passwort nicht mehr geändert werden kann.

Ist es überhaupt möglich, das MySQL-Root-Passwort zu ändern, indem der Server erneut mit Ansible bereitgestellt wird? Welche Möglichkeiten habe ich?

luqo33
quelle

Antworten:

15

Das Problem, das Sie haben, ist, dass Ansible versucht, dasselbe Root-Passwort für die Anmeldung zu verwenden, zu dem Sie es ändern möchten:

- 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

Offensichtlich wird dies nie funktionieren, wenn Sie dieses Spiel verwenden möchten, um es zu ändern.

Stattdessen sollten Sie das obige Spiel so ändern, dass es ungefähr so ​​aussieht:

- 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

Aktualisieren Sie anschließend die relevanten Inventardateien, um diese neue Variable hinzuzufügen.

Ihr group_vars/productionsolltet also jetzt enthalten:

mysql_old_root_password: productionpw
mysql_root_password: newproductionpw

Es sieht aus wie das Textbuch das root - Passwort sowohl in dem verwendete roles/mariadb/tasks/main.ymlTextbuch und auch roles/wordpress-setup/tasks/database.ymlso dass Sie vielleicht das ganze laufen server.ymlTextbuch sicherzustellen, dass dies richtig eingerichtet ist.

ydaetskcoR
quelle
Vielen Dank für eine tolle Antwort. Dies ist definitiv der richtige Weg. mysqladmin
Am
7

Sie können ~ / .my.cnf missbrauchen , um das mysql-root-Passwort ändern zu können.

Der Trick besteht darin, eine Aufgabe "Set root password" (Nr. 1) zu haben, mit der das Passwort festgelegt wird. Anschließend haben Sie eine Aufgabe, die eine ~ / .my.cnf mit den richtigen Anmeldeinformationen erstellt (Nr. 2).

Auf einem neuen System ist ~ / .my.cnf nicht vorhanden. Aufgabe Nr. 1 erstellt einen mysql-root-Benutzer mit den angegebenen Anmeldeinformationen. Auf einem aktuellen System werden Anmeldeinformationen aus ~ / .my.cnf verwendet, um sich anzumelden und ein Kennwort für mysql_root_password festzulegen . Aufgabe Nr. 2 erstellt ~ / .my.cnf oder überschreibt vorhandene alte Anmeldeinformationen ~ / .my.cnf mit neuen.

Der große Vorteil dieses Ansatzes ist, dass es nur eine Variable "mysql_root_password" gibt, die aus Sicht eines Playbooks immer die richtige ist. Auf den gegenwärtigen Systemen ist ~ / .my.cnf eine Art Speicher für aktuelle lokale mysql-Anmeldeinformationen.

- 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

mit client.my.cnf.j2:

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

Weitere Lektüre

Relevante Hinweise aus der ansible-mysql_user_module-Dokumentation :

  • Anmerkung 1:

    Um diesen Benutzer als Teil eines idempotenten Wiedergabebuchs zu sichern, müssen Sie mindestens zwei Aufgaben erstellen: Die erste muss das Kennwort des Root-Benutzers ändern, ohne dass Angaben zu login_user / login_password gemacht werden müssen. Die zweite muss eine ~ / .my.cnf-Datei ablegen, die die neuen Stammanmeldeinformationen enthält. Nachfolgende Durchläufe des Playbooks sind dann erfolgreich, indem die neuen Anmeldeinformationen aus der Datei gelesen werden. ansible-mysql_user_module, Notizen

  • Anmerkung 2:

    Sowohl login_password als auch login_user sind erforderlich, wenn Sie Anmeldeinformationen übergeben. Wenn keine vorhanden sind, versucht das Modul, die Anmeldeinformationen von ~ / .my.cnf zu lesen und greift schließlich auf die MySQL-Standardanmeldung von 'root' ohne Kennwort zurück. ansible-mysql_user_module, Notizen

Markus Schulte
quelle
Ich mag diesen Ansatz sehr und er ist viel besser als die Version in meiner Antwort. Es sollte wahrscheinlich die akzeptierte Antwort sein.
YdaetskcoR
2
Dies ist praktisch, aber auf vielen Systemen werden tatsächlich 4 'root'-Benutzer erstellt, mit Hosts 127.0.0.1, localhost, :: 1 und unabhängig vom lokalen Hostnamen. Der obige Befehl ändert nur root @ localhost und lässt drei weitere Root-Konten mit leeren Passwörtern.
Robo
Liste aller Root - Benutzer: mysql --database mysql --execute "select host from user where user = 'root';". Dieser Beitrag entspricht dieser Antwort, enthält jedoch Code zum Festlegen aller Kennwörter.
Hlovdal
2

Für die nächste Person, die hier nach Antworten sucht. Während die akzeptierte Antwort wahr ist, müssen Sie besonders sorgfältig sein, wenn Sie MySQL 5.7 verwenden, da in mysqld im daemonisierten Modus (Dienst) keine anonyme Anmeldung zulässig ist. Stattdessen MÜSSEN Sie die Datei /var/log/mysqld.log nach einem TEMPORARY-Kennwort durchsuchen, das jemand erstellt und für login_password = ydaetskcoR verwendet hat. Diese Funktion wurde in Version 5.7 des Entwickler-Repositorys implementiert. Wenn Sie dies vermeiden möchten, verwenden Sie eine ältere Version (5.6).

Dokumentation hier: https://dev.mysql.com/doc/refman/5.7/de/server-options.html#option_mysqld_initialize-insecure

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

einarc
quelle
1

Es gibt ein Ansible-Playbook, das zum Härten von MySQL verwendet wird.

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

Dadurch wurde nicht nur das Root-Passwort geändert, sondern es wurden auch einige zusätzliche Schritte zum Absichern des Servers ausgeführt.

Schauen Sie sich die Readme-Datei an.

ww12z
quelle
Es sieht nicht so aus, als würde es das Root-Passwort ändern, wenn es leer ist.
Flickerfly