如何在Ansible中检索已创建的Google Kubernetes(GKE)集群的凭据?

如何在Ansible中检索已创建的Google Kubernetes(GKE)集群的凭据?,kubernetes,ansible,google-kubernetes-engine,gcloud,Kubernetes,Ansible,Google Kubernetes Engine,Gcloud,我正在使用创建群集和节点池 - name: "Create Google Kubernetes Engine Cluster to be setup with with kubectl" gcp_container_cluster: name: "{{cluster_name}}" project: "{{project_id}}" auth_kind: "serviceaccount"

我正在使用创建群集和节点池

- name: "Create Google Kubernetes Engine Cluster to be setup with with kubectl"
  gcp_container_cluster:
    name: "{{cluster_name}}"
    project: "{{project_id}}"
    auth_kind: "serviceaccount"
    location: "{{cluster_location}}"
    logging_service: "none"
    monitoring_service: "none"
    service_account_contents: "{{service_account_contents}}"
    initial_node_count: 1
  register: cluster
- name: "Create node pool for system pods"
  gcp_container_node_pool:
    name: "default-pool"
    project: "{{project_id}}"
    cluster: "{{ cluster }}"
    auth_kind: "serviceaccount"
    location: "{{cluster_location}}"
    autoscaling:
      enabled: "no"
    initial_node_count: 1
    service_account_contents: "{{service_account_contents}}"
    config:
      machine_type: "g1-small"
      disk_size_gb: 25
      preemptible: "no"
    management:
      auto_repair: "yes"
      auto_upgrade: "yes"
这很好,但是我找不到关于如何对使用Ansible
k8s
模块执行的
kubectl
命令进行身份验证并获得授权的信息

首先,文档在措辞和示例方面都没有帮助。我没有找到任何指南、博客或其他内容,感觉我是第一个使用Ansible执行此任务的人。我仔细检查了返回的集群对象(与上面的
register
一起存储),但没有找到任何合适的对象。这适用于
gcp\u容器\u集群
gcp\u容器\u集群信息

据我所知,我需要通过Ansible模块获得kubeconfig,我可以在k8s模块中使用该模块,就像我使用
gcloud容器集群获取凭据一样。在使用Ansible中的shell命令之前,我想先看看是否有内置方法


我正在Ubuntu 20.04上使用Ansible 2.9.10。

