无法从ansible运行kubectl

时间:2019-04-03 02:05:35

标签: kubernetes ansible kubectl

我正在尝试从ansible运行kubectl命令。
基本上,该命令会告诉我是否至少有一个Pod正在某个部署中运行。

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

我试图从剧本中运行它,但是我得到了

  

无法连接到服务器: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 个答案:

答案 0 :(得分:1)

我找到了两种解决方法。
一种是使用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

这很简单,可以完成工作。

第二种解决方法是使用原始模块而不是shell或命令

- 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的路由器。

答案 1 :(得分:0)

看起来您可以从外壳(而不是从ansible)连接到主服务器上的kube-apiserver。错误消息指示kubeconfig中的差异。

您可以看到在~/.kube/config上配置的kube-apiserver端点,如下所示:

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

通常是这样的:https://<servername>:6443。您可以尝试从ansible运行命令,看看是否获得相同的kube-apiserver。

您可以尝试的另一种方法是从ansible打印KUBECONFIG env变量的值,以查看它是否设置为与~/.kube/config不同的内容

希望有帮助!