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


相关文章
|
1天前
|
程序员 Go PHP
为什么大部分的 PHP 程序员转不了 Go 语言?
【9月更文挑战第8天】大部分 PHP 程序员难以转向 Go 语言,主要因为:一、编程习惯与思维方式差异,如语法风格和编程范式;二、学习成本高,需掌握新知识体系且面临项目压力;三、职业发展考量,现有技能价值及市场需求不确定性。学习新语言虽有挑战,但对拓宽职业道路至关重要。
22 10
|
2天前
|
算法 程序员 Go
PHP 程序员学会了 Go 语言就能唬住面试官吗?
【9月更文挑战第8天】学会Go语言可提升PHP程序员的面试印象,但不足以 solely “唬住” 面试官。学习新语言能展现学习能力、拓宽技术视野,并增加就业机会。然而,实际项目经验、深入理解语言特性和综合能力更为关键。全面展示这些方面才能真正提升面试成功率。
20 10
|
1天前
|
编译器 Go
go语言学习记录(关于一些奇怪的疑问)有别于其他编程语言
本文探讨了Go语言中的常量概念,特别是特殊常量iota的使用方法及其自动递增特性。同时,文中还提到了在声明常量时,后续常量可沿用前一个值的特点,以及在遍历map时可能遇到的非顺序打印问题。
|
6天前
|
安全 大数据 Go
深入探索Go语言并发编程:Goroutines与Channels的实战应用
在当今高性能、高并发的应用需求下,Go语言以其独特的并发模型——Goroutines和Channels,成为了众多开发者眼中的璀璨明星。本文不仅阐述了Goroutines作为轻量级线程的优势,还深入剖析了Channels作为Goroutines间通信的桥梁,如何优雅地解决并发编程中的复杂问题。通过实战案例,我们将展示如何利用这些特性构建高效、可扩展的并发系统,同时探讨并发编程中常见的陷阱与最佳实践,为读者打开Go语言并发编程的广阔视野。
|
3天前
|
存储 Shell Go
Go语言结构体和元组全面解析
Go语言结构体和元组全面解析
|
8天前
|
Go
golang语言之go常用命令
这篇文章列出了常用的Go语言命令,如`go run`、`go install`、`go build`、`go help`、`go get`、`go mod`、`go test`、`go tool`、`go vet`、`go fmt`、`go doc`、`go version`和`go env`,以及它们的基本用法和功能。
20 6
|
8天前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
16 3
|
API 定位技术
百度地图IP对应的API查询
http://developer.baidu.com/map/ip-location-api.htm
890 0
|
28天前
|
机器人 API Python
智能对话机器人(通义版)会话接口API使用Quick Start
本文主要演示了如何使用python脚本快速调用智能对话机器人API接口,在参数获取的部分给出了具体的获取位置截图,这部分容易出错,第一次使用务必仔细参考接入参数获取的位置。
|
13天前
|
存储 JSON API
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 淘宝API接口(如淘宝开放平台提供的API)允许开发者获取淘宝商品的各种信息,包括商品详情。然而,需要注意的是,直接访问淘宝的商品数据API通常需要商家身份或开发者权限,并且需要遵循淘宝的API使用协议。
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者