githubixx.etcd
ansible-role-etcd
Este rol de Ansible se utiliza en Kubernetes de una manera no tan complicada con Ansible - clúster etcd. Pero, por supuesto, también se puede usar sin un clúster de Kubernetes.
Instala un clúster etcd. SUGERENCIA: ¡Este playbook NO recarga ni reinicia los procesos del clúster etcd después de que se cambió el archivo de servicio systemd! ¡Esto es intencional! Sería una muy mala idea reiniciar todos los procesos etcd al mismo tiempo. Así que si se ha cambiado el archivo etcd.service
, reinicia/recarga etcd manualmente un nodo tras otro y verifica la salida de registro para ver si el nodo se unió nuevamente al clúster. Por supuesto, este proceso también se puede automatizar, pero actualmente no es parte de este rol. Como nota adicional: El script emitirá un systemctl daemon-reload
después de que se haya cambiado el archivo del servicio etcd para que al menos systemd esté al tanto del archivo cambiado y no tengas que preocuparte por eso. Así que un reinicio de un nodo etcd también activará la nueva configuración.
La actualización de un clúster etcd que fue instalado por este rol se describe aquí.
Versiones
Etiquetaré cada lanzamiento y trataré de seguir con versionado semántico. Si quieres usar el rol, te recomiendo que revises la última etiqueta. La rama principal es básicamente desarrollo, mientras que las etiquetas marcan lanzamientos estables. En general, trato de mantener la rama principal en buen estado también. Una etiqueta 13.1.1+3.5.13
significa que este es el lanzamiento 13.1.1
de este rol y está destinado a ser usado con la versión de etcd 3.5.13
(pero debería funcionar con versiones más nuevas también). Si el rol en sí cambia, X.Y.Z
antes de +
aumentará. Si la versión de etcd cambia, X.Y.Z
después de +
aumentará. Esto permite etiquetar correcciones de errores y nuevas versiones principales del rol mientras se desarrolla para un lanzamiento específico de etcd.
Registro de cambios
ver CHANGELOG.md
Requisitos
Este rol requiere que ya hayas creado algunos certificados para etcd
(ver Kubernetes de una manera no tan complicada con Ansible - Autoridad certificadora (CA) y el rol de Ansible kubernetes_ca). El playbook buscará los certificados en etcd_ca_conf_directory
en el host donde se ejecuta este playbook. Por supuesto, puedes crear los certificados por tu cuenta (ver Generar certificados autofirmados - El repositorio de Git está archivado, pero la información sigue siendo válida).
Variables del rol
# El directorio desde donde copiar los certificados etcd. Por defecto, esto
# se expandirá al LOCAL $HOME del usuario (el usuario que ejecuta "ansible-playbook ..."
# más "/etcd-certificates". Eso significa que si el directorio $HOME del usuario es, por ejemplo,
# "/home/da_user", entonces "etcd_ca_conf_directory" tendrá un valor de
# "/home/da_user/etcd-certificates".
etcd_ca_conf_directory: "{{ '~/etcd-certificates' | expanduser }}"
# Grupo de Ansible para etcd
etcd_ansible_group: "k8s_etcd"
# Versión de etcd
etcd_version: "3.5.13"
# Puerto donde etcd escucha a los clientes
etcd_client_port: "2379"
# Puerto donde etcd escucha a sus pares
etcd_peer_port: "2380"
# Interfaz para vincular los puertos etcd
etcd_interface: "tap0"
# Ejecutar el demonio etcd como este usuario.
#
# Nota 1: Si deseas usar un "etcd_peer_port" < 1024, probablemente necesitarás
# ejecutar "etcd" como usuario "root".
# Nota 2: Si el usuario especificado en "etcd_user" no existe, el rol
# lo creará. Solo si el usuario ya existe, el rol no lo creará,
# pero ajustará su UID/GID y shell si se especifica (ver configuraciones a continuación).
# Además, si "etcd_user" es "root", entonces este rol no tocará al usuario
# en absoluto.
etcd_user: "etcd"
# UID del usuario especificado en "etcd_user". Si no se especifica, se tomará el siguiente UID disponible
# de "/etc/login.defs" (ver ajuste "SYS_UID_MAX").
# etcd_user_uid: "999"
# Shell para el usuario especificado en "etcd_user". Para mayor seguridad,
# mantén el valor predeterminado.
etcd_user_shell: "/bin/false"
# Especifica si el usuario especificado en "etcd_user" será un usuario del sistema (predeterminado)
# o no. Si es "true", la configuración "etcd_user_home" se ignorará. En general,
# tiene sentido mantener el valor predeterminado, ya que no debería haber necesidad de iniciar sesión como
# el usuario que ejecuta "etcd".
etcd_user_system: true
# Directorio de inicio del usuario especificado en "etcd_user". Se ignorará si
# "etcd_user_system" está configurado como "true". En este caso, no se creará un directorio de inicio. Normalmente no es necesario.
# etcd_user_home: "/home/etcd"
# Ejecutar el demonio etcd como este grupo
#
# Nota: Si el grupo especificado en "etcd_group" no existe, el rol
# lo creará. Solo si el grupo ya existe, el rol no lo creará,
# pero ajustará GID si se especifica en "etcd_group_gid" (ver ajuste a continuación).
etcd_group: "etcd"
# GID del grupo especificado en "etcd_group". Si no se especifica, se tomará el siguiente GID disponible
# de "/etc/login.defs" (ver ajuste "SYS_GID_MAX").
# etcd_group_gid: "999"
# Especifica si el grupo especificado en "etcd_group" será un grupo del sistema (predeterminado)
# o no.
etcd_group_system: true
# Directorio para la configuración de etcd
etcd_conf_dir: "/etc/etcd"
# Permisos para el directorio de configuración de etcd
etcd_conf_dir_mode: "0750"
# Propietario del directorio especificado en "etcd_conf_dir"
etcd_conf_dir_user: "root"
# Grupo propietario del directorio especificado en "etcd_conf_dir"
etcd_conf_dir_group: "{{ etcd_group }}"
# Directorio para almacenar el archivo comprimido de etcd descargado
# No debe ser eliminado para evitar descargar repetidamente
etcd_download_dir: "/opt/etcd"
# Permisos para el directorio que almacena el archivo comprimido de etcd descargado
etcd_download_dir_mode: "0755"
# Propietario del directorio especificado en "etcd_download_dir"
etcd_download_dir_user: "{{ etcd_user }}"
# Grupo propietario del directorio especificado en "etcd_download_dir"
etcd_download_dir_group: "{{ etcd_group }}"
# Directorio para almacenar los binarios de etcd
#
# IMPORTANTE: Si utilizas el valor predeterminado para "etcd_bin_dir", que es
# "/usr/local/bin", entonces los ajustes especificados en "etcd_bin_dir_mode",
# "etcd_bin_dir_user" y "etcd_bin_dir_group" se ignoran. Esto
# se hace para prevenir que se cambien los permisos de "/usr/local/bin".
# Este directorio normalmente existe ya en cada instalación de Linux
# y no debe cambiarse.
# Así que ten cuidado si especificas un directorio como "/usr/bin" o
# "/bin" como "etcd_bin_dir", ya que esto cambiará los permisos de
# esos directorios y normalmente no deseas hacer esto.
etcd_bin_dir: "/usr/local/bin"
# Permisos para el directorio que almacena los binarios de etcd
etcd_bin_dir_mode: "0755"
# Propietario del directorio especificado en "etcd_bin_dir"
etcd_bin_dir_user: "{{ etcd_user }}"
# Grupo propietario del directorio especificado en "etcd_bin_dir"
etcd_bin_dir_group: "{{ etcd_group }}"
# Directorio de datos de etcd (archivos de base de datos de etcd)
etcd_data_dir: "/var/lib/etcd"
# Permisos para el directorio que almacena los datos de etcd
etcd_data_dir_mode: "0700"
# Propietario del directorio especificado en "etcd_data_dir"
etcd_data_dir_user: "{{ etcd_user }}"
# Grupo propietario del directorio especificado en "etcd_data_dir"
etcd_data_dir_group: "{{ etcd_group }}"
# Arquitectura a descargar e instalar
etcd_architecture: "amd64"
# Solo cambia esto si la arquitectura que estás usando no es compatible
# Para más información, consulta:
# https://github.com/etcd-io/website/blob/main/content/en/docs/v3.5/op-guide/supported-platform.md
etcd_allow_unsupported_archs: false
# Por defecto, el archivo tarball de etcd se descarga del repositorio oficial
# de etcd. Esto se puede cambiar a alguna URL personalizada si es necesario. Para más información sobre qué protocolos
# se pueden utilizar, consulta:
# https://docs.ansible.com/ansible/latest/collections/ansible/builtin/get_url_module.html
# Solo es importante mantener el esquema de nombres de archivo:
# "etcd-v{{ etcd_version }}-linux-{{ etcd_architecture }}.tar.gz"
etcd_download_url: "https://github.com/etcd-io/etcd/releases/download/v{{ etcd_version }}/etcd-v{{ etcd_version }}-linux-{{ etcd_architecture }}.tar.gz"
# Por defecto, se utiliza el archivo SHA256SUMS para verificar el
# checksum del archivo comprimido tar. Esto también se puede
# cambiar según tus necesidades.
etcd_download_url_checksum: "sha256:https://github.com/coreos/etcd/releases/download/v{{ etcd_version }}/SHA256SUMS"
# Opciones para la sección [Service]. Para más información consulta:
# https://www.freedesktop.org/software/systemd/man/systemd.service.html#Options
# Las opciones debajo de "Type=notify" son principalmente configuraciones de seguridad/sandbox
# y limitan la exposición del sistema a los procesos de la unidad.
# https://www.freedesktop.org/software/systemd/man/systemd.exec.html
etcd_service_options:
- User={{ etcd_user }}
- Group={{ etcd_group }}
- Restart=on-failure
- RestartSec=5
- Type=notify
- ProtectHome=true
- PrivateTmp=true
- ProtectSystem=full
- ProtectKernelModules=true
- ProtectKernelTunables=true
- ProtectControlGroups=true
- CapabilityBoundingSet=~CAP_SYS_PTRACE
etcd_settings:
"name": "{{ ansible_hostname }}"
"cert-file": "{{ etcd_conf_dir }}/cert-etcd-server.pem"
"key-file": "{{ etcd_conf_dir }}/cert-etcd-server-key.pem"
"trusted-ca-file": "{{ etcd_conf_dir }}/ca-etcd.pem"
"peer-cert-file": "{{ etcd_conf_dir }}/cert-etcd-peer.pem"
"peer-key-file": "{{ etcd_conf_dir }}/cert-etcd-peer-key.pem"
"peer-trusted-ca-file": "{{ etcd_conf_dir }}/ca-etcd.pem"
"advertise-client-urls": "{{ 'https://' + hostvars[inventory_hostname]['ansible_' + etcd_interface].ipv4.address + ':' + etcd_client_port }}"
"initial-advertise-peer-urls": "{{ 'https://' + hostvars[inventory_hostname]['ansible_' + etcd_interface].ipv4.address + ':' + etcd_peer_port }}"
"listen-peer-urls": "{{ 'https://' + hostvars[inventory_hostname]['ansible_' + etcd_interface].ipv4.address + ':' + etcd_peer_port }}"
"listen-client-urls": "{{ 'https://' + hostvars[inventory_hostname]['ansible_' + etcd_interface].ipv4.address + ':' + etcd_client_port + ',https://127.0.0.1:' + etcd_client_port }}"
"peer-client-cert-auth": "true" # Habilitar autenticación de certificado de cliente entre pares
"client-cert-auth": "true" # Habilitar autenticación de certificado de cliente
"initial-cluster-token": "etcd-cluster-0" # Token inicial del clúster para el clúster etcd durante la inicialización.
"initial-cluster-state": "new" # Estado inicial del clúster ('new' o 'existing')
"data-dir": "{{ etcd_data_dir }}" # directorio de datos de etcd (archivos de base de datos de etcd)
"wal-dir": "" # Directorio WAL dedicado ("" significa sin directorio WAL separado)
"auto-compaction-retention": "0" # Retención de auto-compacción en horas. 0 significa desactivar la auto-compacción.
"snapshot-count": "100000" # Número de transacciones confirmadas para activar un snapshot en disco
"heartbeat-interval": "100" # Tiempo (en milisegundos) para un intervalo de latido
"election-timeout": "1000" # Tiempo (en milisegundos) para que expire una elección. Consulta la documentación de ajuste para más detalles
"max-snapshots": "5" # Máximo número de archivos de snapshot para retener (0 es ilimitado)
"max-wals": "5" # Máximo número de archivos WAL para retener (0 es ilimitado)
"quota-backend-bytes": "0" # Generar alarmas cuando el tamaño del backend exceda la cuota dada (0 por defecto a cuota de espacio baja)
"logger": "zap" # Especificar ‘zap’ para registro estructurado o ‘capnslog’.
"log-outputs": "systemd/journal" # Especificar 'stdout' o 'stderr' para omitir el registro de journald incluso cuando se ejecuta bajo systemd
"enable-v2": "true" # habilitar API v2 para seguir siendo compatible con versiones anteriores de etcd 3.3.x (necesario para flannel, por ejemplo)
"discovery-srv": "" # Dominio de descubrimiento para habilitar el descubrimiento DNS SRV, dejar vacío para desactivar. Si se establece, sobrescribirá el clúster inicial.
# Autoridad certificadora y archivos de certificado para etcd
etcd_certificates:
- ca-etcd.pem # archivo de autoridad certificadora
- ca-etcd-key.pem # archivo clave de autoridad certificadora
- cert-etcd-peer.pem # archivo cert TLS de peer
- cert-etcd-peer-key.pem # archivo clave TLS de peer
- cert-etcd-server.pem # archivo cert TLS de servidor
- cert-etcd-server-key.pem # archivo clave TLS de servidor
Los ajustes predeterminados de etcd
definidos en etcd_settings
se pueden sobrescribir definiendo una variable llamada etcd_settings_user
. También puedes agregar configuraciones adicionales utilizando esta variable. Por ejemplo, para sobrescribir el valor predeterminado para el ajuste log-output
y agregar un nuevo ajuste como grpc-keepalive-min-time
, agrega los siguientes ajustes a group_vars/k8s.yml
:
etcd_settings_user:
"log-output": "stdout"
"grpc-keepalive-min-time": "10s"
Ejemplo de Playbook
- hosts: k8s_etcd
roles:
- githubixx.etcd
Pruebas
Este rol tiene una pequeña configuración de prueba que se crea utilizando Molecule, libvirt (vagrant-libvirt) y QEMU/KVM. Consulta mi publicación en el blog Probando roles de Ansible con Molecule, libvirt (vagrant-libvirt) y QEMU/KVM para saber cómo configurarlo. La configuración de prueba está aquí.
Después, se puede ejecutar Molecule:
molecule converge
Esto configurará tres máquinas virtuales (VM) con Ubuntu 20.04/22.04 e instalará un clúster etcd. También se incluye un pequeño paso de verificación:
molecule verify
Para limpiar, ejecuta
molecule destroy
Licencia
Licencia Pública General GNU Versión 3
Información sobre el autor
ansible-galaxy install githubixx.etcd