ご存知のとおり、GolangはCLIツールの作成に適していますが、Golangが構成ファイルをパッケージ化できることをご存じないかもしれません。
バックグラウンド
最近、Alibaba Cloud ECSの管理を含むCLIツールを作成しています。もちろん、AlibabaCloudリソース使用のセキュリティをここで考慮する必要があります。AlibabaCloudアカウントのAccessKeyIdとAccessKeySecretをのユーザーに配布できないようにする必要があります。 CLIツール。
したがって、ここでは、AccessKeyIdとAccessKeySecretを含む構成ファイルをCLIツールにパッケージ化することを選択します。デフォルトでは、CLIツールのユーザーはパッケージ化された構成ファイルを使用します。もちろん、構成を指定することで新しい構成ファイルを使用することもできます。ファイルまたは受け渡しパラメータ。構成情報。
達成
道具
ここでは、任意のファイルをGoコードに変換できるGolangライブラリを紹介します。このライブラリをgo-bindata
使用して、バイナリファイルをGoプログラムに埋め込むことができます。また、生のバイトスライスに変換する前にファイルデータを圧縮するためにgzipがサポートされています。
ツールの具体的な紹介については、github.com /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
パッケージ名を指定すると、呼び出しは次のように記述されます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ジョブと同様のビジュアルインターフェイスに再パッケージ化できます。これは、ユーザーにとって便利であり、ユーザーによるツールの使用範囲を制限できます。 CLIツールのパラメーター。
元のリンク:k8scat.com/posts/build…