Golang打包配置文件的实现示例

作者:K8sCat 时间:2024-01-30 17:23:25 

目录
  • 背景

  • 实现

    • 工具

    • 打包

    • 调用

  • 总结

    众所周知,Golang 适合写 CLI 工具,但你可能还不知道 Golang 还可以打包配置文件。

    背景

    最近在写一个涉及到管理阿里云 ECS 的 CLI 工具,这里当然就要考虑阿里云资源使用的安全性了,要求阿里云账号的 AccessKeyId 和 AccessKeySecret 不能下发给 CLI 工具的使用者。

    Golang打包配置文件的实现示例

    所以这里选择将一份包含 AccessKeyId 和 AccessKeySecret 的配置文件打包进了 CLI 工具中,CLI 工具的使用者默认将使用已经打包了的配置文件,当然也可以通过指定配置文件或传递参数的方式使用新的配置信息。

    实现

    工具

    这里将介绍 Golang 的一个可以把任意文件转换成 Go 代码的库 go-bindata,可以用于嵌入二进制文件到 Go 程序中。同时,也支持在转换成原始的字节切片前使用 gzip 进行压缩文件数据。
    关于该工具的具体介绍请跳转至 https://github.com/go-bindata/go-bindata

    打包

    使用 go-bindata 工具将包含敏感信息的配置文件转换成 Go 的源代码,下面是项目 Makefile 的部分内容,工具名称就叫 mycli 吧。


    NAME = mycli
    CONFIG = configs/config.yaml

    .PHONY: build

    build:
       cp $(CONFIG) config.yaml
       mkdir -p cmd/mycli/asset
       go-bindata -pkg asset -o cmd/mycli/asset/asset.go \
           scripts/... \
           config.yaml

    CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/linux/mycli cmd/mycli/*.go
       CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o bin/darwin/mycli cmd/mycli/*.go

    chmod +x ./bin/linux/mycli ./bin/darwin/mycli
       rm -f config.yaml mycli
       ln -s bin/linux/mycli mycli

    其中将文件转换成 Go 源代码的部分如下:


    go-bindata -pkg asset -o cmd/mycli/asset/asset.go \
       scripts/... \
       config.yaml

    关于 go-bindata 命令行工具的选项说明:

    • -pkg 指定 package 名称,调用的写法将变成 asset.Asset("config.yaml")

    • -o 指定生成的 Go 源代码存放的位置

    生成的 asset.go 代码如下:


    // Code generated by go-bindata.
    // sources:
    // scripts/create.sh
    // scripts/sub/delete.sh
    // config.yaml
    // DO NOT EDIT!

    package asset

    func bindataRead(data []byte, name string) ([]byte, error) {
       ...
    }

    type asset struct {
    bytes []byte
    info  os.FileInfo
    }

    type bindataFileInfo struct {
    name    string
    size    int64
    mode    os.FileMode
    modTime time.Time
    }

    func (fi bindataFileInfo) Name() string {
    return fi.name
    }
    func (fi bindataFileInfo) Size() int64 {
    return fi.size
    }
    func (fi bindataFileInfo) Mode() os.FileMode {
    return fi.mode
    }
    func (fi bindataFileInfo) ModTime() time.Time {
    return fi.modTime
    }
    func (fi bindataFileInfo) IsDir() bool {
    return false
    }
    func (fi bindataFileInfo) Sys() interface{} {
    return nil
    }

    ...

    调用

    使用 Asset 方法进行加载打包好的配置文件:


    const preloadConfigFile = "config.yaml"

    type Config struct {
       ...
    }

    func PreloadConfig() (*Config, error) {
       b, err := asset.Asset(preloadConfigFile)
       if err != nil {
           return nil, fmt.Errorf("failed to read config: %v", err)
       }
       var config *Config
       err = yaml.Unmarshal(b, &config)
       return config, err
    }

    总结

    使用 go-bindata 将文件转换成 Go 的源代码,然后编译成二进制文件,最终只需要将二进制文件交给使用者,通过这种方式可以减少工具的使用者对一些敏感信息的直接接触,保障资源的安全性。
    其实,真正要做到对资源访问的完全把控,可以将 CLI 工具再次进行封装成 Jenkins job 类似的可视化操作界面,既方便使用者使用,又可以限制使用者对工具的使用范围,包括传递给 CLI 工具的参数。

    来源:https://juejin.cn/post/6943973550185250847

    标签:Golang,打包,配置文件
    0
    投稿

    猜你喜欢

  • Python关于print的操作(倒计时、转圈显示、进度条)

    2022-08-19 07:26:58
  • Python+selenium破解拼图验证码的脚本

    2023-11-22 05:24:05
  • python logging添加filter教程

    2022-08-21 00:36:43
  • MYSQL中binlog优化的一些思考汇总

    2024-01-23 01:58:25
  • 利用pandas读取中文数据集的方法

    2021-11-23 12:33:48
  • asp生成UTF-8格式的文件方法

    2008-01-26 20:59:00
  • Python中pillow知识点学习

    2023-11-26 05:27:01
  • 详解用pyecharts Geo实现动态数据热力图城市找不到问题解决

    2022-02-04 14:10:29
  • python数组处理之最值与下标问题

    2023-06-01 12:13:27
  • Python的词法分析与语法分析

    2022-06-20 13:58:34
  • Python脚本实现网卡流量监控

    2022-11-27 11:36:51
  • JavaScript深入理解作用域链与闭包详情

    2024-04-19 10:04:07
  • 自定义PyCharm快捷键的设置方式

    2023-11-20 08:28:08
  • go语言 xorm框架 postgresql 的用法及详细注解

    2024-04-25 15:26:45
  • 详解Python中pyautogui库的最全使用方法

    2022-11-17 17:07:14
  • python画一个玫瑰和一个爱心

    2023-03-24 11:33:28
  • python爬虫解决验证码的思路及示例

    2021-07-21 19:23:04
  • Python pytesseract验证码识别库用法解析

    2023-06-13 19:04:02
  • windows下python安装paramiko模块和pycrypto模块(简单三步)

    2021-11-29 01:18:40
  • 你需要理解的关于MySQL的锁知识

    2024-01-21 05:17:11
  • asp之家 网络编程 m.aspxhome.com