Вопрос или проблема
Мне нужно обновить мои рабочие узлы 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
Подробное объяснение:
-
Получение списка узлов:
В первой задаче используется модульkubernetes.core.k8s_info
для получения информации обо всех узлах Kubernetes. Результат сохраняется в переменнойnode_list
. -
Фильтрация Worker узлов:
На втором этапе формируется запрос с помощьюjson_query
, который фильтрует узлы Kubernetes, оставляя только те, которые имеют ярлыкnode-role.kubernetes.io/worker
. Это обеспечит, что патч будет применён только к рабочим узлам. -
Цикл по узлам:
В третьей задаче используется модульcommand
для выполнения командыkubectl patch node
. Команда выполняется для каждого элемента из списка заведомо фильтрованных узлов. Обратите внимание на то, что вы должны заменитьyour_annotation_key
иyour_annotation_value
на реальные ключи и значения аннотаций, которые вы хотите установить. -
Проверка на наличие узлов:
Условиеwhen: worker_nodes.resources | length > 0
гарантирует, что команда будет выполнена только в случае наличия рабочих узлов, что предотвратит ошибку выполнения, если таких узлов нет.
Заключение
Эта структура сценария обеспечит корректное выполнение патчей на рабочих узлах Kubernetes, применяя заданные аннотации к каждому узлу с помощью Ansible. Убедитесь, что у вас установлены все необходимые зависимости и правильно настроены права доступа к вашему классу Kubernetes, прежде чем запускать этот сценарий.