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:
namedefiniert das Playbook einen beschreibenden Namen dessen, was es tut, es ist nicht zwingend erforderlich, dies zu haben.hostsdefiniert die Zielhosts wie inhostsdefiniert oderhosts.yamloben definierte Datei.gather_factsdefiniert, ob ansible vor der Bearbeitung der Aufgaben Fakten sammeln soll. in unserem Fall wollen wir nichtbecomedefiniert, dass wir unsere Aufgaben als root ausführen wollenvarsdefiniert die Variablen, die wir in unseren Aufgaben wiederverwenden möchten. Wir habenmysql_root_passworddefiniert undansible_python_interpreterin 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_passwordVariable wird aus denvarsausgewählt früher definiert - Das
itemist eine Schleife der inwith_itemsdefinierten Werte Abschnitt. - Der
check_implicit_adminweist Ansible an, sich ohne Passwort anzumelden, was funktionieren sollte, da es sich um eine Neuinstallation handelt. Dazu gehört daspasswordwird 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.