【问题标题】:How to get all the VM's information for all Projects in GCP如何获取 GCP 中所有项目的所有 VM 信息
【发布时间】:2019-07-13 05:40:06
【问题描述】:

如何获取 GCP 中所有项目的所有 VM 信息。

我的 GCP 帐户中有多个项目,我需要 GCP 中所有项目的所有 VM 的操作系统、操作系统版本和操作系统的构建版本。

【问题讨论】:

  • 你有权访问这些项目的组织吗!?
  • 是的,我可以访问
  • 也许您可以使用 Google Cloud 安全中心 (cloud.google.com/security-command-center/docs) 获取所需的信息。让我知道它是否对您有帮助。
  • 这不是 GCP / GCP 工具提供的信息。您将需要创建自己的工具或使用第三方软件。我还没有看到任何关于这个任务的东西。如果有人知道工具,请添加到 cmets。

标签: google-cloud-platform terraform-provider-gcp


【解决方案1】:

您可以在 Cloud Shell 中使用以下命令来获取所有项目,然后显示每个项目的实例:

for i in $(gcloud projects list |  sed 1d | cut -f1 -d$' '); do 
gcloud compute instances list --project $i;done;

注意:确保您拥有所有项目的 compute.instances.list 权限

【讨论】:

    【解决方案2】:

    又脏又臭:

    gcloud projects list --format 'value(PROJECT_ID)' >> proj_list
    
    cat proj_list | while read pj; do gcloud compute instances list --project $pj; done
    

    【讨论】:

    • 点评来源: 请为您的解决方案添加一些解释。
    【解决方案3】:

    我没有找到相应的工具,所以我编写了一些你可以使用的代码。 此代码必须改进,但在这里您可以找到一种方法来扫描所有项目并获取有关操作系统的信息。

    如果对你有帮助,请告诉我。

    点安装:

    !pip install google-cloud
    !pip install google-api-python-client
    !pip install oauth2client
    

    代码:

    import subprocess
    import sys
    import logging
    import threading
    import pprint
    
    logger = logging.Logger('catch_all')
    
    def execute_bash(parameters):
        try:
            return subprocess.check_output(parameters)
        except Exception as e: 
           logger.error(e) 
           logger.error('ERROR: Looking in jupyter console for more information')
    
    def scan_gce(project, results_scan):
        print('Scanning project: "{}"'.format(project))
        ex = execute_bash(['gcloud','compute', 'instances', 'list', '--project', project, '--format=value(name,zone, status)'])
        list_result_vms = []
        if ex:
            list_vms = ex.decode("utf-8").split('\n')
            for vm in list_vms:
                if vm:
                    vm_info = vm.split('\t')
                    print('Scanning Instance: "{}" in project "{}"'.format(vm_info[0], project))
                    results_bytes = execute_bash(['gcloud', 'compute', '--project',project, 
                                            'ssh', '--zone', vm_info[1],  vm_info[0], 
                                            '--command', 'cat /etc/*-release'  ])
                    if results_bytes:
                        results = results_bytes.decode("utf-8").split('\n')
                        list_result_vms.append({'instance_name': vm_info[0],'result':results})
    
    
        results_scan.append({'project':project, 'vms':list_result_vms})
    
    
    list_projects = execute_bash(['gcloud','projects', 'list', '--format=value(projectId)']).decode("utf-8").split('\n')
    threads_project = []
    results_scan = []
    for project in list_projects :
        t = threading.Thread(target=scan_gce, args=(project, results_scan))
        threads_project.append(t)
        t.start()
    
    for t in threads_project:
        t.join()
    
    for result in results_scan:
        pprint.pprint(result)
    

    你可以找到完整的代码here

    【讨论】:

    • 仅供未来读者参考,google 拥有自己的 GCP python 客户端库,非常强大。与在 python 中使用 bash 或 subprocess 命令不同,使用 aggrigated.list python API 会更快(并且与云函数和 lambda 等产品更具可比性)。位于此处cloud.google.com/compute/docs/reference/rest/v1/instances/…
    • google api 命令仅针对一个项目执行此操作。如何在所有项目和文件夹中搜索 VM 名称?
    • "execute_bash(['gcloud','projects', 'list', '--format=value(projectId)']).decode("utf-8").split('\ n')" 返回一个列表,其中包含您有权访问的所有项目
    猜你喜欢
    • 2019-11-02
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多