Цикл Ansible по всем рабочим узлам

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

Мне нужно обновить рабочие узлы 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.

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

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

Полный сценарий Ansible для патча узлов

Вот переработанный фрагмент вашего playbook, который включает цикл для выполнения команды патча на каждом Worker-узле:

---
- hosts: localhost  # Изменяем на localhost, так как команды kubectl будут выполняться с Ansible хоста
  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: Get a list of all the nodes
      kubernetes.core.k8s_info:
        kind: node
      register: node_list

    - name: Display k8s Worker Node Names
      debug:
        var: node_list.resources | json_query(query)
      vars:
        query: 'resources[?status.conditions[?type==`Ready` && status==`True`]].{name: metadata.name}'
      register: node_names

    - name: Patch each Worker Node
      command: kubectl patch node {{ item.name }} --patch '{"metadata": {"annotations": {"example.com/annotation": "value"}}}'
      loop: "{{ node_names.results }}"
      when: node_names.results is defined and node_names.results | length > 0

Объяснение шагов

  1. Сбор информации о узлах: Мы используем модуль kubernetes.core.k8s_info для получения списка всех узлов Kubernetes. Этот шаг был сохранен из вашего первоначального кода.

  2. Фильтрация рабочих узлов: В переменной query мы изменили условие, чтобы получить только узлы, которые находятся в состоянии "Ready". Это важно, чтобы избежать попытки изменить узлы, которые в данный момент недоступны.

  3. Патчинг узлов: Мы добавили задачу, использующую Ansible модуль command, чтобы выполнять команду kubectl patch на каждом узле. В качестве параметра цикла у нас используется список названий узлов node_names.results.

  4. Условия выполнения: Перед выполнением патча мы проверяем, что результаты фильтрации узлов определены и что их количество больше нуля, чтобы избежать выполнения команды на пустом списке.

Учитываемая информация по безопасности

При использовании Ansible для управления Kubernetes важно учитывать безопасность. Используйте переменные окружения и конфигурационные файлы для хранения конфиденциальных данных, таких как токены доступа.

Заключение

Этот playbook обеспечивает патчинг аннотаций на всех Worker-узлах Kubernetes, что является важной задачей для администраторов систем. Корректное использование Ansible позволяет автоматизировать процессы управления, минимизируя возможность ошибок и повышая эффективность администрирования Kubernetes-кластера.

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

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