Ansible kubernetes.core.k8s模块kubeconfig路径问题求助
问题描述
执行Ansible playbook的命令:
ansible-playbook -i <ip-address>, oke.yml -vvv
对应的playbook内容:
--- - hosts: localhost remote_user: opc gather_facts: false connection: local tasks: # - name: Install Python packages for the module "kubernetes.core.k8s" # ansible.builtin.pip: # name: " {{ item }}" # loop: # - kubernetes # - PyYAML # - jsonpatch - name: Create k8s Namespace # environment: # K8S_AUTH_KUBECONFIG: /home/opc/.kube/config # K8S_AUTH_CONTEXT: context-cyxq7k7hsia kubernetes.core.k8s: api_version: v1 kind: Namespace name: test
核心问题:kubeconfig文件存放在远程主机的~/.kube/config路径,但Ansible始终在控制主机上查找该文件,导致加载kubeconfig失败,错误输出如下:
TASK [Create k8s Namespace] **************************************************************************************************************************************************************************************************************** task path: /Users/fnafey/Documents/Scripts/Terraform/TerraformWorkshop/OKE/Ansible/oke_monitoring.yml:16 <127.0.0.1> ESTABLISH LOCAL CONNECTION FOR USER: fnafey <127.0.0.1> EXEC /bin/sh -c 'echo ~fnafey && sleep 0' <127.0.0.1> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo /Users/fnafey/.ansible/tmp `"&& mkdir "` echo /Users/fnafey/.ansible/tmp/ansible-tmp-1671313489.196291-9247-116092304879285 `" && echo ansible-tmp-1671313489.196291-9247-116092304879285="` echo /Users/fnafey/.ansible/tmp/ansible-tmp-1671313489.196291-9247-116092304879285 `" ) && sleep 0' Using module file /Users/fnafey/.ansible/collections/ansible_collections/kubernetes/core/plugins/modules/k8s.py <127.0.0.1> PUT /Users/fnafey/.ansible/tmp/ansible-local-9236vjnfx02a/tmprc8yyp58 TO /Users/fnafey/.ansible/tmp/ansible-tmp-1671313489.196291-9247-116092304879285/AnsiballZ_k8s.py <127.0.0.1> EXEC /bin/sh -c 'chmod u+x /Users/fnafey/.ansible/tmp/ansible-tmp-1671313489.196291-9247-116092304879285/ /Users/fnafey/.ansible/tmp/ansible-tmp-1671313489.196291-9247-116092304879285/AnsiballZ_k8s.py && sleep 0' <127.0.0.1> EXEC /bin/sh -c '/usr/local/Cellar/ansible/6.6.0/libexec/bin/python3.10 /Users/fnafey/.ansible/tmp/ansible-tmp-1671313489.196291-9247-116092304879285/AnsiballZ_k8s.py && sleep 0' <127.0.0.1> EXEC /bin/sh -c 'rm -f -r /Users/fnafey/.ansible/tmp/ansible-tmp-1671313489.196291-9247-116092304879285/ > /dev/null 2>&1 && sleep 0' The full traceback is: File "/var/folders/4y/wn254gb10ks_xlb5y4tvn3kw0000gn/T/ansible_kubernetes.core.k8s_payload_8nq86hcx/ansible_kubernetes.core.k8s_payload.zip/ansible_collections/kubernetes/core/plugins/module_utils/common.py", line 266, in get_api_client _load_config() File "/var/folders/4y/wn254gb10ks_xlb5y4tvn3kw0000gn/T/ansible_kubernetes.core.k8s_payload_8nq86hcx/ansible_kubernetes.core.k8s_payload.zip/ansible_collections/kubernetes/core/plugins/module_utils/common.py", line 233, in _load_config kubernetes.config.load_kube_config(config_file=None, **optional_arg) File "/usr/local/Cellar/ansible/6.6.0/libexec/lib/python3.10/site-packages/kubernetes/config/kube_config.py", line 813, in load_kube_config loader = _get_kube_config_loader( File "/usr/local/Cellar/ansible/6.6.0/libexec/lib/python3.10/site-packages/kubernetes/config/kube_config.py", line 770, in _get_kube_config_loader raise ConfigException( fatal: [localhost]: FAILED! => { "changed": false, "invocation": { "module_args": { "api_key": null, "api_version": "v1", "append_hash": false, "apply": false, "ca_cert": null, "client_cert": null, "client_key": null, "context": null, "continue_on_error": false, "delete_options": null, "force": false, "generate_name": null, "host": null, "impersonate_groups": null, "impersonate_user": null, "kind": "Namespace", "kubeconfig": null, "label_selectors": null, "merge_type": null, "name": "test", "namespace": null, "no_proxy": null, "password": null, "persist_config": null, "proxy": null, "proxy_headers": null, "resource_definition": null, "server_side_apply": null, "src": null, "state": "present", "template": null, "username": null, "validate": null, "validate_certs": null, "wait": false, "wait_condition": null, "wait_sleep": 5, "wait_timeout": 120 } }, "msg": "Failed to load kubeconfig due to Invalid kube-config file. No configuration found." } PLAY RECAP ********************************************************************************************************************************************************************************************************************************* localhost : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
解决方案
问题本质是playbook的连接配置错误:connection: local强制所有任务在控制主机执行,hosts: localhost也将目标限定为控制主机,和你通过-i <ip-address>指定的远程主机完全冲突。
修改步骤如下:
- 调整主机与连接配置:将
hosts: localhost改为all(匹配你命令里指定的远程主机),移除connection: local,让Ansible默认用SSH连接远程主机 - 启用环境变量配置,明确指定远程主机上的kubeconfig路径
- 启用依赖安装任务,确保远程主机具备kubernetes模块所需的Python包
修改后的完整playbook:
--- - hosts: all remote_user: opc gather_facts: false tasks: - name: Install Python packages for kubernetes.core.k8s module ansible.builtin.pip: name: "{{ item }}" loop: - kubernetes - PyYAML - jsonpatch - name: Create k8s Namespace environment: K8S_AUTH_KUBECONFIG: /home/opc/.kube/config # 如需指定集群context,取消下面注释 # K8S_AUTH_CONTEXT: context-cyxq7k7hsia kubernetes.core.k8s: api_version: v1 kind: Namespace name: test
执行命令保持不变:
ansible-playbook -i <ip-address>, oke.yml -vvv
修改后,Ansible会通过SSH连接到目标远程主机,在远程主机上执行kubernetes模块,并读取远程主机上的kubeconfig文件完成K8S集群交互。
内容的提问来源于stack exchange,提问作者MikeKim
相关产品推荐
相关产品推荐

