geerlingguy.mysql
Ansible Rolle: MySQL
Installiert und konfiguriert MySQL oder MariaDB-Server auf RHEL/CentOS oder Debian/Ubuntu-Servern.
Voraussetzungen
Es sind keine besonderen Anforderungen erforderlich; beachten Sie, dass diese Rolle Root-Zugriff benötigt, also führen Sie sie in einem Playbook mit become: yes
aus oder rufen Sie die Rolle in Ihrem Playbook wie folgt auf:
- hosts: database
roles:
- role: geerlingguy.mysql
become: yes
Rollenvariablen
Verfügbare Variablen sind unten aufgelistet, zusammen mit Standardwerten (siehe defaults/main.yml
):
mysql_user_home: /root
mysql_user_name: root
mysql_user_password: root
Das Home-Verzeichnis, in dem die Python MySQL-Einstellungen gespeichert werden, die Ansible verwendet, um sich mit MySQL zu verbinden. Dies sollte das Home-Verzeichnis des Benutzers sein, der diese Ansible-Rolle ausführt. Die mysql_user_name
und mysql_user_password
können festgelegt werden, wenn Sie diese Rolle unter einem Nicht-Root-Benutzerkonto ausführen und einen Nicht-Root-Benutzer festlegen möchten.
mysql_root_home: /root
mysql_root_username: root
mysql_root_password: root
Die Details des MySQL-Root-Benutzerkontos.
mysql_root_password_update: false
Ob das Passwort des MySQL-Root-Benutzers gezwungen aktualisiert werden soll. Standardmäßig ändert diese Rolle das Passwort des Root-Benutzers nur, wenn MySQL zuerst konfiguriert wird. Sie können ein Update erzwingen, indem Sie dies auf yes
setzen.
Hinweis: Wenn Sie nach einem fehlgeschlagenen oder unterbrochenen Playbook-Lauf einen Fehler wie
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
erhalten, bedeutet dies normalerweise, dass das Root-Passwort ursprünglich nicht aktualisiert wurde. Versuchen Sie, die.my.cnf
-Datei im konfiguriertenmysql_user_home
zu entfernen oder zu aktualisieren undpassword=''
(das unsichere Standardpasswort) zu setzen. Führen Sie das Playbook erneut aus, wobeimysql_root_password_update
aufyes
gesetzt ist, und die Einrichtung sollte abgeschlossen sein.
Hinweis: Wenn Sie einen Fehler wie
ERROR 1698 (28000): Access denied for user 'root'@'localhost' (using password: YES)
erhalten, wenn Sie versuchen, sich über die CLI anzumelden, müssen Sie möglicherweise als Root oder Sudoer arbeiten.
mysql_enabled_on_startup: true
Ob MySQL beim Start aktiviert werden soll.
mysql_config_file: *Standardwert hängt vom OS ab*
mysql_config_include_dir: *Standardwert hängt vom OS ab*
Die Hauptkonfigurationsdatei my.cnf und das Einschlussverzeichnis.
overwrite_global_mycnf: true
Ob die globale my.cnf bei jedem Ausführen dieser Rolle überschrieben werden soll. Wenn Sie dies auf no
setzen, sagt dies Ansible, dass die my.cnf
-Datei nur erstellt werden soll, wenn sie nicht existiert. Dies sollte auf dem Standardwert (yes
) belassen werden, wenn Sie die Variablen dieser Rolle verwenden möchten, um MySQL zu konfigurieren.
mysql_config_include_files: []
Eine Liste von Dateien, die die globale my.cnf überschreiben sollen. Jedes Element im Array erfordert einen "src"-Parameter, der einen Pfad zu einer Datei angibt. Ein optionaler "force"-Parameter kann die Datei bei jedem Ausführen von Ansible aktualisieren.
mysql_databases: []
Die MySQL-Datenbanken, die erstellt werden sollen. Eine Datenbank hat die Werte name
, encoding
(standardmäßig utf8
), collation
(standardmäßig utf8_general_ci
) und replicate
(standardmäßig 1
, wird nur verwendet, wenn Replikation konfiguriert ist). Die Formate dieser Werte sind dieselben wie im mysql_db
-Modul.
Sie können auch eine Datenbank löschen (oder sicherstellen, dass sie nicht auf dem Server ist), indem Sie state
auf absent
setzen (standardmäßig present
).
mysql_users: []
Die MySQL-Benutzer und ihre Berechtigungen. Ein Benutzer hat die Werte:
name
host
(standardmäßiglocalhost
)password
(kann im Klartext oder verschlüsselt sein – wenn verschlüsselt, setzen Sieencrypted: yes
)encrypted
(standardmäßigno
)priv
(standardmäßig*.*:USAGE
)append_privs
(standardmäßigno
)state
(standardmäßigpresent
)
Die Formate dieser Werte sind dieselben wie im mysql_user
-Modul.
mysql_packages:
- mysql
- mysql-server
(Spezifisch für das OS, Standardwerte für RedHat/CentOS hier aufgeführt) Zu installierende Pakete. In einigen Situationen müssen Sie zusätzliche Pakete hinzufügen, z. B. mysql-devel
.
mysql_enablerepo: ""
(Nur RedHat/CentOS) Wenn Sie zusätzliche Repositories aktiviert haben (ich empfehle geerlingguy.repo-epel oder geerlingguy.repo-remi), können diese Repositories unter dieser Variable aufgelistet werden (z. B. remi,epel
). Dies kann praktisch sein, wenn Sie spätere Versionen von MySQL installieren möchten.
mysql_python_package_debian: python3-mysqldb
(Nur Ubuntu/Debian) Wenn Sie das MySQL-Python-Paket ausdrücklich überschreiben müssen, können Sie es hier festlegen. Setzen Sie dies auf python-mysqldb
, wenn Sie ältere Distributionen mit Python 2 verwenden.
mysql_port: "3306"
mysql_bind_address: '0.0.0.0'
mysql_datadir: /var/lib/mysql
mysql_socket: *Standardwert hängt vom OS ab*
mysql_pid_file: *Standardwert hängt vom OS ab*
Standardkonfiguration für MySQL-Verbindungen.
mysql_log_file_group: mysql *adm auf Debian*
mysql_log: ""
mysql_log_error: *Standardwert hängt vom OS ab*
mysql_syslog_tag: *Standardwert hängt vom OS ab*
MySQL-Protokollierungs-Konfiguration. Das Setzen von mysql_log
(das allgemeine Abfrageprotokoll) oder mysql_log_error
auf syslog
bewirkt, dass MySQL in syslog mit dem mysql_syslog_tag
protokolliert.
mysql_slow_query_log_enabled: false
mysql_slow_query_log_file: *Standardwert hängt vom OS ab*
mysql_slow_query_time: 2
Einstellungen für das langsame Abfrageprotokoll. Beachten Sie, dass die Protokolldatei von dieser Rolle erstellt wird, aber wenn Sie auf einem Server mit SELinux oder AppArmor arbeiten, müssen Sie diesen Pfad möglicherweise zu den erlaubten Pfaden für MySQL hinzufügen oder das MySQL-Profil deaktivieren. Beispielsweise können Sie auf Debian/Ubuntu sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/usr.sbin.mysqld && sudo service apparmor restart
ausführen.
mysql_key_buffer_size: "256M"
mysql_max_allowed_packet: "64M"
mysql_table_open_cache: "256"
...
Die restlichen Einstellungen in defaults/main.yml
steuern den Speicherverbrauch von MySQL und einige andere allgemeine Einstellungen. Die Standardwerte sind für einen Server optimiert, auf dem MySQL 512 MB RAM verbrauchen kann, sodass Sie in Betracht ziehen sollten, diese an Ihren spezifischen Server anzupassen.
mysql_server_id: "1"
mysql_max_binlog_size: "100M"
mysql_binlog_format: "ROW"
mysql_expire_logs_days: "10"
mysql_replication_role: ''
mysql_replication_master: ''
mysql_replication_user: {}
Replikationseinstellungen. Setzen Sie mysql_server_id
und mysql_replication_role
pro Server (z.B. hätte der Master die ID 1
mit der mysql_replication_role
von master
, und der Slave hätte die ID 2
mit der mysql_replication_role
von slave
). Der mysql_replication_user
verwendet dieselben Schlüssel wie individuelle Listenelemente in mysql_users
und wird auf Master-Servern erstellt und für die Replikation auf allen Slaves verwendet.
mysql_replication_master
muss auf eine IP oder einen Hostnamen verweisen, der für die Slaves zugänglich ist (dies könnte eine /etc/hosts-Injektion oder ein anderes Mittel sein), andernfalls können die Slaves nicht mit dem Master kommunizieren.
Wenn der Replikationsmaster unterschiedliche IP-Adressen hat, an denen Sie Ansible ausführen und wo das MySQL-Replica läuft, können Sie optional einen mysql_replication_master_inventory_host
angeben, um die Maschine zu erreichen (z.B. Sie führen Ansible auf Ihrem lokalen Computer aus, aber der MySQL-Master und das Replica müssen in einem anderen Netzwerk kommunizieren).
mysql_hide_passwords: false
Müssen Sie die Ausgabe von Aufgaben verbergen, die während der Ausführung Passwörter enthalten?
Neuere Versionen von MySQL auf CentOS 7
Wenn Sie MySQL aus dem offiziellen Repository installieren möchten, anstatt die systemstandardmäßigen MariaDB-Äquivalente zu installieren, können Sie die folgende pre_tasks
-Aufgabe in Ihrem Playbook hinzufügen:
pre_tasks:
- name: Installieren Sie das MySQL-Repo.
yum:
name: http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
state: present
when: ansible_os_family == "RedHat"
- name: Variablen für MySQL überschreiben (RedHat).
set_fact:
mysql_daemon: mysqld
mysql_packages: ['mysql-server']
mysql_log_error: /var/log/mysqld.err
mysql_syslog_tag: mysqld
mysql_pid_file: /var/run/mysqld/mysqld.pid
mysql_socket: /var/lib/mysql/mysql.sock
when: ansible_os_family == "RedHat"
Nutzung von MariaDB
Diese Rolle funktioniert sowohl mit MySQL als auch mit einer kompatiblen Version von MariaDB. Auf RHEL/CentOS 7+ wurde die mariadb-Datenbank-Engine als Standard-MySQL-Ersatzpaket eingeführt. Es sind keine Änderungen erforderlich, obwohl alle Variablen weiterhin 'mysql' anstelle von 'mariadb' referenzieren.
MariaDB-Konfiguration für Ubuntu 14.04 und 16.04
Unter Ubuntu haben die Paketnamen andere Bezeichnungen, daher muss die mysql_package
-Variable geändert werden. Setzen Sie die folgenden Variablen (mindestens):
mysql_packages:
- mariadb-client
- mariadb-server
- python-mysqldb
Abhängigkeiten
Wenn Sie ansible
installiert haben (z.B. pip3 install ansible
), sind keine erforderlich.
Wenn Sie nur ansible-core
installiert haben, stellen Sie sicher, dass Sie community.mysql
in Ihrer collections/requirements.yml
anfordern oder es manuell mit ansible-galaxy collection install community.mysql
installieren.
Beispiel-Playbook
- hosts: db-servers
become: yes
vars_files:
- vars/main.yml
roles:
- { role: geerlingguy.mysql }
In vars/main.yml
:
mysql_root_password: super-sicheres-Passwort
mysql_databases:
- name: example_db
encoding: latin1
collation: latin1_general_ci
mysql_users:
- name: example_user
host: "%"
password: ebenso-sicher-passwort
priv: "example_db.*:ALL"
Lizenz
MIT / BSD
Autorinformationen
Diese Rolle wurde 2014 von Jeff Geerling erstellt, Autor von Ansible for DevOps.
ansible-galaxy install geerlingguy.mysql