利用GCloud SDK更换谷歌云(GCP)IP地址
谷歌云,Google Cloud Platform,以下简称GCP
最近GCP的香港线路老是炸,一到高峰期丢包非常严重,虽然WEB端可以给实例(Compute Instance)更换IP,但是还是想着利用API来实现。记录一下折腾的过程。
我换来换去就那几个地址(貌似是3个),有没有路过的大佬指点迷津,感谢感谢
以下操作均在 CentOS 7 下执行
一、安装SDK
其他系统安装SDK环境见:https://cloud.google.com/sdk/docs/
SSH端执行
sudo tee -a /etc/yum.repos.d/google-cloud-sdk.repo << EOM
[google-cloud-sdk]
name=Google Cloud SDK
baseurl=https://packages.cloud.google.com/yum/repos/cloud-sdk-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOM
注:gpgkey 的第二行必须缩进,如上文所示,也可以直接vim\vi\nano新建此文件
开始安装
yum install google-cloud-sdk -y
二、初始化
gcloud init
复制网址到浏览器,授权登录,获得一串验证码并粘贴回SSH窗口,都是常规操作,就不再啰嗦
注意这里需要记录一下 项目名称(Project Name),后面的命令需要用到,假设我这里是 fifth-test-123456
登录初始化完毕后,可以验证一下,执行:
gcloud compute instance list
可以列出当前项目下的实例,需要记录下 实例名称(Instance Name),我这里是 instance-3
查看IP地址池
gcloud compute addresses list
记录红框标记处的 IP名称(IP Name),比如我的是 a
三、开始更换
假设现在的实例已分配IP,则更换的步骤主要是:
删除IP —— 创建IP —— 查询IP —— 删除配置 —— 绑定IP
1.删除IP
gcloud compute addresses delete IP名称 -q
执行成功后,实例已绑定的静态IP将会变为临时IP,此时这个IP还是可以正常访问到实例的
-q
参数表示忽略所有确认提示
2.创建IP
gcloud compute addresses create 需创建的IP名称 --project=项目名称 --region=区域,香港为asia-east2
这行命令中 需创建的IP名称 任意填写,比如还是 a
成功执行后会随机创建一个新的IP,不过此时该IP并未分配到实例上,无法正常访问
3.获取IP
由于创建后并不会回显创建的IP是多少,只能自行查询,记录查询到的新IP地址
gcloud compute addresses list
4.删除ACCESS-CONFIG
P.S 这里我不知道为什么WEB端可以一键操作,到了SDK下却需要多做这一步
gcloud compute instances describe 实例名称
找到 accessConfigs - name
这一项,记录该值,一般为 External NAT
或 external-nat
删除配置
gcloud compute instances delete-access-config 实例名称 --access-config-name "External NAT或external-nat"
此时IP池仅剩新分配的IP,并且未绑定到实例
5.绑定IP
gcloud compute instances add-access-config 实例名称 --project=项目名称 --address=新IP地址
至此已完成实例的IP重新分配,可以测试一下了。
四、自动化
做到这就得考虑考虑怎么让它自动化的运作起来,写个脚本吧,一键更换GCP IP脚本
18 条评论
一开始以为能通过rest api的方式去跑,折腾了半天,结果还是得用它的官方工具,感谢作者分享
弱弱的问一下 切换来切换去 还是那3个IP 有人解决了吗
您好,今天深夜很开心能够看到这一篇文章。我是一个小小小白,刚刚学会了如何用谷歌云搭建虚拟机实例,我常常因为要换用新的Ip地址而烦恼,每次都要手动一个个点预留再释放,这种操作方式而苦恼,很想向您请教几个问题不知道能否与您搭上联系呢?
@YDG
请直接留言即可
@Bug侠
我一个项目里面有8个虚拟机实例,有什么办法可以快速让这8个实例的Ip更变吗
@YDG
还是基于本文的shell脚本,需要改造一下,比如:
array=(“实例名称1” “实例名称2” “实例名称3”)
for(( i=0;i<${#array[@]};i++)) do #shell脚本里的实例名称替换为变量 #删除IP —— 创建IP —— 查询IP —— 删除配置 —— 绑定IP done;
@Bug侠
可以加下你微信或者Q吗?我的V:a7379274
@YDG
QQ群1150222959的群主就是我
另外贡献一下,godaddy的域名解析代码,作为第六部分。
#6.通知DDNS服务更新域名解析
echo -e “${Green_font_prefix} 正在解析新IP地址:${NewIP} ${Font_color_suffix}”
curl -s -X PUT “https://api.godaddy.com/v1/domains/域名/records/A/二级域名” -H “Authorization:sso-key key:secret” -H “Content-Type: application/json” -d “[{\”data\”:\”${NewIP}\”,\”ttl\”:600}]”
感谢作者,终于成功了。原因是脚本中对于AccessConfig的Name没有加双引号。我改了下脚本就过了。
gcloud compute instances delete-access-config ${InstanceName} –access-config-name “$Result”.
另外,我在IP那里加了个过滤,避免多台主机的多个IP影响。
#3.获取IP
echo -e “${Green_font_prefix} 正在获取新IP地址 ${Font_color_suffix}”
NewIP=$(gcloud compute addresses list –filter=”region:(${RegionName})” –format=”get(address)”)
echo -e “新IP地址为:${NewIP}”
@大熊
但确实,Ubuntu下不行,加了也没用。而Centos 7可以
@大熊
感谢分享~
抱歉啊,我一直CentOS顺手,所以就没测Ubuntu的
多个IP的影响确实没有考虑到
难道是系统环境和版本的问题?
我的是:Linux version 4.18.9-1.el6.elrepo.x86_64 (mockbuild@Build64R6) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-23) (GCC)) #1 SMP Thu Sep 20 11:27:37 EDT 2018
也加双引号,单引号,都试过了,还是搞不定
@大熊
呃……我这边又实测了一下,我用的英文双引号,没有问题的,见图:
https://bugxia.com/wp-content/uploads/2020/02/20200219112552301.png
你再检查检查?
@Bug侠
http://m.weoper.com/01.png
我也截了个图,您看下呢
@Bug侠
绝望了,我重装了个Centos 7,也是在删除的时候报这个错。
ERROR: (gcloud.compute.instances.delete-access-config) unrecognized arguments: NAT
好像是External NAT的空格导致的,请问下作者,这问题如何处理
谢谢