【发布时间】:2021-06-02 08:11:45
【问题描述】:
我正在创建 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 成员并映射到 IAM 管理员主页中的角色 roles\Editor后,剧本返回成功响应。
在将服务帐户添加为新的 IAM 成员之前,以下命令返回 403 响应 (authentication mode = service account)。
gcloud compute instances list
gcloud compute addresses list
在创建服务帐户时将角色附加到服务帐户vs 将服务帐户添加为 IAM 成员并将其标记到同一角色有何不同。
注意(编辑 1):
我通过 terraform 创建了服务帐户,使用资源类型 google_service_account 创建服务帐户并使用 google_service_account_iam_policy 将编辑角色附加到服务帐户。
【问题讨论】:
-
您能否确认您使用的服务帐户是否在您执行命令的同一项目下?当您创建具有角色的 SA 时,在您的情况下为
roles\Editor,它将自动位于 IAM 中。如果您使用的是不同的项目,SA 将无法执行命令,因为它在其他项目中没有正确的权限。 -
是的,项目是一样的。我通过 terraform 附加的编辑角色创建了 SA,然后验证该服务帐户是编辑池的一部分。运行剧本,但它没有工作,所以要让它工作,我必须明确地将服务帐户添加为 IAM 成员并将其分配给编辑池。
标签: google-cloud-platform ansible service-accounts terraform-provider-gcp