我正在尝试从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模块,这可能是问题吗?
谢谢
答案 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
不同的内容
希望有帮助!