MySQL est un système de gestion de base de données relationnelle open source. C'est l'un des systèmes de gestion relationnelle les plus populaires.
Mysql est généralement installé dans le cadre de la pile populaire LAMP ou LEMP (Linux, Apache/Nginx, MySQL/MariaDB, PHP/Python/Perl).
Dans ce guide, nous allons utiliser mysql 8 sur Centos 8. Ce guide fonctionne également sur d'autres dérivés de RHEL 8 comme Rocky Linux 8 et Alma Linux 8
Vérifiez également :
- Comment installer et configurer mysql 8 sur Ubuntu 20.04
- Installation et configuration de Mysql Server 8 sur Centos 8
- Comment installer et configurer Mysql Server 8 sur Fedora 34/35
- Autorisations MySQL – Créer, mettre à jour, supprimer des utilisateurs de la base de données
- Installer et configurer Nginx, WordPress et Mysql 8 dans Centos 8
- Créer une instance RDS dans terraform avec un exemple Mariadb
Exigences
- Connexion Internet
- Ansible installé localement
Le fichier hosts
Nous avons besoin du fichier hosts qui définira les serveurs que nous ciblons :
all:
hosts:
db-server:
ansible_ssh_host: 192.168.10.2
ansible_ssh_user: centos
ansible_ssh_private_key_file: ~/.ssh/server_key
Le yaml ci-dessus définit un serveur db-server
qui a l'ip 192.168.10.2
et peut être consulté à l'aide de l'utilisateur centos
et ~/.ssh/server_key
.
Testez cela avec :
ssh -i ~/.ssh/server_key [email protected]
Le manuel de jeu ansible
Avant de définir nos tâches, nous devons dire quelques choses à ansible :
- 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
Explication :
name
définit le playbook un nom descriptif de ce qu'il fait, il n'est pas obligatoire de l'avoir.hosts
définit les hôtes à cibler comme défini dans lehosts
ouhosts.yaml
fichier défini ci-dessus.gather_facts
définit si nous voulons qu'il soit possible de rassembler les faits avant de traiter les tâches. dans notre cas nous ne voulons pasbecome
définit que nous voulons exécuter nos tâches en tant que rootvars
définit les variables que nous voulons réutiliser dans nos tâches. Nous avons définimysql_root_password
etansible_python_interpreter
dans notre cas
Les tâches ansibles
Après la section ci-dessus, nous devons maintenant définir nos tâches. Ces tâches peuvent être ajoutées dans un rôle ou spécifiées en tant que tâches. Dans notre cas, nous les utiliserons comme tâches (vérifiez la fin de ce guide pour le playbook complet).
Assurez-vous que le logiciel requis est installé
Avant de continuer, nous voulons installer tous les logiciels dont nous aurions besoin. Ceux-ci incluent le logiciel spécifique mysql mysql-server
et mysql-devel
et des logiciels de support comme les logiciels liés à python qui seront utilisés par ansible pour se connecter et configurer l'instance de serveur mysql. Nous utilisons l'ansible dnf
module pour ce faire.
- name: Ensure required packages are installed
dnf:
name:
- mysql-server
- mysql-devel
- python39
- python39-devel
- python39-pip
- gcc
state: latest
Installez les modules pip requis
Ansible utilise le PyMySQL
module en python3 pour se connecter et configurer le serveur mysql. Installez-le en utilisant ansible pip
modules
- name: Install Required pip modules
pip:
name:
- PyMySQL
state: present
executable: pip3
Démarrer et activer le service mysql
Comme nous voulons nous connecter et effectuer des opérations sur le serveur, commençons par cette tâche. Depuis centos 8 utilise systemd
pour gérer les processus de longue durée, démarrons et activons mysqld en utilisant l'ansible systemd
modules :
- name: Ensure mysql service is running
systemd:
name: mysqld
state: started
enabled: yes
Assurez-vous que l'utilisateur root peut se connecter depuis le serveur local
La root
mysql user est l'utilisateur admin par défaut qui dispose d'autorisations sur toutes les ressources du serveur. Une bonne pratique serait de n'autoriser l'accès que via cet utilisateur root
dans le système local lorsque nous effectuons des tâches d'administration, sinon créez un utilisateur dédié pour chaque connexion, c'est-à-dire que pour chaque application, ayez un utilisateur qui a accès à cette base de données uniquement.
- 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
Dans la définition de tâche ci-dessus :
- le
mysql_root_password
la variable sera choisie parmi lesvars
défini plus tôt - L'
item
est une boucle des valeurs définies dans lewith_items
section. - Le
check_implicit_admin
dit à ansible d'essayer de se connecter sans mot de passe, ce qui devrait fonctionner puisqu'il s'agit d'une nouvelle installation. Dans ce cadre, lepassword
fourni sera défini pour l'utilisateur racine
Ajouter my.cnf
vers le répertoire personnel
Maintenant que nous avons défini le mot de passe dans la tâche ci-dessus, nous voudrions fournir le mot de passe lorsque nous effectuons plus de tâches en tant qu'utilisateur root. Nous pouvons fournir cela dans le ~/.my.cnf
, un fichier dont les informations d'identification sont vérifiées à chaque fois que nous exécutons des commandes mysql.
Créez un fichier my.cnf.j2
dans le répertoire courant :
[client]
user=root
password={{ mysql_root_password }}
Ensuite, c'est la tâche à copier dans /root/.my.cnf
puisque nous exécutons les tâches en tant qu'utilisateur root.
- name: Add .my.cnf to user home
template:
src: my.cnf.j2
dest: /root/.my.cnf
Recharger les privilèges
Exécutez la tâche suivante pour recharger les privilèges afin que les modifications que nous avons apportées jusqu'à présent s'appliquent :
- name: Reload privilege tables
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- FLUSH PRIVILEGES
changed_when: False
Supprimer les utilisateurs anonymes
C'est une bonne pratique de supprimer les utilisateurs anonymes. Faisons-le en utilisant cette tâche :
- name: Remove anonymous users
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- DELETE FROM mysql.user WHERE User=''
changed_when: False
Interdire à root de se connecter à distance
Exécutez ce qui suit pour supprimer les entrées dans le mysql.user
table. Cela garantit que l'utilisateur root ne peut se connecter que localement :
- 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
Supprimer la base de données de test et y accéder
Comme nous n'avons pas besoin de la base de données de test, nous pouvons la supprimer avec cette tâche :
- 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
Recharger les privilèges
Pour appliquer les modifications que nous avons apportées ci-dessus, rechargez les privilèges avec cette tâche :
- name: Reload privilege tables
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- FLUSH PRIVILEGES
changed_when: False
Supprimez le .my.cnf
que nous avons copié.
Par sécurité, supprimons le /root/.my.cnf
fichier puisqu'il contient un accès root :
- name: Delete .my.conf
file:
path: /root/.my.cnf
state: absent
Tout le livre de jeu
Voici le playbook complet avec toutes les tâches :
---
- 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
Pour exécuter le playbook, vous devez créer le fichier setup-mysql.yaml
avec le contenu ci-dessus et hosts.yaml
avec le contenu du fichier hosts puis utilisez la commande suivante pour l'exécuter :
ansible-playbook -i hosts.yaml setup-mysql.yaml -vv
Conclusion
Dans ce guide, nous avons pu utiliser ansible pour installer mysql server 8 sur un hôte centos 8 à l'aide d'ansible.
Ansible nous donne un moyen d'automatiser le processus. Cela peut être utilisé pour configurer plusieurs instances de manière prévisible à l'aide d'une seule commande.