С 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»