当您使用
gcp\u容器\u集群创建集群时,返回值将包括。您可以使用带有{{cluster.kubectlPath}的示例引用此路径

当您要使用
k8s
模块时,可以定义要用于该模块的。。它看起来像这样:

    - name: "Create Google Kubernetes Engine Cluster to be setup with with kubectl"
      gcp_container_cluster:
        name: "{{cluster_name}}"
        kubectlPath: /path/to/save/config
        [...]
      register: cluster
    - name: "Create k8s resource"
      k8s:
        kubeconfig: "{{ cluster.kubectlPath }}"
        definition:
          [...]
编辑:
我误读了文档,在“响应”部分澄清了必须设置此字段才能将文件写入此路径,此字段没有默认值。

当您使用
gcp\u容器\u集群创建集群时,返回值将包括。您可以使用带有{{cluster.kubectlPath}的示例引用此路径

当您要使用
k8s
模块时,可以定义要用于该模块的。。它看起来像这样:

    - name: "Create Google Kubernetes Engine Cluster to be setup with with kubectl"
      gcp_container_cluster:
        name: "{{cluster_name}}"
        kubectlPath: /path/to/save/config
        [...]
      register: cluster
    - name: "Create k8s resource"
      k8s:
        kubeconfig: "{{ cluster.kubectlPath }}"
        definition:
          [...]
编辑:
我误读了文档,在“响应”部分,它澄清了必须设置此字段才能将文件写入此路径,此字段没有默认值。

由于以下原因,这似乎是不可能的

我用自己的方法规避了这个问题

- name: "Circumvent https://github.com/ansible/ansible/issues/66096 which makes it impossible to retrieve the
kubecontext retrieved during cluster creation, asked
https://stackoverflow.com/questions/62799952/how-to-update-the-ansible-gcp-container-cluster-module for input"
  block:
    - name: "Create temporary file for gcloud key"
      tempfile: ~
      register: gcloud_key_tempfile
    - name: "Write gcloud key to temporary file"
      copy: content="{{ service_account_contents }}" dest={{ gcloud_key_tempfile.path }}
    - name: "Retrieve k8s credentials through gcloud shell commands"
      shell: |
        gcloud config set project {{ project_id }}
        gcloud config set compute/zone {{ cluster_location }}
        gcloud auth activate-service-account --key-file {{ gcloud_key_tempfile.path }}
        env KUBECONFIG={{kubectl_tempfile.path}} gcloud container clusters get-credentials {{ cluster_name }}
    - set_fact:
        kubeconfig_path: "{{ kubectl_tempfile.path }}"
  always:
    - name: "Remove temporary file for gcloud key"
      file: dest="{{ gcloud_key_tempfile.path }}" state=absent

这似乎是不可能的,因为

我用自己的方法规避了这个问题

- name: "Circumvent https://github.com/ansible/ansible/issues/66096 which makes it impossible to retrieve the
kubecontext retrieved during cluster creation, asked
https://stackoverflow.com/questions/62799952/how-to-update-the-ansible-gcp-container-cluster-module for input"
  block:
    - name: "Create temporary file for gcloud key"
      tempfile: ~
      register: gcloud_key_tempfile
    - name: "Write gcloud key to temporary file"
      copy: content="{{ service_account_contents }}" dest={{ gcloud_key_tempfile.path }}
    - name: "Retrieve k8s credentials through gcloud shell commands"
      shell: |
        gcloud config set project {{ project_id }}
        gcloud config set compute/zone {{ cluster_location }}
        gcloud auth activate-service-account --key-file {{ gcloud_key_tempfile.path }}
        env KUBECONFIG={{kubectl_tempfile.path}} gcloud container clusters get-credentials {{ cluster_name }}
    - set_fact:
        kubeconfig_path: "{{ kubectl_tempfile.path }}"
  always:
    - name: "Remove temporary file for gcloud key"
      file: dest="{{ gcloud_key_tempfile.path }}" state=absent

有趣。我也这么认为,但由于
fatal:[localhost]:失败!=>{“msg”:“该任务包含一个带有未定义变量的选项。错误是:'dict object'没有属性'kubectlPath'\n\n错误似乎在'/path/to/project/roles/role/tasks/main.yml':第62行第3列,但可能\n在文件的其他位置,具体取决于语法问题。\n\n出现问题的行是:\n\n标记:[jenkins\u slave\u cluster\u gke]\n-name:\“为jenkins Kubernetes plugin创建名称空间\”\n^here\n“}
I如果使用Ansible的
debug
将返回的
cluster
打印到控制台,我找不到
kubectlPath
。我误读了文档(或者文档记录不完整),kubectlPath字段应该在第一个任务中指定,谢谢您的输入。这也是我的想法,但它导致了我试图回避的问题。这个问题和这个问题可能是重复的,我将在进一步澄清如何使用Ansible.Ma创建和配置GKE集群的任务后尽快解决ybe这个错误只需要修复。我已经等了6个月才收到输入。很有趣。我也这么认为,但它失败了,因为
fatal:[localhost]:失败!=>{“msg”:任务包含一个带有未定义变量的选项。错误是:“dict object”没有属性“kubectlPath”\n\n错误出现在“/path/to/project/roles/role/tasks/main.yml”:第62行第3列,但可能\n出现在文件的其他位置,具体取决于语法问题。\n\n出现问题的行是:\n\n标记:[jenkins\u slave\u cluster\u gke]\n-name:\“为jenkins Kubernetes plugin创建名称空间\”\n^here\n“}
I如果使用Ansible的
debug
将返回的
cluster
打印到控制台,我找不到
kubectlPath
。我误读了文档(或者文档记录不完整),kubectlPath字段应该在第一个任务中指定,谢谢您的输入。这也是我的想法,但它导致了我试图回避的问题。这个问题和这个问题可能是重复的,我将在进一步澄清如何使用Ansible.Ma创建和配置GKE集群的任务后尽快解决ybe这个错误只是需要修复。我已经等了6个月,等待它的输入。