Цикл Ansible по всем узлам Woker

Вопрос или проблема

Мне нужно обновить мои рабочие узлы Kubernetes с правильными аннотациями, и у меня есть следующий скрипт:

---
  - hosts: all
    gather_facts: false
    remote_user: opc
    environment: 
      KUBECONFIG: "/home/opc/.kube/config"
      PATH: "/usr/local/bin:/usr/bin"
      OCI_CLI_AUTH: instance_principal

    tasks:
      - name: Получить список всех узлов
        kubernetes.core.k8s_info:
          kind: node
        register: node_list

      - name: Отобразить имя k8s рабочего узла
        debug:
          var: node_list | json_query(query)
        vars:
          query: 'resources[].{name: metadata.name}'
        register: node

Скрипт работает нормально и выводит следующий результат:

TASK [Отобразить имя k8s рабочего узла] ***********************************************
ok: [40.233.80.218] => {
"node_list | json_query(query)": [
     {
      "name": "172.16.107.244"
     },
     {
     ]"name": "172.16.111.95"
     }
]
}

Мне нужно взять имена двух хостов и выполнить команду kubectl patch node {{name}} на обоих. Нужна идея для цикла, чтобы выполнить команду локально с хоста Ansible.

Ответ или решение

Чтобы успешно выполнить обновление аннотаций на Kubernetes Worker узлах с использованием Ansible, вы можете доработать уже существующий сценарий. Вам нужно будет создать цикл для обработки каждого узла, полученного на предыдущем этапе, и выполнить команду kubectl patch node для каждого из них. Вот как это можно сделать, опираясь на предоставленный код и запрос:

---
- hosts: all
  gather_facts: false
  remote_user: opc
  environment:
    KUBECONFIG: "/home/opc/.kube/config"
    PATH: "/usr/local/bin:/usr/bin"
    OCI_CLI_AUTH: instance_principal

  tasks:
    - name: Получить список всех узлов
      kubernetes.core.k8s_info:
        kind: node
      register: node_list

    - name: Вывести имена Worker узлов
      debug:
        var: node_list.resources | json_query(query)
      vars:
        query: 'resources[?contains(metadata.labels."node-role.kubernetes.io/worker", `""`)].{name: metadata.name}'
      register: worker_nodes

    - name: Патчнуть узлы
      command: kubectl patch node {{ item.name }} --type='json' -p='[{"op": "add", "path": "/metadata/annotations/your_annotation_key", "value": "your_annotation_value"}]'
      loop: "{{ worker_nodes.resources }}"
      when: worker_nodes.resources | length > 0

Подробное объяснение:

  1. Получение списка узлов:
    В первой задаче используется модуль kubernetes.core.k8s_info для получения информации обо всех узлах Kubernetes. Результат сохраняется в переменной node_list.

  2. Фильтрация Worker узлов:
    На втором этапе формируется запрос с помощью json_query, который фильтрует узлы Kubernetes, оставляя только те, которые имеют ярлык node-role.kubernetes.io/worker. Это обеспечит, что патч будет применён только к рабочим узлам.

  3. Цикл по узлам:
    В третьей задаче используется модуль command для выполнения команды kubectl patch node. Команда выполняется для каждого элемента из списка заведомо фильтрованных узлов. Обратите внимание на то, что вы должны заменить your_annotation_key и your_annotation_value на реальные ключи и значения аннотаций, которые вы хотите установить.

  4. Проверка на наличие узлов:
    Условие when: worker_nodes.resources | length > 0 гарантирует, что команда будет выполнена только в случае наличия рабочих узлов, что предотвратит ошибку выполнения, если таких узлов нет.

Заключение

Эта структура сценария обеспечит корректное выполнение патчей на рабочих узлах Kubernetes, применяя заданные аннотации к каждому узлу с помощью Ansible. Убедитесь, что у вас установлены все необходимые зависимости и правильно настроены права доступа к вашему классу Kubernetes, прежде чем запускать этот сценарий.

Оцените материал
Добавить комментарий

Капча загружается...