go语言实现调用阿里云api,获取hostname和ip字段值,输出exl表

简介: go语言实现调用阿里云api,获取hostname和ip字段值,输出exl表

效果


调用阿里云EMR服务API,获取集群中的主机名和ip地址,输出到exl表中

1675239813314.jpg


实现过程


例子:调用阿里云EMR服务的api,获取集群主机名和ip,输出到exl表

1、去阿里云api文档,查找接口文档

我这里只想获取集群的hostname和ip信息,所以我这里选择的是【查询集群主机列表】即可满足我的需求

1675239840439.jpg

1675239845060.jpg2、把上图右侧代码复制到自己电脑中编辑

1)使用go mod init emr初始化mod仓库

2)直接get下远程仓库代码,使用go mod tidy 自动获取依赖文件

go get github.com/alibabacloud-go/emr-20160408
go get github.com/thedevsaddam/gojsonq
• 1
• 2
go mod tidy

3)修改代码

调用阿里云api,默认返回json格式值,把它转化成字符串,在函数中_main中添加_string返回字符串类型值,得到字符串返回值赋值给HostNameIp字符串变量,gojsonq包调用这个字符串变量,截取字段值,清空覆盖输出到exl表格中

// This file is auto-generated, don't edit it. Thanks.
package main
import (
  "fmt"
  openapi "github.com/alibabacloud-go/darabonba-openapi/client"
  emr20160408 "github.com/alibabacloud-go/emr-20160408/client"
  "github.com/alibabacloud-go/tea/tea"
  "github.com/tealeg/xlsx"
  "github.com/thedevsaddam/gojsonq"
  "os"
)
var HostNameIp string
func CreateClient(accessKeyId *string, accessKeySecret *string) (_result *emr20160408.Client, _err error) {
  config := &openapi.Config{
    // 您的AccessKey ID
    AccessKeyId: accessKeyId,
    // 您的AccessKey Secret
    AccessKeySecret: accessKeySecret,
  }
  // 访问的域名
  config.Endpoint = tea.String("emr.cn-zhangjiakou.aliyuncs.com")
  _result = &emr20160408.Client{}
  _result, _err = emr20160408.NewClient(config)
  return _result, _err
}
func _main(args []*string) (_err error, _string string) {
  client, _err := CreateClient(tea.String("LTxxxxxxD95t"), tea.String("VKrUZeSH5xxxxxxxxxxxxxxxxxvAqM"))//填写AccessKey ID和AccessKey Secret
  if _err != nil {
    return _err, "登录失败"
  }
  listClusterHostRequest := &emr20160408.ListClusterHostRequest{
      StatusList: []*string{tea.String("NORMAL")}, //主机状态
    PageNumber: tea.Int32(1), //分页数
    PageSize: tea.Int32(10), //分页主机数量
    RegionId:  tea.String("cn-zhangjiakou"), //阿里云区域
    ClusterId: tea.String("C-FD39C77B200AEB73"), //集群id
  }
  // 复制代码运行请自行打印 API 的返回值
  List, _err := client.ListClusterHost(listClusterHostRequest)
  if _err != nil {
    return _err, "获取失败"
  }
  ListHostnameip := fmt.Sprint(*List)//把指针类型的值转化成字符串
  fmt.Printf("list的类型是%T", ListHostnameip)
  return _err, ListHostnameip //把得到的json格式值用string类型返回
}
func stdout() {
  jq := gojsonq.New().FromString(HostNameIp).From("body.HostList.Host").Select("HostName", "PrivateIp")//定义字段,在body下的hostlist下的host中截取hostname和privateip值
  deviceInfoList, ok := jq.Get().([]interface{})
  if !ok {
    fmt.Println("Convert deviceInfoList error")
  }
  xlsxFile := xlsx.NewFile()
  sheet, err := xlsxFile.AddSheet("Sheet 1")
  if err != nil {
    fmt.Println(err)
    os.Exit(1)
  }
  sheet.AddRow().WriteSlice(&[]string{"主机名", "IP"}, 3)
  for _, deviceInfo := range deviceInfoList {
    deviceInfoMap, ok := deviceInfo.(map[string]interface{})
    if !ok {
      fmt.Println("Convert deviceInfoMap error")
    }
    row := sheet.AddRow()
    row.AddCell().SetValue(deviceInfoMap["HostName"])
    row.AddCell().SetValue(deviceInfoMap["PrivateIp"])
  }
  xlsxFile.Save("./result.xlsx")
}
func main() {
  err, Hostnameip := _main(tea.StringSlice(os.Args[1:]))
  if err != nil {
    panic(err)
  }
  HostNameIp = fmt.Sprint(Hostnameip)
  stdout()
  //fmt.Println(HostNameIp)
}

上一段代码运行完成后会发现,出现了很多不存在的主机也被输出到xls表格中,根据阿里云提供的api字段修改,可以解决这个问题,指定主机状态和页数

1675239896181.jpg

