我有以下python代码:
def create_instance(compute_arg, project_arg, zone_arg, config="default", startup_script="", name="", instances=[],
strategy_args=[]):
startup_script = """
#! /bin/bash\n
mkdir before_all;\n
EOF
"""
print name
if config == "default":
print 'config is default'
config = {
"name": name,
"zone": "projects/my-project-12345/zones/us-east1-b",
"machineType": "projects/my-project-12345/zones/us-east1-b/machineTypes/n1-standard-1",
"metadata": {
"items": [{'key': 'startup-script', 'value': startup_script}]
},
"tags": {
"items": [
"http-server",
"https-server"
]
},
"disks": [
{
"type": "PERSISTENT",
"boot": True,
"mode": "READ_WRITE",
"autoDelete": True,
"deviceName": "instance-6",
"initializeParams": {
"sourceImage": "projects/my-project-12345/global/images/image-root-git-algo",
"diskType": "projects/my-project-12345/zones/us-east1-b/diskTypes/pd-standard",
"diskSizeGb": "10"
}
}
],
"canIpForward": False,
"networkInterfaces": [
{
"network": "projects/my-project-12345/global/networks/default",
"subnetwork": "projects/my-project-12345/regions/us-east1/subnetworks/default",
"accessConfigs": [
{
"name": "External NAT",
"type": "ONE_TO_ONE_NAT"
}
]
}
],
"description": "",
"labels": {},
"scheduling": {
"preemptible": False,
"onHostMaintenance": "MIGRATE",
"automaticRestart": True
},
"serviceAccounts": [
{
"email": "123456-compute@developer.gserviceaccount.com",
"scopes": [
"https://www.googleapis.com/auth/cloud-platform"
]
}
]
}
return compute_arg.instances().insert(
project=project_arg,
zone=zone_arg,
body=config).execute()
compute = googleapiclient.discovery.build('compute', 'v1')
project = 'my-project-12345'
zone = 'us-east1-b'
instance_name = 'instance-algo-' + str(uuid.uuid4())
operation = create_instance(compute, project, zone, name=instance_name, instances=[])
哪个运行没有问题。我的实例是基于正确的图像创建的,我能够发现它们预期的所有文件和目录。
这很棒,但我的启动脚本没有运行。当我登录到我的实例时,我看不到目录before_all
。如果我进入实例,我可以运行mkdir before_all;
,并且很高兴地运行。
我之前有一个更复杂的启动脚本,它没有运行和简化,看看我上面有什么。
我不确定为什么格式似乎与this example from google中的内容相匹配。
有人在这里看到我的错误吗?
请注意,我已尝试使用和不使用EOF,有和没有分号,有和没有\n
。抓我的头。
谢谢
答案 0 :(得分:0)
你不应该有" \ n"或者" EOF"。无论你在哪里获得它们只是在shell脚本中尝试相当于"""..."""
。
您也不应该在#!
之前有任何前导空格,因为这会导致它被忽略。目前你有一条新线和几个空格。尝试:
"""#!/bin/bash
...
"""
我不认为这是问题的原因,因为默认情况下,文件中的所有命令都会运行。
因为您指定了mkdir
的相对路径,所以它将在启动脚本运行的任何位置创建目录。这是与您登录时(您的主目录)不同的位置。如果修复了(1)和(2),你会发现before_all在某处创建了令人惊讶的地方(可能在/
)。如果您希望mkdir
在主目录中创建目录,请尝试使用mkdir /home/YOUR_USERNAME/before_all
。但请注意,它将由root而不是您自己的用户拥有。