Управление конфигурацией Kubernetes с Ansible (часть 2)
Продолжение этого поста. Мы объяснили организацию каталогов и манифестные файлы, на которых можно назвать монастырь … Помечено с помощью Ansible, DevOps, Kubernetes, автоматизации.
Управление конфигурацией на Kubernetes с Ansible (серия 2 частей)
Продолжение этого поста. Мы объяснили организацию каталогов и Конвенцию о именовании Manifest Files, теперь давайте рассмотрим Ansible Part.
Ansible был выбран, потому что я знал это немного с 2015 года, когда я начал автоматизировать некоторые повторяющиеся задачи для создания прототипа кластера Kafka. Ansible — хороший кандидат, потому что он может поговорить с HTTP API, и он поставляется со списком K8s Связанные модули, которые облегчают запрос или управление объектами Kubernetes (они были переписаны за пару раз, прежде чем теперь были действительно хорошими).
Обзор кода
Я не планирую просматривать весь код, но смотрю ключевые части Ansible Code.
Кластер принимает параметр, который является целевым кластером, затем загружаем файл общих переменных, затем файл переменной кластера из конфигурация каталог
---
- name: "Deploy manifests on cluster {{ target_cluster }}"
connection: local
gather_facts: false
vars:
authorized_cluster: ["dev", "prod"]
hosts: localhost
pre_tasks:
- name: Check if the target_cluster variable was properly set
fail:
msg: "You need to specify the variable target_cluster with one value ({{ authorized_cluster }})"
when: target_cluster not in authorized_cluster
- name: Load common variables
include_vars:
file: configs/common.yml
- name: "Load cluster-scoped variables for {{ target_cluster }}"
include_vars:
file: "config/{{ target_cluster }}.yml"
Для данного кластера мы создаем список всех файлов YAML из общий и $ cluster каталоги. Мы также определим некоторые переменные, чем будут использоваться позже
Теперь мы проверяем каждый файл честь соглашения о имени файла, иначе мы бросаем ошибку.
- name: "Check files match the naming convention"
fail:
msg: >
The file {{ item.filepath }} does not observe the manifest naming convention.
when: item.filename == item.kind or
item.filename == item.name or
item.filename == item.namespace or
item.state not in [ "present", "absent" ]
with_items:
- "{{ manifests_information }}"
loop_control:
label: "{{ item.filepath }}"
Для каждого файла позвоните в K8s Модуль, путь файла передается в аргумент, используя Шаблон плагина Lookup , поэтому манифест может иметь логику и переменные внутри.
Но вы также можете использовать такие функции, как переменные Ansible и шаблон Jinja вместе. Например, мне пришлось поместить файл конфигурации в секрет, который требует кодировки базы контента64. Это удобно, когда вы можете сделать это автоматически.
В этом примере контент для ключа fluent.conf прийти из файла fluent.conf.j2 загружено Шаблон Поиск (поэтому переменная заменяется) затем передается в фильтр b64encode Анкет
# fluent.conf.j2
# As this file is interpreted as a ansible template, you can add
# jinja code inside to put some logic.
@type forward
port 24224
tag logs.openshift
# Send all types to Splunk
@type splunk_hec
hec_host {{ splunk.host }}
hec_port {{ splunk.port }}
hec_token {{ splunk.token }}
index {{ splunk.index }}
… То, что ожидает секретного API. Поэтому я думаю, что у нас сейчас все хорошо, я просто хотел дать вам представление о том, что можно сделать. Это скелет, который может быть улучшен с помощью большей проверки и функции.
Возможно, я вернусь с новой идеей.
Управление конфигурацией на Kubernetes с Ansible (серия 2 частей)