我在Azure上创建了一个Ubuntu 16.04LTS VM,我需要访问其面向公众的IP才能配置我试图在服务器上运行的docker容器。但是,当我从VM中的终端执行以下命令时:
ip addr show
我只收回私人本地IP而不是面向公众的IP。从VM的终端访问公共IP需要采取哪些步骤?
我希望能够编写获取公共IP的脚本的原因是我们在VM上运行docker容器(我们正在创建多个VM,我们正在JMeter中开发的负载测试框架的一部分)和如果我们可以脚本获取IP并将其传递到服务器启动脚本中的docker容器,那么我们将能够自动化我们的服务器启动,以便当我们从Azure启动服务器时jmeter-server正确运行正确的IP门户。如果无法从bash脚本访问公共IP,我们必须手动SSH到每台计算机并运行docker并将公共IP作为参数传递给docker以启动每个jmeter服务器,这将耗费更多时间。
答案 0 :(得分:4)
AWS和Azure都有 VM元数据:
https://azure.microsoft.com/en-us/blog/what-just-happened-to-my-vm-in-vm-metadata-service/
但目前该Feed返回的信息非常少:
UbuntuInJapan:~$ curl -s http://169.254.169.254/metadata/latest/InstanceInfo
{"ID":"_UbuntuInJapan","UD":"0","FD":"0"}
...只是升级和故障域,对你的努力毫无用处。
对于公共IP,这是我通常做的事情:
#!/bin/bash
PUBLIC_IP=$(curl -s http://checkip.amazonaws.com || printf "0.0.0.0")
# Then you either get the public IP address in the variable or you get 0.0.0.0
# which means you could not make the call to Amazon or Amazon is under DDoS.
# amirite?
# Uncomment to echo (AKA debug mode)
echo $PUBLIC_IP
您可以链接多个什么是我的IP?服务来增加您的SLA。 即:
# First one that works wins.
# You can improve this by regex checking the output.
#
# Something like:
#
# if [[ $PUBLIC_IP =~ [[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\/ ]]
# then echo 'Good. Valid IPv4. Continue.'
# else echo 'Bad. Stop.'
# fi
UbuntuInJapan:~$ curl -s http://checkip.amazonaws.FAILS || curl -s http://canihazip.com/s
13.78.92.21
如果您与IPv6通话,某些服务将返回IPv6,请确保明确将地址系列传递给curl
:
$ curl -4 http://l2.io/ip
13.78.92.21
$ curl -6 http://l2.io/ip
2a02:2f0b:4xxx:fxxx:4xxx:xxxx:xxxx:1072
答案 1 :(得分:1)
以下作品供以后参考:
curl -s -H Metadata:true \
http://169.254.169.254/metadata/instance?api-version=2017-04-02 \
| jq -r .network.interface[].ipv4.ipAddress[].publicIpAddress