Вопрос или проблема
Мне нужно обновить рабочие узлы 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
Объяснение шагов
-
Сбор информации о узлах: Мы используем модуль
kubernetes.core.k8s_info
для получения списка всех узлов Kubernetes. Этот шаг был сохранен из вашего первоначального кода. -
Фильтрация рабочих узлов: В переменной
query
мы изменили условие, чтобы получить только узлы, которые находятся в состоянии "Ready". Это важно, чтобы избежать попытки изменить узлы, которые в данный момент недоступны. -
Патчинг узлов: Мы добавили задачу, использующую Ansible модуль
command
, чтобы выполнять командуkubectl patch
на каждом узле. В качестве параметра цикла у нас используется список названий узловnode_names.results
. -
Условия выполнения: Перед выполнением патча мы проверяем, что результаты фильтрации узлов определены и что их количество больше нуля, чтобы избежать выполнения команды на пустом списке.
Учитываемая информация по безопасности
При использовании Ansible для управления Kubernetes важно учитывать безопасность. Используйте переменные окружения и конфигурационные файлы для хранения конфиденциальных данных, таких как токены доступа.
Заключение
Этот playbook обеспечивает патчинг аннотаций на всех Worker-узлах Kubernetes, что является важной задачей для администраторов систем. Корректное использование Ansible позволяет автоматизировать процессы управления, минимизируя возможность ошибок и повышая эффективность администрирования Kubernetes-кластера.