如何通过Ansible利用控制节点GCP账户权限操作GCE VM及GKE私有集群
用Ansible借助控制节点个人GCP账户操作GCE VM(对接GKE私有集群)
你已经能通过Ansible连接GCE VM,但默认用的是VM绑定的服务账户,不想给服务账户加权限也不想复制密钥,以下几种安全方案可以实现用控制节点的个人GCP账户权限执行操作:
方案1:临时传递应用默认凭据(ADC)并清理
控制节点通过gcloud auth application-default login生成的应用默认凭据存在~/.config/gcloud/application_default_credentials.json,可以临时复制到VM的临时目录,设置环境变量指向它,操作完成后立即删除:
- name: 使用个人GCP账户执行GKE操作 hosts: gce_vm tasks: - name: 临时复制控制节点的ADC到VM copy: content: "{{ lookup('file', lookup('env', 'HOME') + '/.config/gcloud/application_default_credentials.json') }}" dest: "/tmp/adc_temp.json" mode: '0600' no_log: true # 禁止日志输出凭据内容,避免泄露 - name: 设置GCP认证环境变量 set_fact: gcp_auth_env: GOOGLE_APPLICATION_CREDENTIALS: "/tmp/adc_temp.json" - name: 获取GKE私有集群凭证 command: gcloud container clusters get-credentials your-private-cluster --zone your-cluster-zone environment: "{{ gcp_auth_env }}" - name: 清理临时凭据文件 file: path: "/tmp/adc_temp.json" state: absent
方案2:SSH Agent转发+gcloud代理配置
利用SSH Agent转发,让VM通过控制节点的SSH代理使用个人GCP账户认证,无需传递任何凭据文件:
- 控制节点先配置gcloud使用SSH代理:
gcloud config set ssh/use_ssh_agent true
- 在Ansible中开启SSH Agent转发,执行操作:
- name: 通过SSH Agent转发使用个人GCP账户 hosts: gce_vm vars: ansible_ssh_args: "-o ForwardAgent=yes" tasks: - name: 配置VM上的gcloud使用SSH代理 command: gcloud config set ssh/use_ssh_agent true - name: 获取GKE集群凭证 command: gcloud container clusters get-credentials your-private-cluster --zone your-cluster-zone
注意:确保控制节点的SSH Agent已经加载了个人GCP关联的SSH密钥,且VM的SSH配置允许Agent转发。
方案3:使用临时访问令牌(最安全)
通过Ansible从控制节点获取个人GCP账户的临时访问令牌,在VM上通过环境变量传递令牌进行认证,令牌有有效期(默认约1小时),不会在VM留下持久化凭据:
# 先在控制节点获取临时令牌 - name: 获取个人GCP账户临时访问令牌 hosts: localhost tasks: - name: 请求临时令牌 gcp_auth: scopes: - https://www.googleapis.com/auth/cloud-platform register: gcp_token # 在GCE VM上使用令牌执行操作 - name: 用临时令牌操作GKE集群 hosts: gce_vm vars: gcp_access_token: "{{ hostvars['localhost']['gcp_token']['access_token'] }}" tasks: - name: 设置令牌环境变量 set_fact: gcp_token_env: GOOGLE_OAUTH_ACCESS_TOKEN: "{{ gcp_access_token }}" - name: 获取GKE集群凭证 command: gcloud container clusters get-credentials your-private-cluster --zone your-cluster-zone environment: "{{ gcp_token_env }}"
内容的提问来源于stack exchange,提问作者Pedro Souza
相关产品推荐
相关产品推荐

