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 enhosts
ohosts.yaml
archivo definido anteriormente.gather_facts
define si queremos que ansible recopile los hechos antes de procesar las tareas. en nuestro caso no queremosbecome
define que queremos ejecutar nuestras tareas como rootvars
define las variables que queremos reutilizar en nuestras tareas. Definimosmysql_root_password
yansible_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 lasvars
definido anteriormente - El
item
es un ciclo de los valores definidos enwith_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, lapassword
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.