Рубрики
Uncategorized

Управление конфигурацией 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: "Retrieve manifests files from common and {{ cluster }} directories"
  find:
    paths: ["{{ yaml_dir }}/common", "{{ yaml_dir }}/{{ cluster }}"]
    patterns: ['*.yaml', '*.yml']
    file_type: file
    recurse: true
  register: manifests_list

- name: "Define variable from manifests filename"
  vars:
    filename: "{{ item.path | basename }}"
    kind: "{{ item.path | basename | regex_replace('.*_(.*)_.*_.*_.*\\.ya?ml', '\\1') }}"
    name: "{{ item.path | basename | regex_replace('.*_.*_(.*)_.*_.*\\.ya?ml', '\\1') }}"
    namespace: "{{ item.path | basename | regex_replace('.*_.*_.*_(.*)_.*\\.ya?ml', '\\1') }}"
    state: "{{ item.path | basename | regex_replace('.*_.*_.*_.*_(.*)\\.ya?ml', '\\1') }}"

  set_fact:
    manifests_information: "{{ manifests_information + [{ 'filepath': item.path, 'filename': filename, 'kind': kind, 'name': name, 'namespace': namespace, 'state': state }] }}"
  loop: "{{ manifests_list.files | sort(attribute='path') }}"
  loop_control:
    label: "{{ filename }}"
  • Теперь мы проверяем каждый файл честь соглашения о имени файла, иначе мы бросаем ошибку.
- 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 , поэтому манифест может иметь логику и переменные внутри.
---
- name: "Deploy {{ item.kind }} {{ item.name }} on namespace {{ item.namespace }} to {{ item.state }}"
  k8s:
    host: "https://xxxxxx:6443"
    api_key: "{{ token }}"
    state: "{{ item.state }}"
    definition: "{{ lookup ('template', item.filepath) }}"

Для кода, который мы сделали, для урезанной версии для работы не требуется много, чем для работы.

Кодируя ваши манифесты

Одна из функций, которые позволяет эта небольшая пьеса, состоит в том, чтобы иметь простой манифестный файл yaml, как этот

---
apiVersion: project.openshift.io/v1
kind: Project
metadata:
  name: "{{ cluster-admin-ns }}"
...

Но вы также можете использовать такие функции, как переменные Ansible и шаблон Jinja вместе. Например, мне пришлось поместить файл конфигурации в секрет, который требует кодировки базы контента64. Это удобно, когда вы можете сделать это автоматически.

  • В этом примере контент для ключа fluent.conf прийти из файла fluent.conf.j2 загружено Шаблон Поиск (поэтому переменная заменяется) затем передается в фильтр b64encode Анкет
---
apiVersion: v1
data:
  fluent.conf: "{{ lookup('template', 'fluent.conf.j2') | b64encode }}"
kind: secret
metadata:
  name: fluent-forwarder-secret
  namespace: logging
...

с файлом конфигурации, обработанным как шаблон

# 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 }}

так что он когда -то загружал что -то вроде

apiVersion: v1
data:
  fluent.conf: IyBmbHVlbnQuY29uZi5qMgojIEFzIHRoaXMgZmlsZSBpcyBpbnRlcnByZXRlZCBhcyBhIGFuc2libGUgdGVtcGxhdGUsIHlvdSBjYW4gYWRkCiMgamluamEgY29kZSBpbnNpZGUgdG8gcHV0IHNvbWUgbG9naWMuCgo8c291cmNlPgogIEB0eXBlICBmb3J3YXJkCiAgcG9ydCAgMjQyMjQKICB0YWcgbG9ncy5vcGVuc2hpZnQKPC9zb3VyY2U+Cgo8bWF0Y2ggKio+CiAgIyBTZW5kIGFsbCB0eXBlcyB0byBTcGx1bmsKICBAdHlwZSBzcGx1bmtfaGVjCiAgaGVjX2hvc3Qgc3BsdW5rLmRvbS50bGQKICBoZWNfcG9ydCA4MDg5CiAgaGVjX3Rva2VuIDM1NDM0My0zNDUzMzMtMTUyMzMKICBpbmRleCBmYWtlLWluZGV4CjwvbWF0Y2g+
kind: Secret

… То, что ожидает секретного API. Поэтому я думаю, что у нас сейчас все хорошо, я просто хотел дать вам представление о том, что можно сделать. Это скелет, который может быть улучшен с помощью большей проверки и функции.

Возможно, я вернусь с новой идеей.

Управление конфигурацией на Kubernetes с Ansible (серия 2 частей)

Оригинал: «https://dev.to/baptistemm/kubernetes-configuration-management-with-ansible-part-2-4bep»