繁体   English   中英

如何通过 Python API 使用启动脚本启动 GCP Compute Engine VM?

[英]How to launch GCP Compute Engine VM with Startup Script via Python API?

GCP 在此处提供了已发布的create_instance()代码片段,我在 SO 上的几个地方( 例如此处)看到了它。 但是,正如您在第一个链接中看到的那样,它是从 2015 年开始的(“Copyright 2015 Google Inc”),此后 Google 发布了另一个用于启动日期为 2022 年的 GCE 实例的代码示例。它在 github 此处可用,而这个较新的create_instance function是 GCP 的 python API 文档中特色。

但是,我无法弄清楚如何通过元数据传递启动脚本以使用现代 python function 在 VM 启动时运行。我尝试添加

    instance_client.metadata.items = {'key': 'startup-script',
                                      'value': job_script}

create.py function(再次, 在这里可用以及它调用的支持实用程序函数)但是它抛出了一个错误,即instance_client没有该属性。

GCP 用于使用启动脚本启动 GCE VM 的文档页面位于此处,与大多数其他类似页面不同,它仅包含consolegcloud和 (REST) API的代码片段; 不是 SDK 代码片段,例如 Python 和 Ruby,它们可能显示如何修改上面的 python create_instance function。

使用启动脚本从 python 进程启动 GCE VM 的最佳实践是真正发送发布请求还是仅包装gcloud命令

gcloud compute instances create VM_NAME \
  --image-project=debian-cloud \
  --image-family=debian-10 \
  --metadata-from-file=startup-script=FILE_PATH

...在subprocess.run()中? 老实说,我不介意那样做,因为代码非常紧凑(至少是 gcloud 命令,而不是 POST 请求方式),但由于 GCP 提供了一个create_instance python function 我假设使用/修改-as-necessary那将是 python 中的最佳实践......

谢谢!

因此,使用 Python 库创建相当于--metadata-from-file=startup-scripts=${FILE_PATH}的最简单(!)方法可能是:

from google.cloud import compute_v1

instance = compute_v1.Instance()

metadata = compute_v1.Metadata()
metadata.items = [
    {
        "key":"startup-script",
        "value":'#!/usr/bin/env bash\necho "Hello Freddie"'
    }
]

instance.metadata = metadata

另一种方式是:

metadata = compute_v1.Metadata()

items = compute_v1.types.Items()
items.key = "startup-script"
items.value = """
#!/usr/bin/env bash

echo "Hello Freddie"
"""

metadata.items = [items]

注意在示例中,为方便起见,我将FILE_PATH的内容嵌入到脚本中,但您当然可以使用 Python 的open来获得更具可比性的结果。

如果您有一个库来调用功能而不是使用subprocess来调用二进制文件,那么通常最好使用库|SDK。 如评论中所述,主要原因是特定于语言的调用为您提供了输入(更多的是类型化语言)、受控执行(例如try )和错误处理。 当您调用subprocess时,它的基于字符串的流一直向下。

我同意使用类的 Compute Engine Python 库感觉很麻烦,但是当您编写脚本时,重点可能是更明确定义的长期利益与表现力的短期痛苦。 如果你只想插入一个虚拟机,一定要使用gcloud compute instances create (我一直Bash这样做)但是,如果你想使用更优雅的语言,比如 Python,那么我鼓励你完全使用 Python。

CURIOSITY gcloud写在 Python 中。如果您使用 Python subprocess进程调用gcloud命令,则您使用 Python 调用运行 Python 的 shell 进行 REST 调用;--

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM