Como todos sabemos, Golang es adecuado para escribir herramientas CLI, pero es posible que no sepa que Golang también puede empaquetar archivos de configuración.
antecedentes
Recientemente, estoy escribiendo una herramienta CLI que implica administrar Alibaba Cloud ECS. Por supuesto, la seguridad del uso de recursos de Alibaba Cloud debe tenerse en cuenta aquí. Se requiere que AccessKeyId y AccessKeySecret de la cuenta de Alibaba Cloud no se puedan distribuir a los usuarios de la herramienta CLI.
Por lo tanto, aquí elegimos empaquetar un archivo de configuración que contiene AccessKeyId y AccessKeySecret en la herramienta CLI. De manera predeterminada, los usuarios de la herramienta CLI usarán el archivo de configuración empaquetado. Por supuesto, también pueden usar el nuevo archivo de configuración especificando la configuración archivo o paso de parámetros información de configuración.
lograr
herramienta
Aquí presentaremos una biblioteca Golang que puede convertir archivos arbitrarios en código Go go-bindata
, que se puede usar para incrustar archivos binarios en programas Go. Además, gzip es compatible para comprimir datos de archivos antes de convertirlos en segmentos de bytes sin procesar.
Para obtener una introducción específica a la herramienta, vaya a github.com/go-bindata/…
Paquete
Utilice la go-bindata
herramienta para convertir el archivo de configuración que contiene información confidencial en el código fuente de Go. Lo siguiente es parte del proyecto Makefile. El nombre de la herramienta se llama 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
复制代码
La parte que convierte el archivo al código fuente de Go es la siguiente:
go-bindata -pkg asset -o cmd/mycli/asset/asset.go \
scripts/... \
config.yaml
复制代码
Descripciones de opciones para la herramienta de línea de comandos go-bindata:
-pkg
Especifique el nombre del paquete y la llamada se escribirá comoasset.Asset("config.yaml")
-o
Especifica la ubicación donde se almacena el código fuente de Go generado
El asset.go
código es el siguiente:
// 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
}
...
复制代码
transferir
Utilice el Asset
método para cargar el archivo de configuración empaquetado:
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
}
复制代码
Resumir
Use go-bindata para convertir el archivo en el código fuente de Go y luego compílelo en un archivo binario. Al final, solo necesita entregar el archivo binario al usuario. De esta manera, el contacto directo del usuario de la herramienta con se puede reducir parte de la información sensible y se pueden garantizar los recursos.
De hecho, para lograr realmente un control completo sobre el acceso a los recursos, la herramienta CLI se puede volver a empaquetar en una interfaz visual similar a un trabajo de Jenkins, lo cual es conveniente para los usuarios y puede limitar el alcance del uso de la herramienta por parte del usuario, incluida la transferencia a Parámetros para la herramienta CLI.
Enlace original: k8scat.com/posts/build…