如何从具有gcloud`的组织中获取所有GCP文件夹? 已更新

如何解决如何从具有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

解决方法

enter image description here我终于能够获得递归的红宝石版本(感谢Daz的提示!)。

我很快会将代码移至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)")

各种明显的问题(可能还有许多其他问题)

  1. 没有错误管理
  2. 不清楚返回的格式是什么以及如何获取folderId
  3. 没有缩进级别;我怀疑您需要为此添加一个参数
  4. 可能需要将返回的值转换为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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-