MySQL ist ein relationales Open-Source-Datenbankverwaltungssystem. Es ist eines der beliebtesten relationalen Verwaltungssysteme.
Mysql wird üblicherweise als Teil des beliebten LAMP- oder LEMP-Stacks (Linux, Apache/Nginx, MySQL/MariaDB, PHP/Python/Perl) installiert.
In dieser Anleitung verwenden wir mysql 8 auf Centos 8. Diese Anleitung funktioniert auch auf anderen RHEL 8-Derivaten wie Rocky Linux 8 und Alma Linux 8
Überprüfen Sie auch:
- So installieren und konfigurieren Sie mysql 8 unter Ubuntu 20.04
- Installieren und Konfigurieren von MySQL Server 8 auf Centos 8
- So installieren und konfigurieren Sie MySQL Server 8 auf Fedora 34/35
- Mysql-Berechtigungen – Datenbankbenutzer erstellen, aktualisieren, löschen
- Nginx, WordPress und MySQL 8 in Centos 8 installieren und einrichten
- Erstellen Sie eine RDS-Instanz in Terraform mit einem Mariadb-Beispiel
Anforderungen
- Internetverbindung
- Ansible lokal installiert
Die hosts-Datei
Wir benötigen die Hosts-Datei, die die Server definiert, auf die wir abzielen:
all:
hosts:
db-server:
ansible_ssh_host: 192.168.10.2
ansible_ssh_user: centos
ansible_ssh_private_key_file: ~/.ssh/server_key
Die obige Yaml-Datei definiert einen Server db-server
das hat die IP 192.168.10.2
und kann mit dem Benutzer centos
aufgerufen werden und ~/.ssh/server_key
.
Testen Sie das mit:
ssh -i ~/.ssh/server_key [email protected]
Das Ansible-Playbook
Bevor wir unsere Aufgaben definieren, müssen wir ansible ein paar Dinge sagen:
- name: Install mysql server 8 and initialize
hosts: db-server
gather_facts: false
become: true
vars:
mysql_root_password: 'secure-root-pw'
ansible_python_interpreter: /usr/bin/python3
Erklärung:
name
definiert das Playbook einen beschreibenden Namen dessen, was es tut, es ist nicht zwingend erforderlich, dies zu haben.hosts
definiert die Zielhosts wie inhosts
definiert oderhosts.yaml
oben definierte Datei.gather_facts
definiert, ob ansible vor der Bearbeitung der Aufgaben Fakten sammeln soll. in unserem Fall wollen wir nichtbecome
definiert, dass wir unsere Aufgaben als root ausführen wollenvars
definiert die Variablen, die wir in unseren Aufgaben wiederverwenden möchten. Wir habenmysql_root_password
definiert undansible_python_interpreter
in unserem Fall
Die ansiblen Aufgaben
Nach dem obigen Abschnitt müssen wir nun unsere Aufgaben definieren. Diese Aufgaben können entweder in einer Rolle hinzugefügt oder als Aufgaben angegeben werden. In unserem Fall werden wir sie als Aufgaben verwenden (das vollständige Playbook finden Sie am Ende dieser Anleitung).
Stellen Sie sicher, dass die erforderliche Software installiert ist
Bevor wir fortfahren, möchten wir die gesamte Software installieren, die wir benötigen. Dazu gehört die mysql-spezifische Software mysql-server
und mysql-devel
und unterstützende Software wie Python-bezogene Software, die von Ansible verwendet wird, um eine Verbindung zur mysql-Serverinstanz herzustellen und diese einzurichten. Wir verwenden das ansible dnf
Modul, um dies zu tun.
- name: Ensure required packages are installed
dnf:
name:
- mysql-server
- mysql-devel
- python39
- python39-devel
- python39-pip
- gcc
state: latest
Installieren Sie die erforderlichen Pip-Module
Ansible verwendet den PyMySQL
Modul in Python3 zum Verbinden und Einrichten des MySQL-Servers. Installieren Sie es mit ansible pip
Modul
- name: Install Required pip modules
pip:
name:
- PyMySQL
state: present
executable: pip3
Starten und aktivieren Sie den MySQL-Dienst
Da wir uns mit dem Server verbinden und Operationen ausführen möchten, beginnen wir ihn mit dieser Aufgabe. Seit Centos 8 verwendet systemd
Um lange laufende Prozesse zu verwalten, starten und aktivieren Sie mysqld mit dem Ansible systemd
Modul:
- name: Ensure mysql service is running
systemd:
name: mysqld
state: started
enabled: yes
Stellen Sie sicher, dass sich der Root-Benutzer vom lokalen Server aus anmelden kann
Die mysql root
user ist der standardmäßige Admin-Benutzer, der Berechtigungen für alle Ressourcen auf dem Server hat. Eine bewährte Methode wäre, den Zugriff nur über diesen Benutzer root
zu ermöglichen im lokalen System, wenn wir Verwaltungsaufgaben erledigen, erstellen Sie andernfalls einen dedizierten Benutzer für jede Verbindung, d. h. für jede App, haben Sie einen Benutzer, der nur Zugriff auf diese Datenbank hat.
- name: Ensure root user can only login from localhost
mysql_user:
login_password: "{{ mysql_root_password }}"
check_implicit_admin: yes
name: root
host: "{{ item }}"
password: "{{ mysql_root_password }}"
state: present
with_items:
- localhost
- 127.0.0.1
- ::1
In der obigen Aufgabendefinition:
- das
mysql_root_password
Variable wird aus denvars
ausgewählt früher definiert - Das
item
ist eine Schleife der inwith_items
definierten Werte Abschnitt. - Der
check_implicit_admin
weist Ansible an, sich ohne Passwort anzumelden, was funktionieren sollte, da es sich um eine Neuinstallation handelt. Dazu gehört daspassword
wird für den Root-Benutzer gesetzt
Fügen Sie my.cnf
hinzu zum Heimatverzeichnis
Nachdem wir das Passwort in der obigen Aufgabe festgelegt haben, möchten wir das Passwort angeben, wenn wir als Root-Benutzer weitere Aufgaben erledigen. Wir können dies in ~/.my.cnf
bereitstellen , eine Datei, die jedes Mal, wenn wir mysql-Befehle ausführen, auf Anmeldeinformationen überprüft wird.
Erstellen Sie eine Datei my.cnf.j2
im aktuellen Verzeichnis:
[client]
user=root
password={{ mysql_root_password }}
Dann ist dies die Aufgabe, nach /root/.my.cnf
zu kopieren da wir die Aufgaben als Root-Benutzer ausführen.
- name: Add .my.cnf to user home
template:
src: my.cnf.j2
dest: /root/.my.cnf
Berechtigungen neu laden
Führen Sie die folgende Aufgabe aus, um die Berechtigungen für die Änderungen, die wir bisher vorgenommen haben, neu zu laden, um sie anzuwenden:
- name: Reload privilege tables
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- FLUSH PRIVILEGES
changed_when: False
Anonyme Benutzer entfernen
Es hat sich bewährt, anonyme Benutzer zu entfernen. Machen wir es mit dieser Aufgabe:
- name: Remove anonymous users
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- DELETE FROM mysql.user WHERE User=''
changed_when: False
Verhindern Sie, dass Root sich aus der Ferne anmeldet
Führen Sie Folgendes aus, um Einträge in mysql.user
zu entfernen Tisch. Dadurch wird sichergestellt, dass sich der Root-Benutzer nur lokal anmelden kann:
- name: Disallow root login remotely
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1')
changed_when: False
Testdatenbank und Zugriff darauf entfernen
Da wir die Testdatenbank nicht benötigen, können wir sie mit dieser Aufgabe entfernen:
- name: Remove test database and access to it
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- DROP DATABASE IF EXISTS test
- DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'
changed_when: False
Berechtigungen neu laden
Um die oben vorgenommenen Änderungen anzuwenden, laden Sie die Berechtigungen mit dieser Aufgabe neu:
- name: Reload privilege tables
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- FLUSH PRIVILEGES
changed_when: False
Löschen Sie .my.cnf
die wir kopiert haben.
Lassen Sie uns aus Sicherheitsgründen /root/.my.cnf
entfernen Datei, da sie Root-Zugriff enthält:
- name: Delete .my.conf
file:
path: /root/.my.cnf
state: absent
Ganzes Playbook
Dies ist das gesamte Playbook mit allen Aufgaben:
---
- name: Install mysql server 8 and initialize
hosts: db-server
gather_facts: false
become: true
vars:
mysql_root_password: 'secure-root-pw'
ansible_python_interpreter: /usr/bin/python3
tasks:
- name: Ensure required packages are installed
dnf:
name:
- mysql-server
- mysql-devel
- python39
- python39-devel
- python39-pip
- gcc
state: latest
- name: Install Required pip modules
pip:
name:
- PyMySQL
state: present
executable: pip3
- name: Ensure mysql service is running
systemd:
name: mysqld
state: restarted
enabled: yes
- name: Ensure root user can only login from localhost
mysql_user:
login_password: "{{ mysql_root_password }}"
check_implicit_admin: yes
name: root
host: "{{ item }}"
password: "{{ mysql_root_password }}"
state: present
with_items:
- localhost
- 127.0.0.1
- ::1
- name: Add .my.cnf to user home
template:
src: my.cnf.j2
dest: /root/.my.cnf
- name: Reload privilege tables
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- FLUSH PRIVILEGES
changed_when: False
- name: Remove anonymous users
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- DELETE FROM mysql.user WHERE User=''
changed_when: False
- name: Disallow root login remotely
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1')
changed_when: False
- name: Remove test database and access to it
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- DROP DATABASE IF EXISTS test
- DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'
changed_when: False
- name: Reload privilege tables
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- FLUSH PRIVILEGES
changed_when: False
- name: Delete .my.conf
file:
path: /root/.my.cnf
state: absent
Um das Playbook auszuführen, müssen Sie die Datei setup-mysql.yaml
erstellen mit dem obigen Inhalt und hosts.yaml
mit dem Inhalt der hosts-Datei verwenden Sie dann den folgenden Befehl zur Ausführung:
ansible-playbook -i hosts.yaml setup-mysql.yaml -vv
Schlussfolgerung
In diesem Handbuch konnten wir Ansible verwenden, um MySQL Server 8 auf einem Centos 8-Host mit Ansible zu installieren.
Ansible gibt uns eine Möglichkeit, den Prozess zu automatisieren. Dies kann verwendet werden, um mehrere Instanzen auf vorhersehbare Weise mit einem einzigen Befehl einzurichten.