githubixx.etcd
ansible-role-etcd
Ce rôle Ansible est utilisé dans Kubernetes the not so hard way with Ansible - cluster etcd. Mais il peut bien sûr être utilisé sans cluster Kubernetes.
Ce rôle installe un cluster etcd. ASTUCE : Ce playbook ne recharge pas ou ne redémarre pas les processus du cluster etcd après que le fichier de service systemd a été modifié ! C'est intentionnel ! Redémarrer tous les processus etcd en même temps serait une très mauvaise idée. Donc, si le fichier etcd.service
a changé, redémarrez/rechargez etcd manuellement, un nœud après l'autre, et vérifiez les logs pour voir si le nœud a rejoint à nouveau le cluster ! Bien sûr, ce processus peut aussi être automatisé, mais il ne fait actuellement pas partie de ce rôle. À noter : le script exécutera un systemctl daemon-reload
après que le fichier de service etcd a été modifié, afin que systemd soit au moins conscient du fichier modifié et que vous n'ayez pas à vous en soucier. Donc, un redémarrage d'un nœud etcd activerait également la nouvelle configuration.
La mise à niveau d'un cluster etcd installé par ce rôle est décrite ici.
Versions
Je tague chaque release et essaie de respecter la version sémantique. Si vous voulez utiliser le rôle, je vous recommande de consulter le dernier tag. La branche master est essentiellement le développement, tandis que les tags marquent les versions stables. En général, j'essaie de maintenir également master en bon état. Un tag 13.1.1+3.5.13
signifie que c'est la release 13.1.1
de ce rôle et qu'elle est destinée à être utilisée avec la version etcd 3.5.13
(mais devrait également fonctionner avec des versions plus récentes). Si le rôle lui-même change, X.Y.Z
avant +
augmentera. Si la version etcd change, X.Y.Z
après +
augmentera. Cela permet de taguer les corrections de bugs et les nouvelles versions majeures du rôle tout en le développant pour une version spécifique d'etcd.
Changelog
voir CHANGELOG.md
Exigences
Ce rôle nécessite que vous ayez déjà créé quelques certificats pour etcd
(voir Kubernetes the not so hard way with Ansible - Autorité de certification (CA) et le rôle Ansible kubernetes_ca). Le playbook recherche les certificats dans etcd_ca_conf_directory
sur l'hôte où ce playbook s'exécute. Bien sûr, vous pouvez créer les certificats vous-même (voir Générer des certificats auto-signés - le dépôt Git est archivé mais les informations restent valides).
Variables de rôle
# Le répertoire d'où copier les certificats etcd. Par défaut, cela
# correspond au $HOME LOCAL de l'utilisateur (l'utilisateur qui exécute "ansible-playbook ..."
# plus "/etcd-certificates". Cela signifie que si le répertoire $HOME de l'utilisateur est par exemple
# "/home/da_user", alors "etcd_ca_conf_directory" aura la valeur de
# "/home/da_user/etcd-certificates".
etcd_ca_conf_directory: "{{ '~/etcd-certificates' | expanduser }}"
# groupe Ansible etcd
etcd_ansible_group: "k8s_etcd"
# version etcd
etcd_version: "3.5.13"
# Port où etcd écoute pour les clients
etcd_client_port: "2379"
# Port où etcd écoute pour ses pairs
etcd_peer_port: "2380"
# Interface à laquelle lier les ports etcd
etcd_interface: "tap0"
# Exécute le démon etcd en tant que cet utilisateur.
#
# Remarque 1 : Si vous voulez utiliser un "etcd_peer_port" < 1024, vous devez très probablement
# exécuter "etcd" en tant qu'utilisateur "root".
# Remarque 2 : Si l'utilisateur spécifié dans "etcd_user" n'existe pas, alors le rôle
# le créera. Ce n'est que si l'utilisateur existe déjà que le rôle ne créera pas
# mais ajustera son UID/GID et son shell si spécifié (voir les paramètres ci-dessous).
# De plus, si "etcd_user" est "root", alors ce rôle ne touchera pas du tout à l'utilisateur.
etcd_user: "etcd"
# UID de l'utilisateur spécifié dans "etcd_user". Si non spécifié, le prochain UID disponible
# dans "/etc/login.defs" sera utilisé (voir le paramètre "SYS_UID_MAX").
# etcd_user_uid: "999"
# Shell pour l'utilisateur spécifié dans "etcd_user". Pour une sécurité accrue, conservez
# la valeur par défaut.
etcd_user_shell: "/bin/false"
# Spécifie si l'utilisateur spécifié dans "etcd_user" sera un utilisateur système (par défaut)
# ou non. Si "true", le paramètre "etcd_user_home" sera ignoré. En général,
# il est logique de garder le paramètre par défaut car il ne devrait pas être nécessaire de se connecter en tant
# qu'utilisateur qui exécute "etcd".
etcd_user_system: true
# Répertoire personnel de l'utilisateur spécifié dans "etcd_user". Sera ignoré si
# "etcd_user_system" est défini à "true". Dans ce cas, aucun répertoire personnel ne sera
# créé. Normalement, ce n'est pas nécessaire.
# etcd_user_home: "/home/etcd"
# Exécute le démon etcd en tant que ce groupe
#
# Remarque : Si le groupe spécifié dans "etcd_group" n'existe pas, le rôle
# le créera. Ce n'est que si le groupe existe déjà que le rôle ne le créera pas
# mais ajustera son GID si spécifié dans "etcd_group_gid" (voir le paramètre ci-dessous).
etcd_group: "etcd"
# GID du groupe spécifié dans "etcd_group". Si non spécifié, le prochain GID disponible
# dans "/etc/login.defs" sera pris (voir le paramètre "SYS_GID_MAX").
# etcd_group_gid: "999"
# Spécifie si le groupe spécifié dans "etcd_group" sera un groupe système (par défaut)
# ou non.
etcd_group_system: true
# Répertoire pour la configuration etcd
etcd_conf_dir: "/etc/etcd"
# Permissions pour le répertoire pour la configuration etcd
etcd_conf_dir_mode: "0750"
# Propriétaire du répertoire spécifié dans "etcd_conf_dir"
etcd_conf_dir_user: "root"
# Groupe propriétaire du répertoire spécifié dans "etcd_conf_dir"
etcd_conf_dir_group: "{{ etcd_group }}"
# Répertoire pour stocker l'archive etcd téléchargée
# Ne devrait pas être supprimé pour éviter de télécharger encore et encore
etcd_download_dir: "/opt/etcd"
# Permissions pour le répertoire de stockage de l'archive etcd téléchargée
etcd_download_dir_mode: "0755"
# Propriétaire du répertoire spécifié dans "etcd_download_dir"
etcd_download_dir_user: "{{ etcd_user }}"
# Groupe propriétaire du répertoire spécifié dans "etcd_download_dir"
etcd_download_dir_group: "{{ etcd_group }}"
# Répertoire pour stocker les binaires etcd
#
# IMPORTANT : Si vous utilisez la valeur par défaut pour "etcd_bin_dir" qui est
# "/usr/local/bin", alors les paramètres spécifiés dans "etcd_bin_dir_mode",
# "etcd_bin_dir_user" et "etcd_bin_dir_group" sont ignorés. Ceci est
# fait pour éviter que les permissions de "/usr/local/bin" ne soient modifiées.
# Ce répertoire existe normalement déjà dans chaque installation Linux
# et ne devrait pas être changé.
# Faites donc attention si vous spécifiez un répertoire comme "/usr/bin" ou
# "/bin" comme "etcd_bin_dir", car cela changera les permissions de
# ces répertoires, ce qui est généralement indésirable.
etcd_bin_dir: "/usr/local/bin"
# Permissions pour le répertoire de stockage des binaires etcd
etcd_bin_dir_mode: "0755"
# Propriétaire du répertoire spécifié dans "etcd_bin_dir"
etcd_bin_dir_user: "{{ etcd_user }}"
# Groupe propriétaire du répertoire spécifié dans "etcd_bin_dir"
etcd_bin_dir_group: "{{ etcd_group }}"
# Répertoire de données etcd (fichiers de base de données etcd)
etcd_data_dir: "/var/lib/etcd"
# Permissions pour le répertoire de données etcd
etcd_data_dir_mode: "0700"
# Propriétaire du répertoire spécifié dans "etcd_data_dir"
etcd_data_dir_user: "{{ etcd_user }}"
# Groupe propriétaire du répertoire spécifié dans "etcd_data_dir"
etcd_data_dir_group: "{{ etcd_group }}"
# Architecture à télécharger et à installer
etcd_architecture: "amd64"
# Ne changez cela que si l'architecture que vous utilisez n'est pas prise en charge
# Pour plus d'informations, consultez :
# https://github.com/etcd-io/website/blob/main/content/en/docs/v3.5/op-guide/supported-platform.md
etcd_allow_unsupported_archs: false
# Par défaut, la tarball etcd est téléchargée depuis le dépôt
# officiel etcd. Cela peut être changé par une URL personnalisée si nécessaire.
# Pour plus d'informations sur les protocoles
# pouvant être utilisés, voir :
# https://docs.ansible.com/ansible/latest/collections/ansible/builtin/get_url_module.html
# Il est seulement important de garder le schéma de nommage du fichier :
# "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"
# Par défaut, le fichier SHA256SUMS est utilisé pour vérifier le
# checksum de l'archive tarball. Cela peut également
# être modifié selon vos besoins.
etcd_download_url_checksum: "sha256:https://github.com/coreos/etcd/releases/download/v{{ etcd_version }}/SHA256SUMS"
# Options pour la section [Service]. Pour plus d'informations, voir :
# https://www.freedesktop.org/software/systemd/man/systemd.service.html#Options
# Les options ci-dessous "Type=notify" sont principalement des paramètres de sécurité/sandbox
# et limitent l'exposition du système aux processus de l'unité.
# 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" # Activer l'authentification de certificat client entre pairs
"client-cert-auth": "true" # Activer l'authentification de certificat client
"initial-cluster-token": "etcd-cluster-0" # Jeton de cluster initial pour le cluster etcd lors du démarrage.
"initial-cluster-state": "new" # État initial du cluster ('new' ou 'existing')
"data-dir": "{{ etcd_data_dir }}" # Répertoire de données etcd (fichiers de base de données etcd)
"wal-dir": "" # Répertoire WAL dédié ("" signifie pas de répertoire WAL séparé)
"auto-compaction-retention": "0" # Rétention d'auto-compaction en heures. 0 signifie désactiver l'auto-compaction.
"snapshot-count": "100000" # Nombre de transactions validées pour déclencher un instantané sur disque
"heartbeat-interval": "100" # Temps (en millisecondes) d'un intervalle de heartbeat
"election-timeout": "1000" # Temps (en millisecondes) pour un timeout d'élection. Voir la documentation de réglage pour plus de détails
"max-snapshots": "5" # Nombre maximal de fichiers d'instantané à conserver (0 est illimité)
"max-wals": "5" # Nombre maximal de fichiers wal à conserver (0 est illimité)
"quota-backend-bytes": "0" # Lever des alarmes lorsque la taille de l'arrière-plan dépasse le quota donné (0 par défaut à un quota d'espace faible)
"logger": "zap" # Spécifiez 'zap' pour le journal structuré ou 'capnslog'.
"log-outputs": "systemd/journal" # Spécifiez 'stdout' ou 'stderr' pour passer l'enregistrement journald même en cours d'exécution sous systemd
"enable-v2": "true" # activer l'API v2 pour rester compatible avec les versions précédentes d'etcd 3.3.x (nécessaire pour flannel par exemple)
"discovery-srv": "" # Domaine de découverte pour activer la découverte DNS SRV, laissez vide pour désactiver. Si défini, cela remplacera le cluster initial.
# Autorité de certification et fichiers de certificat pour etcd
etcd_certificates:
- ca-etcd.pem # fichier de l'autorité de certification
- ca-etcd-key.pem # fichier clé de l'autorité de certification
- cert-etcd-peer.pem # fichier de certificat TLS pour les pairs
- cert-etcd-peer-key.pem # fichier clé TLS pour les pairs
- cert-etcd-server.pem # fichier de certificat TLS pour le serveur
- cert-etcd-server-key.pem # fichier clé TLS pour le serveur
Les paramètres par défaut de etcd
définis dans etcd_settings
peuvent être remplacés en définissant une variable appelée etcd_settings_user
. Vous pouvez également ajouter des paramètres supplémentaires en utilisant cette variable. Par exemple, pour remplacer la valeur par défaut du paramètre pour log-output
et ajouter un nouveau paramètre comme grpc-keepalive-min-time
, ajoutez les paramètres suivants à group_vars/k8s.yml
:
etcd_settings_user:
"log-output": "stdout"
"grpc-keepalive-min-time": "10s"
Exemple de Playbook
- hosts: k8s_etcd
roles:
- githubixx.etcd
Tests
Ce rôle a une petite configuration de test créée en utilisant Molecule, libvirt (vagrant-libvirt) et QEMU/KVM. Veuillez consulter mon article de blog Tester des rôles Ansible avec Molecule, libvirt (vagrant-libvirt) et QEMU/KVM pour savoir comment configurer. La configuration de test est ici.
Ensuite, Molecule peut être exécuté :
molecule converge
Cela configurera trois machines virtuelles (VM) avec Ubuntu 20.04/22.04 et installera un cluster etcd
. Une petite étape de vérification est également incluse :
molecule verify
Pour nettoyer, exécutez
molecule destroy
Licence
LICENCE PUBLIQUE GÉNÉRALE GNU Version 3
Informations sur l'auteur
ansible-galaxy install githubixx.etcd