Python GCP/Py:确定计算引擎实例何时实际准备好使用(不是“正在运行”)
我正在处理Google提供的示例代码,我希望确定一个实例何时可以开始工作。他们有一个操作Python GCP/Py:确定计算引擎实例何时实际准备好使用(不是“正在运行”),python,google-cloud-platform,cloud,ping,gcp,Python,Google Cloud Platform,Cloud,Ping,Gcp,我正在处理Google提供的示例代码,我希望确定一个实例何时可以开始工作。他们有一个操作'DONE'状态,他们有一个实例'RUNNING'状态,但在我实际使用该实例之前仍然有一个延迟。在不等待设定的时间段的情况下等待的最佳方式是什么(因为如果实例准备得更快,这会浪费时间) 我修改了他们的wait\u for\u操作函数,以便它使用isUp: # [START wait_for_operation] def wait_for_operation(compute, project, zone, op
'DONE'
状态,他们有一个实例'RUNNING'
状态,但在我实际使用该实例之前仍然有一个延迟。在不等待设定的时间段的情况下等待的最佳方式是什么(因为如果实例准备得更快,这会浪费时间)
我修改了他们的wait\u for\u操作
函数,以便它使用isUp
:
# [START wait_for_operation]
def wait_for_operation(compute, project, zone, operation):
print('Waiting for operation to finish...')
while True:
result = compute.zoneOperations().get(
project=project,
zone=zone,
operation=operation).execute()
if result['status'] == 'DONE':
print("done.")
print("result:")
print(result)
if 'error' in result:
raise Exception(result['error'])
print("before ex")
instStatus = compute.instances().get(
project=project,
zone=zone,
instance='inst-test1').execute()
print("after ex")
if instStatus['status'] == 'RUNNING':
if isUp("10.xxx.xx.xx"):
print("instStatus = ")
print(instStatus)
return result
else:
print("wasn't replying to ping")
time.sleep(1)
# [END wait_for_operation]
def isUp(hostname):
giveFeedback = False
if platform.system() == "Windows":
response = os.system("ping "+hostname+" -n 1")
else:
response = os.system("ping -c 1 " + hostname)
isUpBool = False
if response == 0:
if giveFeedback:
print( hostname + 'is up!')
isUpBool = True
else:
if giveFeedback:
print( hostname + 'is down!')
return isUpBool
原始isUp
code:
大多数其他代码都源于此:
GCP状态链接:
我的代码可以工作,但是有没有更好的方法来使用实例状态或其他东西并避免整个isUp
/ping内容?似乎我的方法是一个不必要的变通方法
很明显,我使用的是Python,这只是在代码中添加不必要的打印等等
我有一个Windows7工作站,我不想需要管理员权限和Linux实例
编辑1:“准备工作”,我的意思是我可以向它发送命令,它会响应。您好,我建议您使用全局操作。
我使用的一种方法是在实例元数据中使用启动脚本。然后,您可以使用关于的代码检查实例状态,并查看是否添加了新的元数据。然后可以避免ping服务器。另一个好处是,如果实例没有外部ip,此方法仍然有效
instStatus = compute.instances().get(
project=project,
zone=zone,
instance='inst-test1').execute()
这是一个很好的问题。在这一点上似乎没有更好的方法,我的意思是他们甚至在他们的文档中承认“运行”并不意味着它实际上是可用的,但不提供任何解决方法。感谢你创造性地解决问题。对于任何仍在挣扎的人来说,这是很有帮助的。可以使用
global
、regional
或zonal
操作的请求在其操作上保留一个选项卡,以创建计算实例、停止现有实例等。
instStatus = compute.instances().get(
project=project,
zone=zone,
instance='inst-test1').execute()