Невозможно запустить kubectl из ansible - PullRequest
2 голосов
/ 03 апреля 2019

Я пытаюсь запустить команду kubectl из ansible.
По сути, команда скажет мне, запущен ли хотя бы один модуль из развертывания.

kubectl get deploy sample-v1-deployment -o json -n sample | jq '.status.conditions[] | select(.reason == "MinimumReplicasAvailable") | .status' | tr -d '"'

Я пытался запустить его из playbook, но получаю

Невозможно подключиться к серверу: net / http: Тайм-аут рукопожатия TLS

Это моя книга игр:

- hosts: master
  gather_facts: no
  become: true

  tasks:
    - name: test command
      shell: kubectl get deploy sample-v1-deployment -o json -n sample | jq '.status.conditions[] | select(.reason == "MinimumReplicasAvailable") | .status' | tr -d '"'
      register: result

Это вывод от ansible:

changed: [k8smaster01.test.com] => {
    "changed": true,
    "cmd": "kubectl get deploy sample-v1-deployment -o json -n sample | jq '.status.conditions[] | select(.reason == \"MinimumReplicasAvailable\") | .status' | tr -d '\"'",
    "delta": "0:00:10.507704",
    "end": "2019-04-02 20:59:17.882277",
    "invocation": {
        "module_args": {
            "_raw_params": "kubectl get deploy sample-v1-deployment -o json -n sample | jq '.status.conditions[] | select(.reason == \"MinimumReplicasAvailable\") | .status' | tr -d '\"'",
            "_uses_shell": true,
            "argv": null,
            "chdir": null,
            "creates": null,
            "executable": null,
            "removes": null,
            "stdin": null,
            "warn": true
        }
    },
    "rc": 0,
    "start": "2019-04-02 20:59:07.374573",
    "stderr": "Unable to connect to the server: net/http: TLS handshake timeout",
    "stderr_lines": [
        "Unable to connect to the server: net/http: TLS handshake timeout"
    ],
    "stdout": "",
    "stdout_lines": []
}

Я могу запустить команду вручную на главном сервере без проблем.Я также смог использовать модуль k8s для создания разных вещей в моем кластере kubernetes.
Я знаю, что на ansible есть модуль kubectl, может ли это быть проблемой?

Спасибо

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Я нашел пару обходных путей.
Одним из них было использование модуля k8s_facts

- name: Ensure running application
  k8s_facts:
    namespace: sample
    kind: Pod
    label_selectors:
      - app=sample-v1-app
  register: pod_list
  until: pod_list.resources[0].status.phase == 'Running'
  delay: 10
  retries: 3

Это просто и выполняет работы.

Вторым обходным решением было использование необработанного модуля вместо оболочки или команды

- name: Get running status
  raw: kubectl get deploy sample-v1-deployment -o json -n sample | jq -r '.status.conditions[] | select(.reason == "MinimumReplicasAvailable") | .status'

Я не уверен насчет использования raw. Это похоже на молот для простого задания.
Но чтение о модуле заставляет меня думать, что эта проблема связана с синтаксисом (кавычки, двойные кавычки, |) больше, чем сама команда.

Выполняет низкоуровневую и грязную команду SSH, не проходя через модульная подсистема. Это полезно и должно быть сделано только в нескольких случаев. Распространенным случаем является установка python в системе без python установлен по умолчанию. Другой разговаривает с любыми устройствами, такими как маршрутизаторы, на которых не установлен Python.

0 голосов
/ 03 апреля 2019

Похоже, что вы можете подключиться к своему kube-apiserver на мастере из оболочки, но не из ansible. Сообщение об ошибке указывает на различия в kubeconfig.

Вы можете видеть конечную точку kube-apiserver, настроенную на ~/.kube/config, например:

$ kubectl config view --minify -o jsonpath='{.clusters[].cluster.server}'

Обычно это что-то вроде этого: https://<servername>:6443. Вы можете попробовать запустить команду от ansible, чтобы увидеть, если вы получите тот же kube-apiserver.

Еще одна вещь, которую вы можете попробовать, это вывести значение переменной KUBECONFIG env из ansible, чтобы увидеть, установлено ли для нее значение, отличное от ~/.kube/config

Надеюсь, это поможет!

...