如何获取域内所有GCP项目及其所有者并导出至CSV?
获取GCP项目及其所有者并导出CSV的解决方案
你已经搞定项目列表的获取,接下来只需要针对每个项目查询绑定了roles/owner角色的成员,再把两者关联起来导出CSV就行,下面是两种实用的方法:
方法一:用gcloud命令行(快速上手)
如果已经用gcloud获取了项目列表,直接在脚本里循环每个项目,调用gcloud projects get-iam-policy来提取所有者:
- 首先,先导出所有项目ID到临时文件(如果已经有项目列表可以跳过这步):
gcloud projects list --format="value(projectId)" > project_ids.txt
- 编写一个shell脚本循环处理每个项目,生成CSV:
# 先写入CSV表头 echo "Project ID,Project Name,Owner Email/ID" > project_owners.csv # 循环每个项目ID while read -r project_id; do # 获取项目名称 project_name=$(gcloud projects describe "$project_id" --format="value(name)") # 获取所有所有者成员,过滤出roles/owner的条目 owners=$(gcloud projects get-iam-policy "$project_id" --format="value(bindings.members)" --filter="bindings.role:roles/owner" | tr ',' '\n') # 每个所有者单独一行(如果一个项目有多个所有者,会生成多行对应同一个项目) if [ -n "$owners" ]; then echo "$owners" | while read -r owner; do echo "\"$project_id\",\"$project_name\",\"$owner\"" >> project_owners.csv done else # 没有所有者的项目也记录下来 echo "\"$project_id\",\"$project_name\",\"No owner found\"" >> project_owners.csv fi done < project_ids.txt
- 运行脚本后,
project_owners.csv就包含了所有项目和对应的所有者,直接上传到Google Drive,右键选择“打开方式”→“Google Sheets”就能导入。
方法二:用Python脚本(更灵活,适合复杂场景)
如果需要更定制化的处理,用Google Cloud的Python客户端库来实现:
- 先安装依赖:
pip install google-cloud-resource-manager
- 编写Python脚本:
import csv from google.cloud import resourcemanager_v3 def get_all_projects(): """获取所有GCP项目""" client = resourcemanager_v3.ProjectsClient() projects = [] for project in client.list_projects(): # 只保留活跃状态的项目,可根据需要调整 if project.state == resourcemanager_v3.Project.State.ACTIVE: projects.append({"id": project.project_id, "name": project.name}) return projects def get_project_owners(project_id): """获取指定项目的所有者成员""" client = resourcemanager_v3.ProjectsClient() policy = client.get_iam_policy(request={"resource": f"projects/{project_id}"}) owners = [] for binding in policy.bindings: if binding.role == "roles/owner": owners.extend(binding.members) return owners def main(): projects = get_all_projects() # 写入CSV文件 with open("project_owners.csv", "w", newline="", encoding="utf-8") as csvfile: fieldnames = ["Project ID", "Project Name", "Owner"] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() for project in projects: owners = get_project_owners(project["id"]) if owners: for owner in owners: writer.writerow({ "Project ID": project["id"], "Project Name": project["name"], "Owner": owner }) else: writer.writerow({ "Project ID": project["id"], "Project Name": project["name"], "Owner": "No owner found" }) if __name__ == "__main__": main()
- 运行脚本前确保已经设置好GCP认证(比如
gcloud auth application-default login),生成CSV后同样可以直接导入Google Sheets。
注意事项
- 权限要求:执行操作的账号需要拥有
roles/resourcemanager.projectViewer或更高权限,才能读取项目的IAM策略。 - 所有者范围:这里的“所有者”指的是绑定了
roles/owner角色的所有成员,包括用户邮箱、服务账号、Google组、域等,如果你只需要用户类型的所有者,可以在过滤时加上条件(比如startswith(owner, "user:"))。
内容的提问来源于stack exchange,提问作者SL8t7
相关产品推荐
相关产品推荐

