С 0 -го дня я начал управлять OpenShift в прошлом году, одной из основных вещей, которые я хотел, мы занимаемся командой, было то, как управлять всей настройкой, которую мы должны были бы сделать. Я привык к программному обеспечению для автоматизации, от сценариев с голой оболочки (да, это автоматизация:) для таких вещей, как Puppet, Cfengine или Ansible, и я не могу себе представить, что сейчас управляет приложением, парком узлов, кластер, не имея возможности автоматизировать развертывание конфигурации.
Поэтому я делюсь здесь — не подробно — что мы сделали в нашей команде. Я разделил объяснение в нескольких постах. Это довольно просто, но эффективно, мы недавно начали регулярно запускать это задание из AWX в контрольном режиме, чтобы наблюдать дрейф конфигурации и рано или поздно запустить его в режиме запуска.
Установить план
Мы начали делать некоторый статус и требования к коллегам (это всегда важно это сделать)
- Мы будем управлять несколькими кластерами.
- Большая часть конфигурации кластеров будет одинаковой для всех кластеров.
- Мы должны быть в состоянии развернуть для каждого кластера некоторые конкретные манифесты
- Те же самые манифесты будут развернуты на нескольких кластерах, но могут немного отличаться (например, значения квот), и мы не хотим хранить все эти проявления только ради разных значений внутри. Таким образом, мы должны быть в состоянии иметь заполнителя в манифестах, которые будут заполнены каждым кластером.
- Мы должны быть в состоянии добавить манифесты, а также удалить манифесты из кластера.
Структура каталога
Вот пример структуры мы выбрали
project-dir ├── config │ ├── common.yml │ ├── dev.yml │ └── prod.yml └── manifests ├── common │ ├── 05_authentication │ ├── 10_feature_foo │ └── 30_feature_baz ├── dev │ ├── 40_feature_dev_buz │ └── 60_feature_dev_buu └── prod ├── 50_feature_prod_bar └── 70_feature_prod_boo
Каталог конфигурация
Содержит файл YAML для каждого кластера, с деталями соединения и всеми конкретными переменными, файл Common.yml
Содержит общие и по умолчанию переменные.
# prod config file connection: - url: https://prd.prj.domain.tld token: !vault.... ldap_connection: - bind_user: cn=ldap-prd-user,... bind_password: !vault... authorized_groups: - group-dev-1 - group-dev-2 - group-dev-3 # other prod specific variables
Конвенция об именах файлов
Мы думаем о соглашении о именовании для манифестных файлов, не то, чтобы оно обеспечило соблюдение содержимого в файле (исключение, сделанное в поле Статус
Мы придумали Конвенцию Xx_kind_name_namespace_status.yml
куда
XX
это число, на которое помогает применять манифест в определенном порядке.добрый
это вид манифеста (развертывание
,configmap
, …).имя
это значение файлаMetadata.name
объекта, который будет изменен.Пространство имен
это пространство имен, к которому принадлежит объект. Если объект не намечен на имена, как пространство имен или кластеррол, мы устанавливаем значение наГлобал
АнкетСтатус
имеет либо значениенастоящий
чтобы убедиться, что он существует илиотсутствует
чтобы убедиться, что его не существует. Это значение во имя файла будет для модуляK8s
и будет обеспечивать состояние манифеста.
Несколько примеров
Чтобы лучше понять, как это работает, дайте взглянуть
- Манифестный файл для создания пространства имен
FOOBAR
будет назван10_namespace_foobar_global_present.yml
- Развертывание с именем Fluentd в пространстве имен
кластер-логинг
будет назван30_deployment_fluentd_cluster-logging_present.yml
- Манифест, чтобы удалить
configmap
названныйMy-Config
в пространстве именdev-hideout
будет названXx_configmap_my-config_dev-hideouts_absent.yml
Теперь у нас был обзор структуры проекта, следующий пост объяснит Ansible Playbook.
Оригинал: «https://dev.to/baptistemm/kubernetes-configuration-management-with-ansible-part-1-4aem»