利用GCloud SDK更换谷歌云(GCP)IP地址

Linux, 折腾 2020/01/07

谷歌云,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 NATexternal-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脚本

随便写的:https://file.bugxia.com/s/9SzAoxTkRsXkQw6

本文标签:


18 条评论

  • 大魔王万岁 评论于 回复

    一开始以为能通过rest api的方式去跑,折腾了半天,结果还是得用它的官方工具,感谢作者分享

  • lingling 评论于 回复

    弱弱的问一下 切换来切换去 还是那3个IP 有人解决了吗

  • YDG 评论于 回复

    您好,今天深夜很开心能够看到这一篇文章。我是一个小小小白,刚刚学会了如何用谷歌云搭建虚拟机实例,我常常因为要换用新的Ip地址而烦恼,每次都要手动一个个点预留再释放,这种操作方式而苦恼,很想向您请教几个问题不知道能否与您搭上联系呢?

    • Bug侠 评论于 回复

      @YDG
      请直接留言即可

      • YDG 评论于 回复

        @Bug侠
        我一个项目里面有8个虚拟机实例,有什么办法可以快速让这8个实例的Ip更变吗

        • Bug侠 评论于 回复

          @YDG
          还是基于本文的shell脚本,需要改造一下,比如:
          array=(“实例名称1” “实例名称2” “实例名称3”)
          for(( i=0;i<${#array[@]};i++)) do #shell脚本里的实例名称替换为变量 #删除IP —— 创建IP —— 查询IP —— 删除配置 —— 绑定IP done;

          • YDG 评论于 回复

            @Bug侠
            可以加下你微信或者Q吗?我的V:a7379274

            • Bug侠 评论于 回复

              @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可以

    • Bug侠 评论于 回复

      @大熊
      感谢分享~ :萌:
      抱歉啊,我一直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

  • 大熊 评论于 回复

    也加双引号,单引号,都试过了,还是搞不定

  • 大熊 评论于 回复

    ERROR: (gcloud.compute.instances.delete-access-config) unrecognized arguments: NAT

    好像是External NAT的空格导致的,请问下作者,这问题如何处理

    谢谢

  • 评论(本站已开启评论回复邮件通知功能,请如实填写邮箱以便及时收到回复)