自动检测在 Google Cloud Platform 中的特定虚拟机和区域上运行的 Apache 服务器

自动检测在 Google Cloud Platform 中的特定虚拟机和区域上运行的 Apache 服务器

注意:这是一个自答题,这里允许这样做。如果您有更好的解决方案,请继续发布。

假设基于网络的云学校的自动化需要测试学生是否具备一些最低限度的能力,然后才能继续进行。学生必须能够启动 Google Cloud VM、在其上安装 Apache 并将端口 80 公开到公共互联网,然后才能继续下一个任务。

问题不在于如何设置 Apache。这是显而易见的。

问题是如何测试它是否已经完成。

因此,第一步是检测虚拟机。我们告诉学生给它起个名字,并告诉他们要使用的区域。

Apache 安装检测器的早期草稿——在学生无法访问的另一台虚拟机上执行,但在学生的 GCP 项目环境中——可以像这样开始:

#!/bin/bash
NAME="required-vm-name"
ZONE="us-central1-a"
IP=$(gcloud compute instances describe ${NAME} --zone ${ZONE} --format json | jq ".networkInterfaces[0].accessConfigs[0].natIP")
echo $IP
curl -v "http://${IP}"

但这会产生输出

"1.2.3.4"  
* Rebuilt URL to: http://"1.2.3.4"/
* Could not resolve host: "1.2.3.4"
* Closing connection 0 curl: (6) Could not resolve host: "1.2.3.4"

我把地址改为 1.2.3.4 但保留了所有其他输出格式。

假设 IP 地址正确,并且 debian apache2 测试页面在此地址正确显示,为什么 curl 无法检测到它?出了什么问题?正确的 IP 在 Chrome 中工作正常。

答案1

curlURL 中的双引号字符串无法正常播放。

-r向命令添加选项jq以返回原始字符串而不是 JSON 格式的字符串。否则jq将默认输出 JSON 格式,对于字符串结果,它将被双引号引起来。

#!/bin/bash
NAME="required-vm-name"
ZONE="us-central1-a"
IP=$(gcloud compute instances describe ${NAME} --zone ${ZONE} --format json | jq -r ".networkInterfaces[0].accessConfigs[0].natIP")
echo $IP
curl -v "http://${IP}"

输出现在更好了。请注意,提取的公共 IP 地址周围没有引号。

1.2.3.4
* Rebuilt URL to: http://1.2.3.4/
*   Trying 1.2.3.4...
* TCP_NODELAY set
* Connected to 1.2.3.4 (1.2.3.4) port 80 (#0)
> GET / HTTP/1.1
> Host: 1.2.3.4
> User-Agent: curl/7.52.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Sun, 24 Feb 2019 11:46:54 GMT
< Server: Apache/2.4.25 (Debian)
< Last-Modified: Sun, 24 Feb 2019 11:21:58 GMT
< ETag: "c-582a20841f053"
< Accept-Ranges: bytes
< Content-Length: 12
< Content-Type: text/html
<
Hello World
* Curl_http_done: called premature == 0
* Connection #0 to host 1.2.3.4 left intact

相关内容