etcd
ansible-role-etcd
Эта роль Ansible используется в Kubernetes не так сложно с Ansible - кластер etcd. Но, конечно, ее можно использовать и без кластера Kubernetes.
Устанавливает кластер etcd. ПОДСКАЗКА: Этот плейбук не перезагружает или не перезапускает процессы кластера etcd после изменения файла сервиса systemd! Это сделано намеренно! Одновременно перезапускать все процессы etcd - очень плохая идея. Поэтому, если файл etcd.service
изменен, перезагружайте/перезапускайте etcd вручную, по одному узлу за раз и проверяйте вывод журнала, чтобы убедиться, что узел снова присоединился к кластеру! Конечно, этот процесс можно автоматизировать, но в данный момент он не входит в эту роль. В качестве дополнительной информации: скрипт выполнит systemctl daemon-reload
после изменения файла сервиса etcd, так что, по крайней мере, systemd будет знать о измененном файле, и вам не нужно об этом беспокоиться. Таким образом, перезагрузка узла etcd также активирует новую конфигурацию.
Обновление кластера etcd, установленного с помощью этой роли, описывается здесь.
Версии
Я помечаю каждую версию и стараюсь придерживаться семантического версионирования. Если вы хотите использовать роль, я рекомендую обратить внимание на последнюю метку. Основная ветка - это в основном разработка, в то время как метки обозначают стабильные версии. Метка 13.1.1+3.5.13
означает, что это версия 13.1.1
этой роли, и она предназначена для использования с версией etcd 3.5.13
(но должна работать и с более новыми версиями). Если сама роль изменится, то X.Y.Z
перед +
увеличится. Если изменится версия etcd, то X.Y.Z
после +
увеличится. Это позволяет помечать исправления ошибок и новые основные версии роли, пока она все еще разрабатывается для конкретного релиза etcd.
Журнал изменений
Смотрите CHANGELOG.md
Требования
Эта роль требует, чтобы вы уже создали некоторые сертификаты для etcd
(см. Kubernetes не так сложно с Ansible - Центр сертификации (CA) и роль Ansible kubernetes_ca). Плейбук ищет сертификаты в etcd_ca_conf_directory
на хосте, где запускается этот плейбук. Конечно, вы можете создать сертификаты самостоятельно (см. Генерация самоподписанных сертификатов - репозиторий Git архивирован, но информация все еще актуальна).
Переменные роли
# Директория, откуда копируются сертификаты etcd. По умолчанию это
# будет расширяться до локальной папки пользователя $HOME (пользователя, который запускает "ansible-playbook ..."
# плюс "/etcd-certificates". Это означает, что если домашняя папка пользователя, например,
# "/home/da_user", то "etcd_ca_conf_directory" будет иметь значение
# "/home/da_user/etcd-certificates".
etcd_ca_conf_directory: "{{ '~/etcd-certificates' | expanduser }}"
# Ansible-группа etcd
etcd_ansible_group: "k8s_etcd"
# Версия etcd
etcd_version: "3.5.13"
# Порт, на котором etcd слушает клиентов
etcd_client_port: "2379"
# Порт, на котором etcd слушает своих соседей
etcd_peer_port: "2380"
# Интерфейс для привязки портов etcd
etcd_interface: "tap0"
# Запуск демона etcd от имени этого пользователя.
#
# Примечание 1: Если вы хотите использовать "etcd_peer_port" < 1024, вам скорее всего нужно
# запускать "etcd" от имени пользователя "root".
# Примечание 2: Если указанный пользователь в "etcd_user" не существует, то роль
# его создаст. Только если пользователь уже существует, роль его не создаст,
# но изменит его UID/GID и оболочку, если указано (см. настройки ниже).
# Кроме того, если "etcd_user" равен "root", то эта роль не будет взаимодействовать с пользователем.
etcd_user: "etcd"
# UID пользователя, указанного в "etcd_user". Если не указано, будет взят следующий доступный
# UID из "/etc/login.defs" (см. настройку "SYS_UID_MAX").
# etcd_user_uid: "999"
# Оболочка для указанного пользователя в "etcd_user". Для повышения безопасности сохраняйте
# значение по умолчанию.
etcd_user_shell: "/bin/false"
# Указывает, будет ли пользователь, указанный в "etcd_user", системным пользователем (по умолчанию)
# или нет. Если "true", настройка "etcd_user_home" будет игнорироваться. В общем
# имеет смысл оставить значение по умолчанию, так как нет необходимости входить, как
# пользователь, который запускает "etcd".
etcd_user_system: true
# Домашняя директория пользователя, указанного в "etcd_user". Будет игнорироваться, если
# "etcd_user_system" установлено в "true". В этом случае домашняя директория не будет
# создана. Обычно не требуется.
# etcd_user_home: "/home/etcd"
# Запуск демона etcd от имени этой группы
#
# Примечание: Если группа, указанная в "etcd_group", не существует, то роль
# создаст ее. Только если группа уже существует, роль ее не создаст,
# но скорректирует GID, если указано в "etcd_group_gid" (см. настройку ниже).
etcd_group: "etcd"
# GID группы, указанной в "etcd_group". Если не указано, будет взят следующий доступный
# GID из "/etc/login.defs" (см. настройку "SYS_GID_MAX").
# etcd_group_gid: "999"
# Указывает, будет ли группа, указанная в "etcd_group", системной группой (по умолчанию)
# или нет.
etcd_group_system: true
# Директория для конфигурации etcd
etcd_conf_dir: "/etc/etcd"
# Права доступа для директории конфигурации etcd
etcd_conf_dir_mode: "0750"
# Владелец директории, указанной в "etcd_conf_dir"
etcd_conf_dir_user: "root"
# Группа-владелец директории, указанной в "etcd_conf_dir"
etcd_conf_dir_group: "{{ etcd_group }}"
# Директория для хранения загруженного архива etcd
# Не должна удаляться, чтобы избежать повторной загрузки
etcd_download_dir: "/opt/etcd"
# Права доступа для директории хранения загруженного архива etcd
etcd_download_dir_mode: "0755"
# Владелец директории, указанной в "etcd_download_dir"
etcd_download_dir_user: "{{ etcd_user }}"
# Группа-владелец директории, указанной в "etcd_download_dir"
etcd_download_dir_group: "{{ etcd_group }}"
# Директория для хранения бинарников etcd
#
# ВАЖНО: Если вы используете значение по умолчанию для "etcd_bin_dir", которое равно
# "/usr/local/bin", тогда настройки, указанные в "etcd_bin_dir_mode",
# "etcd_bin_dir_user" и "etcd_bin_dir_group", игнорируются. Это
# сделано, чтобы предотвратить изменение прав доступа директории "/usr/local/bin".
# Эта директория обычно уже существует на всех установках Linux
# и не должна изменяться.
# Поэтому, пожалуйста, будьте осторожны, если вы указываете директорию как "/usr/bin" или
# "/bin" в качестве "etcd_bin_dir", так как это изменит права доступа этих директорий, и этого обычно не требуется.
etcd_bin_dir: "/usr/local/bin"
# Права доступа для директории хранения бинарников etcd
etcd_bin_dir_mode: "0755"
# Владелец директории, указанной в "etcd_bin_dir"
etcd_bin_dir_user: "{{ etcd_user }}"
# Группа-владелец директории, указанной в "etcd_bin_dir"
etcd_bin_dir_group: "{{ etcd_group }}"
# Директория данных etcd (файлы базы данных etcd)
etcd_data_dir: "/var/lib/etcd"
# Права доступа для директории хранения данных etcd
etcd_data_dir_mode: "0700"
# Владелец директории, указанной в "etcd_data_dir"
etcd_data_dir_user: "{{ etcd_user }}"
# Группа-владелец директории, указанной в "etcd_data_dir"
etcd_data_dir_group: "{{ etcd_group }}"
# Архитектура для загрузки и установки
etcd_architecture: "amd64"
# Меняйте это только если используемая вами архитектура не поддерживается
# Для получения дополнительной информации смотрите:
# https://github.com/etcd-io/website/blob/main/content/en/docs/v3.5/op-guide/supported-platform.md
etcd_allow_unsupported_archs: false
# По умолчанию, архив etcd загружается из официального
# репозитория etcd. Это можно изменить на свой собственный
# URL, если необходимо. Для получения дополнительной информации о протоколах,
# которые можно использовать, смотрите:
# https://docs.ansible.com/ansible/latest/collections/ansible/builtin/get_url_module.html
# Важно сохранить схему именования файла:
# "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"
# По умолчанию используется файл SHA256SUMS для проверки
# контрольной суммы архива tarball. Это также можно
# изменить на ваши нужды.
etcd_download_url_checksum: "sha256:https://github.com/coreos/etcd/releases/download/v{{ etcd_version }}/SHA256SUMS"
# Параметры для секции [Service]. Для получения дополнительной информации смотрите:
# https://www.freedesktop.org/software/systemd/man/systemd.service.html#Options
# Параметры ниже "Type=notify" в основном связаны с безопасностью/песочницей
# и ограничивают доступ системы к процессам юнита.
# 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" # Включить аутентификацию сертификата клиента для пиров
"client-cert-auth": "true" # Включить аутентификацию сертификата клиента
"initial-cluster-token": "etcd-cluster-0" # Начальный токен кластера для кластера etcd при начальной настройке.
"initial-cluster-state": "new" # Начальное состояние кластера ('new' или 'existing')
"data-dir": "{{ etcd_data_dir }}" # Директория данных etcd (файлы базы данных etcd)
"wal-dir": "" # Выделенная директория WAL ("" означает отсутствие отдельной директории WAL)
"auto-compaction-retention": "0" # Время хранения авто сжатия в часах. 0 означает отключение авто сжатия.
"snapshot-count": "100000" # Число подтвержденных транзакций для триггера создания снимка на диск
"heartbeat-interval": "100" # Время (в миллисекундах) интервала опроса
"election-timeout": "1000" # Время (в миллисекундах) для ожидания выборов. См. документацию по настройке для деталей
"max-snapshots": "5" # Максимальное количество файлов снимков для хранения (0 - неограничено)
"max-wals": "5" # Максимальное количество файлов WAL для хранения (0 - неограничено)
"quota-backend-bytes": "0" # Поднять тревогу, когда размер бэкенда превышает установленную квоту (0 по умолчанию означает низкую квоту места)
"logger": "zap" # Указать 'zap' для структурированного логирования или 'capnslog'.
"log-outputs": "systemd/journal" # Указать 'stdout' или 'stderr', чтобы пропустить ведение журнала journald, даже когда работает под systemd
"enable-v2": "true" # включить v2 API, чтобы оставаться совместимым с предыдущим etcd 3.3.x (например, необходимо для flannel)
"discovery-srv": "" # Домен обнаружения для включения DNS SRV обнаружения, оставить пустым, чтобы отключить. Если установлено, переопределяет начальный кластер.
# Сертификаты и файлы сертификатов для etcd
etcd_certificates:
- ca-etcd.pem # файл центра сертификации
- ca-etcd-key.pem # ключ центра сертификации
- cert-etcd-peer.pem # сертификат TLS для пиров
- cert-etcd-peer-key.pem # ключ TLS для пиров
- cert-etcd-server.pem # сертификат TLS для сервера
- cert-etcd-server-key.pem # ключ TLS для сервера
Настройки etcd по умолчанию, определенные в etcd_settings
, можно переопределить, определив переменную с именем etcd_settings_user
. Вы также можете добавить дополнительные настройки, используя эту переменную. Например, чтобы переопределить значение по умолчанию для настройки log-output
и добавить новую настройку, такую как grpc-keepalive-min-time
, добавьте следующие настройки в group_vars/k8s.yml
:
etcd_settings_user:
"log-output": "stdout"
"grpc-keepalive-min-time": "10s"
Пример плейбука
- hosts: k8s_etcd
roles:
- githubixx.etcd
Тестирование
Эта роль имеет небольшую тестовую конфигурацию, которая создается с помощью Molecule, libvirt (vagrant-libvirt) и QEMU/KVM. Пожалуйста, смотрите мой блог Тестирование ролей Ansible с помощью Molecule, libvirt (vagrant-libvirt) и QEMU/KVM, чтобы узнать, как настроить. Тестовая конфигурация здесь.
После этого Molecule можно выполнить:
molecule converge
Это создаст три виртуальные машины (VM) с Ubuntu 20.04/22.04 и установит кластер etcd
. Также включен небольшой шаг верификации:
molecule verify
Чтобы выполнить очистку, запустите
molecule destroy
Лицензия
GNU GENERAL PUBLIC LICENSE версия 3
Информация об авторе
ansible-galaxy install githubixx/ansible-role-etcd