如何解决如何从具有gcloud`的组织中获取所有GCP文件夹? 已更新
我想知道您是否可以找到组织中的所有项目/文件夹。当前,gcloud允许将文件夹和项目都指定给父级,从而将递归操作委托给CLIENT。
虽然不幸的是,没有gcloud
等效命令,但似乎有一种 通过Resource Manager API进行搜索的方法。确实可行:
$ alias curl-oauth='curl -H "Authorization: Bearer $(gcloud auth print-access-token)"'
$ curl-oauth -X POST https://cloudresourcemanager.googleapis.com/v2/folders:search '{}'
感谢您提供任何帮助或指向现有代码的信息,以实现此客户端或通过gcloud
。
解决方法
我很快会将代码移至github,但仍然希望为您提供代码,以防您想使用它。
- 它确实填充了所有组织(您可以使用
maxlevel
)。 - IT创建一个graphviz点并对其进行图形绘制(很酷!)
只需确保在运行之前创建out /目录即可。
我将组织的结果附加到maxlevel=2
(看起来像3-需要对其进行修复)。
github上的Ruby代码:https://github.com/palladius/org-folder-projects-graph/blob/master/recurse_folders.rb
,感谢@DazWilkin 的脚本。我使用了这个并添加了它,因为我也需要文件夹中的项目。希望此代码可以帮助其他人。
#!/usr/bin/env bash
: "${ORGANIZATION:?Need to export ORGANIZATION and it must be non-empty}"
# gcloud format
FORMAT="csv[no-heading](name,displayName.encode(base64))"
FORMAT_PRJ="table[box,title='Folder ${NAME} Project List'] \
(createTime:sort=1,name,projectNumber,projectId:label=ProjectID,parent.id:label=Parent)"
# Enumerates Folders recursively
folders()
# project()
{
LINES=("$@")
for LINE in ${LINES[@]}
do
# Parses lines of the form folder,name
VALUES=(${LINE//,/ })
FOLDER=${VALUES[0]}
# Decodes the encoded name
NAME=$(echo ${VALUES[1]} | base64 --decode)
printf "Folder: ${FOLDER} (${NAME})\n\n"
printf "Project: Project info: \n\n"
project=$(gcloud projects list \
--filter parent.id:${FOLDER} \
--format="${FORMAT_PRJ}")
if [ -z "$project" ]
then
printf "Folder: ${FOLDER} - ${NAME} has no sub-projects\n\n"
else
printf "Parent FolderID: ${FOLDER}\t Parent Name(s): ${NAME}\n${project} \n\n"
fi
folders $(gcloud resource-manager folders list \
--folder=${FOLDER} \
--format="${FORMAT}")
done
}
# Start at the Org
printf "Org: ${ORGANIZATION}\n\n"
LINES=$(gcloud resource-manager folders list \
--organization=${ORGANIZATION} \
--format="${FORMAT}")
# Descend
folders ${LINES[0]}
,
已更新
好的,这是一个(仍然)粗糙(但现在可以使用)的脚本(感谢@riccardo可以访问测试组织):
#!/usr/bin/env bash
: "${ORGANIZATION:?Need to export ORGANIZATION and it must be non-empty}"
# gcloud format
FORMAT="csv[no-heading](name,displayName.encode(base64))"
# Enumerates Folders recursively
folders()
{
LINES=("$@")
for LINE in ${LINES[@]}
do
# Parses lines of the form folder,/ })
FOLDER=${VALUES[0]}
# Decodes the encoded name
NAME=$(echo ${VALUES[1]} | base64 --decode)
echo "Folder: ${FOLDER} (${NAME})"
folders $(gcloud resource-manager folders list \
--folder=${FOLDER} \
--format="${FORMAT}")
done
}
# Start at the Org
echo "Org: ${ORGANIZATION}"
LINES=$(gcloud resource-manager folders list \
--organization=${ORGANIZATION} \
--format="${FORMAT}")
# Descend
folders ${LINES[0]}
我面临着在Bash中更有效地做到这一点的挑战;我很想看看是否有更多经验丰富的Bash用户有建议。
该脚本使用gcloud投影对base displayName
值进行base64编码。这是一种巧妙的方法,可以避免无意中解析这些字符串(它们可能包含空格),而我无法找到一种方法来逃避这些字符串。
仍然不会缩进级别?
上一个
超级粗糙...很遗憾,没有访问组织或文件夹的权限,所以大多是猜测...
#!/usr/bin/env bash
ORGANIZATION="..."
folders()
{
for FOLDER in ${1}
do
echo ${FOLDER}
# Use the `--folder` variant for children
folders $(gcloud resource-manager folders list \
--folder=${FOLDER} \
--format="value(name)")
done
}
# Start at the Org
echo "Org: ${ORGANIZATION}"
folders $(\
gcloud resource-manager folders list \
--organization=${ORGANIZATION} \
--format="value(name)")
各种明显的问题(可能还有许多其他问题)
- 没有错误管理
- 不清楚返回的格式是什么以及如何获取
folderId
- 没有缩进级别;我怀疑您需要为此添加一个参数
- 可能需要将返回的值转换为bash数组
如果您可以提供gcloud resource-manager folders list ... --format=yaml
的架构,则可以尝试寻址#2
您要求输入gcloud
,但最好使用例如Python
不幸的是,没有直接的命令。
这是一个Bash脚本,可以获取组织中的所有文件夹(最多三个级别)和项目。
for FOL in $(for F0 in $(gcloud resource-manager folders list --organization=<ORGANIZATION_ID> --format='table(ID)' | sed -n '1!p');
do echo $F0 ;
for F1 in $(gcloud resource-manager folders list --folder=$F0 --format='table(ID)'| sed -n '1!p');
do echo $F1;
for F2 in $(gcloud resource-manager folders list --folder=$F1 --format='table(ID)'| sed -n '1!p');
do echo $F2;
gcloud resource-manager folders list --folder=$F2 --format='table(ID)';
done;
done;
done);
do gcloud resource-manager folders describe $FOL;
gcloud projects list --filter=parent.id:$FOL
done
如果您知道自己有更多的能力,则可以通过在第一部分中嵌套更多的fors来添加更多的级别迭代,方法是将 gcloud resource-manager folders list --folder=$F2 --format='table(ID)';
替换为full for :
for F3 in $(gcloud resource-manager folders list --folder=$F2 --format='table(ID)'| sed -n '1!p');
do echo $F3;
gcloud resource-manager folders list --folder=$F3 --format='table(ID)';
done;
我已经对其进行了测试,并且工作正常。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。