我正在玩计算引擎。我编写了一个 Python 脚本,该脚本调用计算引擎 API,并尝试使用随附的启动脚本创建 VM 实例。启动脚本旨在使用 echo 命令创建一个简单的 HTML 文件。
Python 脚本已成功创建 VM 实例。但是,当我通过 SSH 连接到 VM 实例时,没有 HTML 文件的痕迹。
但是,如果我在安全外壳中手动运行 echo 命令......
echo "<html><body><h1>Hello World</h1><p>This page was created from a startup scri
pt.</p></body></html>" > index.html
。文件创建成功。
为什么这在我的启动脚本中不起作用?我需要在下面的 Python 代码中调整什么吗?
service = discovery.build('compute', 'v1', credentials=credentials)
def create_instance(compute, project, zone, name):
# Get the latest Debian Jessie image.
image_response = (
compute.images()
.getFromFamily(project="debian-cloud", family="debian-9")
.execute()
)
source_disk_image = image_response["selfLink"]
# Configure the machine
machine_type = "zones/%s/machineTypes/n1-standard-1" % zone
config = {
"name": name,
"machineType": machine_type,
# Specify the boot disk and the image to use as a source.
"disks": [
{
"boot": True,
"autoDelete": True,
"initializeParams": {
"sourceImage": source_disk_image,
},
}
],
"networkInterfaces": [
{
"network": "global/networks/default",
"accessConfigs": [{"type": "ONE_TO_ONE_NAT", "name": "External NAT"}],
}
],
"metadata": {
"kind": "compute#metadata",
"items": [
{
"key": "startup-script",
"value": 'sudo apt-get updatenexport DEBIAN_FRONTEND=noninteractivenecho "<html><body><h1>Hello World</h1><p>This page was created from a startup script.</p></body></html>" > index.html'
}
]
},
"tags": {"items": ["http-server", "https-server"]},
}
return compute.instances().insert(project=project, zone=zone, body=config).execute()
create_instance(service, project_id, zone, "pandora-instance")
当你运行启动脚本时,它以root身份运行。
所以,首先,sudo
是没有用的。然后,您的home
目录将/root
并且此目录仅处于写入状态。因此,当您在/root
目录中写入index.html
文件时,这是不可能的
首选已知位置,使用/tmp
进行测试。
AND由于您确实以root
模式写入文件,因此文件的所有者也将root
。如果它是其余进程的障碍,请执行chown
来更改此设置。
您需要在脚本的开头添加shebang,以告诉操作系统使用哪个解释器。在您的情况下,这将是:
{
...
"metadata": {
"items": [
{
"key": "startup-script",
"value": "#! /bin/bashnnsudo apt-get updatenexport DEBIAN_FRONTEND=noninteractivenecho "<html><body><h1>Hello World</h1><p>This page was created from a startup script.</p></body></html>" > index.html"
}
]
}
...
}
它本质上是通过 API 发送的,如此处所述。
请注意,您可以通过检查该虚拟机实例的云日志记录或直接在实例的串行控制台日志中对启动脚本问题进行故障排除。