Google 云 - Python 自动化

Google cloud - Python automation

我想知道如何管理从 Python 脚本中嵌入的 gcloud 命令输出的数据。例如,我在Python中准备了简单的脚本。我正在从 Google Cloud Shell 编辑器中执行它。代码如下所示:

import subprocess

project = "gcloud info --format='value(config.project)'"
subprocess.call(project, shell=True)
subprocess.run(["gcloud config set project projectID"], shell=True)
result = subprocess.run(["gcloud compute instances os-inventory list-instances"], shell=True)
print(result)

作为终端的输出,我可以看到 VM 列表。我只想过滤掉具有特定 属性、名称或 IP 号的虚拟机。我如何管理这些输出,该变量 result 的 class 是 <class 'subprocess.CompletedProcess'>.

脚本输出如下所示:

NAME           ZONE            MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP      STATUS
server00       europe-west2-c  e2-medium                  10.x.x.x     x.x.x.x           RUNNING
server01       europe-west2-c  e2-medium                  10.x.x.x     x.x.x.x           RUNNING

您能否编辑问题并显示示例输出,以便在不设置 gcloud 的情况下更容易做出回答。

因为我不知道输出结果如何,所以我无法给出关于如何过滤掉的确切答案。 但是,如果您想从“gcloud compute instances os-inventory list-instances”中获取输出,您可以这样做:

import subprocess

project = "gcloud info --format='value(config.project)'"
subprocess.call(project, shell=True)
subprocess.run(["gcloud config set project projectID"], shell=True)
p = subprocess.Popen(["gcloud", "compute instances os-inventory list-instances"], stdout=subprocess.PIPE)
out, err = p.communicate()

print(out)

尝试使用 result.stdout

您可能还需要将 capture_output=True 添加到 subprocess.run 调用中。也一样:

subprocess.run(["gcloud config set project projectID"], capture_output=True, text=True, shell=True)

这将为您提供标准输出文本,然后您可以在换行符上拆分该文本,遍历创建的数组,过滤您需要的任何内容,等等。

对于过滤,您可以在 subprocess 命令上执行,或者 post 处理。因此,例如,如果您只想查看 us-central1 区域中的结果虚拟机,您可以将子进程命令更改为:

["gcloud config set project projectID"]

["gcloud config set project projectID | grep us-central1"]

或者,对于 post-process 你可以这样做:


project = "gcloud info --format='value(config.project)'"
subprocess.call(project, shell=True)
subprocess.run(["gcloud config set project projectID"], shell=True)
result = subprocess.run(["gcloud compute instances os-inventory list-instances"], shell=True)

arr = result.stdout.split("\n")
for line in arr:
  if "us-central1" in line:
    print(line)