Как настроить ansible playbook, способный выполнять команды kubectl (kubernetes) - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь написать простой ansible playbook, который мог бы выполнить какую-то произвольную команду для pod (контейнера), работающего в кластере kubernetes.

Я хотел бы использовать плагин подключения kubectl: https://docs.ansible.com/ansible/latest/plugins/connection/kubectl.html но не можем понять, как это сделать на самом деле.

Пара вопросов:

  1. Нужно ли мне сначала определить инвентарь для k8s? Что-то вроде: https://docs.ansible.com/ansible/latest/plugins/inventory/k8s.html. Насколько я понимаю, я бы определил конфигурацию kube с помощью инвентаря, который будет использоваться плагином kubectl для фактического подключения к модулям для выполнения определенного действия c.
  2. Если да, есть ли какой-нибудь пример выполнения произвольной команды через плагин kubectl (но не через плагин оболочки, который вызывает kubectl на некотором удаленном компьютере - это не то, что я ищу)

Я предполагаю, что во время вызова ansible -playbook Я бы указал на инвентарь k8s.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 28 апреля 2020

Может быть, вы можете использовать как это ...

 - shell: |

     kubectl exec -i -n {{ namespace }} {{ pod_name }} -- bash -c 'clickhouse-client --query "INSERT INTO customer FORMAT CSV"
 --user=test --password=test < /mnt/azure/azure/test/test.tbl'
0 голосов
/ 29 апреля 2020

Сначала установите коллекции k8s

ansible-galaxy collection install community.kubernetes

, а вот play-book, она отсортирует все модули и выполнит команду в каждом модуле

---
- 
  hosts: localhost

  vars_files: 
    - vars/main.yaml 

  collections:
    - community.kubernetes    

  tasks:     
    -
      name: Get the pods in the specific namespace
      k8s_info:
        kubeconfig: '{{ k8s_kubeconfig }}'
        kind: Pod
        namespace: test
      register: pod_list


    - 
      name: Print pod names
      debug:
         msg: "pod_list: {{ pod_list | json_query('resources[*].status.podIP')  }} "

    - set_fact:
        pod_names: "{{pod_list|json_query('resources[*].metadata.name')}}"

    - 
      k8s_exec:
        kubeconfig: '{{ k8s_kubeconfig }}'
        namespace: "{{ namespace  }}"
        pod: "{{ item.metadata.name }}"
        command: apt update
      with_items: "{{ pod_list.resources }}"
      register: exec
      loop_control:
        label: "{{ item.metadata.name }}"
0 голосов
/ 13 января 2020

Я хотел бы использовать плагин подключения kubectl: https://docs.ansible.com/ansible/latest/plugins/connection/kubectl.html, но не могу понять, как на самом деле это сделать.

Штраф В руководстве описано, как использовать подключаемые плагины, и, хотя можно использовать в задачах , вряд ли это имеет смысл, если ваш инвентарь не запущен с модулями.

То, как я видел это используемое соединение, состоит в том, чтобы начать с определения Стручков, в отношении которых вы, возможно, захотите предпринять действие, а затем запустить сборник пьес для уникальной группы с этой целью:

- hosts: all
  tasks:
  - set_fact:
      # this is *just an example for brevity*
      # in reality you would use `k8s:` or `kubectl get -o name pods -l my-selector=my-value` to get the pod names
      pod_names:
      - nginx-12345
      - nginx-3456
  - add_host:
      name: '{{ item }}'
      groups:
      - my-pods
    with_items: '{{ pod_names }}'

- hosts: my-pods
  connection: kubectl
  tasks:
  # and now you are off to the races
  - command: ps -ef
  # watch out if the Pod doesn't have a working python installed
  # as you will have to use raw: instead
  # (and, of course, disable "gather_facts: no")
  - raw: ps -ef
...