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 :
namedéfinit le playbook un nom descriptif de ce qu'il fait, il n'est pas obligatoire de l'avoir.hostsdéfinit les hôtes à cibler comme défini dans lehostsouhosts.yamlfichier défini ci-dessus.gather_factsdéfinit si nous voulons qu'il soit possible de rassembler les faits avant de traiter les tâches. dans notre cas nous ne voulons pasbecomedéfinit que nous voulons exécuter nos tâches en tant que rootvarsdéfinit les variables que nous voulons réutiliser dans nos tâches. Nous avons définimysql_root_passwordetansible_python_interpreterdans 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_passwordla variable sera choisie parmi lesvarsdéfini plus tôt - L'
itemest une boucle des valeurs définies dans lewith_itemssection. - Le
check_implicit_admindit à 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, lepasswordfourni 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.