GCP有一个已发布的create_instance()代码片段可用的这里,我在几个地方见过例如这里。然而,正如您在第一个链接中所看到的,它是从2015年开始的(“版权2015年谷歌公司”),而且Google已经发布了另一个代码示例,用于发布一个日期为2022年的GCE实例。它可以在github 这里上使用,这个更新的create_instance函数是GCP的python文档这里中的特色。
但是,我不知道如何通过元数据传递启动脚本,以便使用现代python函数在VM启动上运行。我试着添加
instance_client.metadata.items = {'key': 'startup-script',
'value': job_script}对于create.py函数(同样,可用的这里以及它调用的支持实用程序函数),但是它抛出了一个错误,即instance_client没有该属性。
GCP用于用启动脚本启动GCE的文档页是这里,与大多数其他类似的页面不同,它只包含用于console、gcloud和(REST)API的代码片段;而不是用于Python和Ruby的SDK代码片段,这些代码片段可能演示如何修改上面提到的python create_instance函数。
是使用python进程的启动脚本启动GCE的最佳实践,实际上是发送post请求或包装gcloud命令。
gcloud compute instances create VM_NAME \
--image-project=debian-cloud \
--image-family=debian-10 \
--metadata-from-file=startup-script=FILE_PATH...in a subprocess.run()?老实说,我不介意这样做,因为代码是如此紧凑(至少是gcloud命令,而不是POST请求方式),但是由于GCP提供了一个create_instance python函数,所以我假设使用/修改--这是python内部的最佳实践。
谢谢!
发布于 2022-06-03 01:45:05
所以,最简单的(!)使用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的内容,但是您当然可以使用FILE_PATH的open来获得更类似的结果。
通常情况下,如果您需要调用功能,而不是使用来调用二进制文件,那么使用库的总是更好的。正如注释中提到的,主要原因是特定于语言的调用给您输入(更多的是类型化语言)、受控执行(例如try)和错误处理。当您调用一个subprocess时,它的基于字符串的流一直向下。
我同意使用类的计算引擎Python库感觉很麻烦,但是,在编写脚本时,重点可能是更明确定义的长期好处和表达能力的短期痛苦。如果您只想插入一个VM,无论如何都要使用gcloud compute instances create ( all in Bash中的 time ),但是,如果您想使用更优雅的语言,比如Python,那么我鼓励您完全使用Python。
gcloud是用Python编写的。如果使用Python调用subprocess命令,则使用gcloud调用运行Python的shell进行REST调用;-)
https://stackoverflow.com/questions/72483491
复制相似问题