GNU/Linux >> Tutoriales Linux >  >> Cent OS

Uso de Ansible para instalar e inicializar Mysql 8 en Rocky Linux/Centos 8

MySQL es un sistema de gestión de bases de datos relacionales de código abierto. Es uno de los populares sistemas de administración relacional.
Mysql se instala comúnmente como parte de la popular pila LAMP o LEMP (Linux, Apache/Nginx, MySQL/MariaDB, PHP/Python/Perl).

En esta guía vamos a utilizar mysql 8 en Centos 8. Esta guía también funciona en otros derivados de RHEL 8 como Rocky Linux 8 y Alma Linux 8

Compruebe también:

  • Cómo instalar y configurar mysql 8 en Ubuntu 20.04
  • Instalación y configuración de Mysql Server 8 en Centos 8
  • Cómo instalar y configurar Mysql Server 8 en Fedora 34/35
  • Permisos de MySQL:crear, actualizar y eliminar usuarios de la base de datos
  • Instalar y configurar Nginx, WordPress y Mysql 8 en Centos 8
  • Cree una instancia de RDS en terraform con un ejemplo de Mariadb

Requisitos

  • Conexión a Internet
  • Ansible instalado localmente

El archivo de hosts

Requerimos el archivo de hosts que definirá los servidores a los que nos dirigimos:

all:
  hosts:
    db-server:
      ansible_ssh_host: 192.168.10.2
      ansible_ssh_user: centos
      ansible_ssh_private_key_file: ~/.ssh/server_key

El yaml anterior define un servidor db-server que tiene la ip 192.168.10.2 y se puede acceder usando el usuario centos y ~/.ssh/server_key .

Prueba eso con:

ssh -i ~/.ssh/server_key [email protected]

El libro de jugadas de ansible

Antes de definir nuestras tareas, debemos decirle a ansible un par de cosas:

- 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

Explicación:

  • name define el libro de jugadas con un nombre descriptivo de lo que hace, no es obligatorio tenerlo.
  • hosts define los hosts a los que apuntar como se define en hosts o hosts.yaml archivo definido anteriormente.
  • gather_facts define si queremos que ansible recopile los hechos antes de procesar las tareas. en nuestro caso no queremos
  • become define que queremos ejecutar nuestras tareas como root
  • vars define las variables que queremos reutilizar en nuestras tareas. Definimos mysql_root_password y ansible_python_interpreter en nuestro caso

Las tareas de ansible

Después de la sección anterior, ahora necesitamos definir nuestras tareas. Estas tareas pueden agregarse en un rol o especificarse como tareas. En nuestro caso, los usaremos como tareas (consulte el final de esta guía para ver el libro de jugadas completo).

Asegúrese de que el software necesario esté instalado

Antes de continuar, queremos instalar todo el software que necesitaríamos. Estos incluyen el software específico de mysql mysql-server y mysql-devel y software de soporte como el software relacionado con python que utilizará ansible para conectarse y configurar la instancia del servidor mysql. Usamos el dnf de ansible módulo para hacer esto.

- name: Ensure required packages are installed
  dnf:
    name:
      - mysql-server
      - mysql-devel
      - python39
      - python39-devel
      - python39-pip
      - gcc
    state: latest

Instalar los módulos pip requeridos

Ansible usa el PyMySQL módulo en python3 para conectar y configurar el servidor mysql. Instálalo usando ansible pip módulo

- name: Install Required pip modules
  pip:
    name:
      - PyMySQL
    state: present
    executable: pip3

Iniciar y habilitar el servicio mysql

Debido a que queremos conectarnos y realizar operaciones en el servidor, comencemos con esta tarea. Dado que centos 8 usa systemd para administrar procesos de ejecución prolongada, comencemos y habilitemos mysqld usando ansible systemd módulo:

- name: Ensure mysql service is running
  systemd:
    name: mysqld
    state: started
    enabled: yes

Asegúrese de que el usuario raíz pueda iniciar sesión desde el servidor local

La root de mysql user es el usuario administrador predeterminado que tiene permisos para todos los recursos del servidor. Una mejor práctica sería habilitar el acceso solo a través de este usuario root en el sistema local cuando estamos realizando tareas de administración; de lo contrario, cree un usuario dedicado para cada conexión, es decir, para cada aplicación, tenga un usuario que tenga acceso solo a esa base de datos.

