【问题标题】:Failed to parse gcp.yml with gcp_compute plugin使用 gcp_compute 插件解析 gcp.yml 失败
【发布时间】: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


【解决方案1】:

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

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

请记住,如果您执行 "set" IAM 绑定,您可能会被锁定在项目之外。请查看以下文档以更好地了解IAM policy for projects

【讨论】:

  • 感谢您提供更清晰和详尽的解释。
猜你喜欢
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多