无法使用 gcp_compute 插件解析 gcp.yml

Failed to parse gcp.yml with gcp_compute plugin

我正在创建 ansible 剧本来在 GCP 中配置虚拟机。我正在使用 gcp_compute 插件来构建动态清单。使用角色为 roles\editor 的服务帐户向 google 云进行身份验证。 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 后,剧本返回成功响应。

以下命令返回 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 将编辑者角色附加到服务帐户。

当使用 IAM policy for service account this means that it will set IAM bindings to resource level meaning you are setting editor role for SA my-sa@ on the same service account not on the actual project level. Please avoid using google_service_account_iam_policy 时,因为它会覆盖现有的绑定并且只会设置 serviceAccountusergroup 等以及它们在您的文档中指定的各自角色TF文件。

为了“添加”一个绑定而不是“设置” 在项目级别,您需要使用以下 google_project_iam_binding for updating existing bindings if this is the first time creating a binding then use google_project_iam_member ,这不会覆盖您在项目级别的现有绑定。

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