- 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

En la definición de tarea anterior:

  • la mysql_root_password la variable se seleccionará de las vars definido anteriormente
  • El item es un ciclo de los valores definidos en with_items sección.
  • El check_implicit_admin le dice a ansible que intente iniciar sesión sin contraseña, lo que debería funcionar ya que se trata de una nueva instalación. Como parte de esto, la password proporcionado se establecerá para el usuario root

Añadir my.cnf al directorio de inicio

Ahora que hemos establecido la contraseña en la tarea anterior, nos gustaría proporcionar la contraseña al realizar más tareas como usuario raíz. Podemos proporcionar esto en el ~/.my.cnf , un archivo cuyas credenciales se verifican cada vez que ejecutamos comandos mysql.
Cree un archivo my.cnf.j2 en el directorio actual:

[client]
user=root
password={{ mysql_root_password }}

Entonces esta es la tarea para copiar a /root/.my.cnf ya que estamos ejecutando las tareas como usuario root.

- name: Add .my.cnf to user home
  template:
    src: my.cnf.j2
    dest: /root/.my.cnf

Recargar privilegios

Ejecute la siguiente tarea para recargar los privilegios para que se apliquen los cambios que hemos realizado hasta ahora:

- name: Reload privilege tables
  command: |
    mysql -p{{ mysql_root_password }} -ne "{{ item }}"
  with_items:
    - FLUSH PRIVILEGES
  changed_when: False

Eliminar usuarios anónimos

Es una buena práctica eliminar usuarios anónimos. Hagámoslo usando esta tarea:

- name: Remove anonymous users
  command: |
    mysql -p{{ mysql_root_password }} -ne "{{ item }}"
  with_items:
    - DELETE FROM mysql.user WHERE User=''
  changed_when: False

Prohibir que root inicie sesión de forma remota

Ejecute lo siguiente para eliminar entradas en mysql.user mesa. Esto asegura que el usuario raíz solo pueda iniciar sesión localmente:

- 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

Eliminar la base de datos de prueba y acceder a ella

Como no necesitamos la base de datos de prueba, podemos eliminarla con esta tarea:

- 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

Recargar privilegios

Para aplicar los cambios que hemos realizado anteriormente, recarga los privilegios con esta tarea:

- name: Reload privilege tables
  command: |
    mysql -p{{ mysql_root_password }} -ne "{{ item }}"
  with_items:
    - FLUSH PRIVILEGES
  changed_when: False

Borrar el .my.cnf que copiamos.

Por seguridad, eliminemos /root/.my.cnf archivo ya que contiene acceso de root:

- name: Delete .my.conf
  file:
    path: /root/.my.cnf
    state: absent

Guía completa

Este es el libro de jugadas completo con todas las tareas:

---
- 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

Para ejecutar el libro de jugadas, debe crear el archivo setup-mysql.yaml con el contenido anterior y hosts.yaml con el contenido del archivo hosts, luego use el siguiente comando para ejecutar:

ansible-playbook -i hosts.yaml setup-mysql.yaml -vv

Conclusión

En esta guía, pudimos usar ansible para instalar el servidor mysql 8 en un host centos 8 usando ansible.

Ansible nos brinda una manera de automatizar el proceso. Esto se puede usar para configurar múltiples instancias de manera predecible usando un solo comando.


Cent OS
  1. Cómo instalar y configurar Nginx, WordPress y Mysql 8 en Rocky Linux/Centos 8

  2. Cómo instalar Mysql 8 en Rocky Linux/Centos 8

  3. Cómo instalar y usar php Composer en Rocky Linux/Centos 8

  4. Cómo instalar y configurar docker en Rocky Linux/Centos 8

  5. Cómo instalar y configurar Mono en Rocky Linux 8 y CentOS 8

Cómo instalar Fish Shell en CentOS 8 y Rocky Linux 8

Cómo instalar Webmin en CentOS 8 y Rocky Linux 8

Cómo instalar y configurar Jenkins en Rocky Linux/Centos 8

Cómo instalar y cofigurar NextCloud usando LEMP en Rocky Linux/Centos 8

Cómo instalar Rabbitmq en Rocky Linux/Alma Linux/Centos 8

Cómo instalar y configurar Ansible AWX en Rocky Linux 8.3 y CentOS 8