首页 > 解决方案 > 使用 gcp_compute 插件解析 gcp.yml 失败

问题描述

我正在创建 ansible playbook 以在 GCP 中配置 VM。我正在使用gcp_compute插件来构建动态库存。使用具有角色的服务帐户roles\editor向谷歌云进行身份验证。执行时 Playbook 失败并出现以下错误。

[WARNING]:  * Failed to parse gcp.yml with gcp_compute plugin: [{'message': "Required 'compute.instances.list' permission for 'projects/project-dev-295204'", 'domain':
'global', 'reason': 'forbidden'}]
[WARNING]: gcp.yml as an inventory source
[WARNING]: No inventory was parsed, only implicit localhost is available

根据警告消息,服务帐户似乎没有必要的权限来生成正在运行的 VM 实例列表来构建清单,但是服务帐户editor附加了角色,并且该角色具有编辑所需的所有权限,列出大多数GCP 中的资源。

ansible.cfg

[defaults]
roles_path = roles
inventory = gcp.yml
remote_user = ansible
host_key_checking = False
private_key_file = $GOOGLE_SSH_KEY

[inventory]
enable_plugins = gcp_compute

gcp.yml

plugin: gcp_compute
projects:
  - project-dev-295204

auth_kind: serviceaccount
service_account_file: $GOOGLE_SA

keyed_groups:
  - key: labels
    prefix: label
  - key: zone
    prefix: zone

解决方法

将服务帐户添加为 IAM 成员并映射到roles\EditorIAM 管理员主页中的角色后,剧本返回成功响应。

以下命令返回 403 响应(authentication mode = service account),直到将服务帐户添加为新的 IAM 成员。

gcloud compute instances list
gcloud compute addresses list

在创建服务账户时将角色附加到服务账户并将vs服务账户添加为 IAM 成员并将其标记到同一角色有何不同。

注意(编辑 1):

我通过 terraform 使用资源类型google_service_account创建服务帐户来创建服务帐户google_service_account_iam_policy并将编辑角色附加到服务帐户。

标签: google-cloud-platformansibleservice-accountsterraform-provider-gcp

解决方案


为服务账户使用 IAM 策略时,这意味着它将 IAM 绑定设置为资源级别,这意味着您在同一服务账户上为 SA my-sa@ 设置编辑角色,而不是在实际项目级别上。请避免使用google_service_account_iam_policy,因为它会覆盖现有绑定,并且只会设置serviceAccountusergroup等以及它们在 TF 文件中指定的各自角色。

为了在项目级别“添加”绑定而不是“设置” ,如果这是第一次创建绑定,则需要使用以下google_project_iam_binding更新现有绑定,然后使用google_project_iam_member,这不会覆盖您现有的绑定在项目层面。

请记住,如果您执行“设置” IAM 绑定,您可能会被锁定在项目之外。请查看以下文档以更好地了解项目的 IAM 政策


推荐阅读