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


相关文章
|
5天前
|
存储 JSON 监控
Viper,一个Go语言配置管理神器!
Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
23 2
|
4天前
|
Go 索引
go语言中的循环语句
【11月更文挑战第4天】
13 2
|
4天前
|
Go C++
go语言中的条件语句
【11月更文挑战第4天】
15 2
|
6天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
4天前
|
Go
go语言中的 跳转语句
【11月更文挑战第4天】
12 4
|
4天前
|
JSON 安全 Go
Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
14 1
|
5天前
|
Go 调度 开发者
探索Go语言中的并发模式:goroutine与channel
在本文中,我们将深入探讨Go语言中的核心并发特性——goroutine和channel。不同于传统的并发模型,Go语言的并发机制以其简洁性和高效性著称。本文将通过实际代码示例,展示如何利用goroutine实现轻量级的并发执行,以及如何通过channel安全地在goroutine之间传递数据。摘要部分将概述这些概念,并提示读者本文将提供哪些具体的技术洞见。
|
9天前
|
JavaScript Java Go
探索Go语言在微服务架构中的优势
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出。本文将深入探讨Go语言在构建微服务时的性能优势,包括其在内存管理、网络编程、并发模型以及工具链支持方面的特点。通过对比其他流行语言,我们将揭示Go语言如何成为微服务架构中的一股清流。
|
8天前
|
Ubuntu 编译器 Linux
go语言中SQLite3驱动安装
【11月更文挑战第2天】
31 7
|
9天前
|
关系型数据库 Go 网络安全
go语言中PostgreSQL驱动安装
【11月更文挑战第2天】
38 5

热门文章

最新文章