// This file is auto-generated, don't edit it. Thanks.
package main
import (
  "fmt"
  openapi "github.com/alibabacloud-go/darabonba-openapi/client"
  emr20160408 "github.com/alibabacloud-go/emr-20160408/client"
  "github.com/alibabacloud-go/tea/tea"
  "github.com/tealeg/xlsx"
  "github.com/thedevsaddam/gojsonq"
  "os"
)
var HostNameIp string
func CreateClient(accessKeyId *string, accessKeySecret *string) (_result *emr20160408.Client, _err error) {
  config := &openapi.Config{
    // 您的AccessKey ID
    AccessKeyId: accessKeyId,
    // 您的AccessKey Secret
    AccessKeySecret: accessKeySecret,
  }
  // 访问的域名
  config.Endpoint = tea.String("emr.cn-zhangjiakou.aliyuncs.com")
  _result = &emr20160408.Client{}
  _result, _err = emr20160408.NewClient(config)
  return _result, _err
}
func _main(args []*string) (_err error, _string string) {
  client, _err := CreateClient(tea.String("LTxxxxxxxxxxxxxxxxxxt"), tea.String("VKrUZeS9oDxxxxxxxxxxxxxxxxxxM"))//填写AccessKey ID和AccessKey Secret
  if _err != nil {
    return _err, "登录失败"
  }
  listClusterHostRequest := &emr20160408.ListClusterHostRequest{
    RegionId:  tea.String("cn-zhangjiakou"), //阿里云区域
    ClusterId: tea.String("C-FD39C77B200AEB73"), //集群id
    PageNumber: tea.Int32(1),
    PageSize: tea.Int32(10),
    // Array, 可选, 主机状态列表:  - NORMAL:正常  - ABNORMAL:异常  - RESIZING:配置中  - INITIALIZING:初始化中  - RELEASED:已释放
    StatusList: []*string{tea.String("NORMAL")},
  }
  // 复制代码运行请自行打印 API 的返回值
  List, _err := client.ListClusterHost(listClusterHostRequest)
  if _err != nil {
    return _err, "获取失败"
  }
  ListHostnameip := fmt.Sprint(*List)//把指针类型的值转化成字符串
  fmt.Printf("list的类型是%T", ListHostnameip)
  return _err, ListHostnameip //把得到的json格式值用string类型返回
}
func stdout() {
  jq := gojsonq.New().FromString(HostNameIp).From("body.HostList.Host").Select("HostName", "PrivateIp")//定义字段,在body下的hostlist下的host中截取hostname和privateip值
  deviceInfoList, ok := jq.Get().([]interface{})
  if !ok {
    fmt.Println("Convert deviceInfoList error")
  }
  xlsxFile := xlsx.NewFile()
  sheet, err := xlsxFile.AddSheet("Sheet 1")
  if err != nil {
    fmt.Println(err)
    os.Exit(1)
  }
  sheet.AddRow().WriteSlice(&[]string{"主机名", "IP"}, 3)
  for _, deviceInfo := range deviceInfoList {
    deviceInfoMap, ok := deviceInfo.(map[string]interface{})
    if !ok {
      fmt.Println("Convert deviceInfoMap error")
    }
    row := sheet.AddRow()
    row.AddCell().SetValue(deviceInfoMap["HostName"])
    row.AddCell().SetValue(deviceInfoMap["PrivateIp"])
  }
  xlsxFile.Save("./result.xlsx")
}
func main() {
  err, Hostnameip := _main(tea.StringSlice(os.Args[1:]))
  if err != nil {
    panic(err)
  }
  HostNameIp = fmt.Sprint(Hostnameip)
  stdout()
  //fmt.Println(HostNameIp)
}

再次打开xls表格,会发现与现有集群信息一致

1675239922177.jpg


相关文章
|
8月前
|
API 微服务
阿里云微服务引擎 MSE 及 API 网关 2025 年 9 月产品动态
阿里云微服务引擎 MSE 及 API 网关 2025 年 9 月产品动态。
854 70
|
8月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
392 2
|
9月前
|
人工智能 运维 监控
阿里云 API 聚合实战:破解接口碎片化难题,3 类场景方案让业务响应提速 60%
API聚合破解接口碎片化困局,助力开发者降本增效。通过统一中间层整合微服务、第三方接口与AI模型,实现调用次数减少60%、响应提速70%。阿里云实测:APISIX+函数计算+ARMS监控组合,支撑百万级并发,故障定位效率提升90%。
655 0
|
9月前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 API 网关 2025 年 9 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要。
612 142
|
9月前
|
人工智能 自然语言处理 安全
探索 API 的无限可能:阿里云的卓越引领
API是数字化时代的“万能钥匙”,阿里云凭借云控制API、API网关、OpenAPI Explorer等产品,构建全方位API生态,助力企业高效集成、安全管控与创新升级,推动电商、制造等行业智能化转型,引领未来科技浪潮。
332 10
|
9月前
|
人工智能 API 监控
告别多接口拼凑!阿里云 API 模型聚合实现技术能力协同跃迁
API聚合整合400+国内外AI模型,统一接口、屏蔽差异,降低开发与维护成本,提升效率与系统稳定性,助力开发者高效应对多API调用困境。
939 0
API 微服务
222 0
|
8月前
|
人工智能 自然语言处理 测试技术
Apipost智能搜索:只需用业务语言描述需求,就能精准定位目标接口,API 搜索的下一代形态!
在大型项目中,API 数量庞大、命名不一,导致“找接口”耗时费力。传统工具依赖关键词搜索,难以应对语义模糊或命名不规范的场景。Apipost AI 智能搜索功能,支持自然语言查询,如“和用户登录有关的接口”,系统可理解语义并精准匹配目标接口。无论是新人上手、模糊查找还是批量定位,都能大幅提升检索效率,降低协作成本。从关键词到语义理解,智能搜索让开发者少花时间找接口,多专注核心开发,真正实现高效协作。
|
8月前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
8月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南