GNU/Linux >> Tutoriels Linux >  >> Cent OS

Utilisation d'Ansible pour installer et initialiser Mysql 8 sur Rocky Linux/Centos 8

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 le hosts ou hosts.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 pas
  • become définit que nous voulons exécuter nos tâches en tant que root
  • vars définit les variables que nous voulons réutiliser dans nos tâches. Nous avons défini mysql_root_password et ansible_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 les vars défini plus tôt
  • L'item est une boucle des valeurs définies dans le with_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, le password 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.


Cent OS
  1. Comment installer et configurer Nginx, WordPress et Mysql 8 dans Rocky Linux/Centos 8

  2. Comment installer Mysql 8 sur Rocky Linux/Centos 8

  3. Comment installer et utiliser php Composer dans Rocky Linux/Centos 8

  4. Comment installer et configurer docker dans Rocky Linux/Centos 8

  5. Comment installer Go dans Fedora et Rocky Linux/Centos/RHEL

Comment installer Fish Shell sur CentOS 8 et Rocky Linux 8

Comment installer Webmin sur CentOS 8 et Rocky Linux 8

Comment installer et configurer Jenkins dans Rocky Linux/Centos 8

Comment installer et configurer NextCloud en utilisant LEMP sur Rocky Linux/Centos 8

Comment installer Rabbitmq dans Rocky Linux/Alma Linux/Centos 8

Comment installer et configurer Ansible AWX sur Rocky Linux 8.3 et CentOS 8