google-cloud-platform - 使用 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\Editor
IAM 管理员主页中的角色后,剧本返回成功响应。
以下命令返回 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 策略时,这意味着它将 IAM 绑定设置为资源级别,这意味着您在同一服务账户上为 SA my-sa@ 设置编辑角色,而不是在实际项目级别上。请避免使用google_service_account_iam_policy,因为它会覆盖现有绑定,并且只会设置serviceAccount
、user
、group
等以及它们在 TF 文件中指定的各自角色。
为了在项目级别“添加”绑定而不是“设置” ,如果这是第一次创建绑定,则需要使用以下google_project_iam_binding更新现有绑定,然后使用google_project_iam_member,这不会覆盖您现有的绑定在项目层面。
请记住,如果您执行“设置” IAM 绑定,您可能会被锁定在项目之外。请查看以下文档以更好地了解项目的 IAM 政策
推荐阅读
- java - 让 Eclipse 忘记终止/重新启动应用程序的“记住我的决定”
- .net - NuGet 安装中的框架版本不兼容
- java - href 链接的 XPATH 不起作用。获取无效的选择器:它应该是一个元素
- c# - C# Web API 连接到 MarkLogic API - 如何传递凭据
- json.net - Json.NET 并不总是序列化嵌套类
- html - display flex 不会像预期的那样打破长线
- python - 如何使用主脚本的变量执行辅助脚本?
- symfony - 使用 JMS 序列化程序从 FOSUserBundle 中排除字段,该 JMS 序列化程序在 dev 上工作但不在 prod 环境中
- java - 如何将 WebElement 转换为 selenium/Java 中“if”语句的字符串
- sql - 如果子目录不存在,则使用 SQL 脚本创建子目录