使用YAML文件中的环境变量



我有一个GO脚本,在呼叫报告时生成寻呼机责任,它有自己的配置。Yaml文件:

# PagerDuty auth token
pdAuthToken: 12345
# Explicitly set report time range (RFC822)
reportTimeRange:
start: 01 Jan 20 00:00 UTC
end: 01 Feb 20 00:00 UTC
# Rotation general information
rotationInfo:
dailyRotationStartsAt: 8
checkRotationChangeEvery: 30 # minutes

我需要在配置传递环境变量。yaml文件。我尝试这样使用${THE_VARIABLE}:

reportTimeRange:
start: ${THE_VARIABLE}

有没有人可以帮助我如何在配置中传递我的Linux环境变量。

在对yaml文件进行反编组之后,您可以在结果上使用reflect来更新其值与您选择的变量格式匹配的任何string字段。

var reVar = regexp.MustCompile(`^${(w+)}$`)
func fromenv(v interface{}) {
_fromenv(reflect.ValueOf(v).Elem())// assumes pointer to struct
}
// recursive
func _fromenv(rv reflect.Value) {
for i := 0; i < rv.NumField(); i++ {
fv := rv.Field(i)
if fv.Kind() == reflect.Ptr {
fv = fv.Elem()
}
if fv.Kind() == reflect.Struct {
_fromenv(fv)
continue
}
if fv.Kind() == reflect.String {
match := reVar.FindStringSubmatch(fv.String())
if len(match) > 1 {
fv.SetString(os.Getenv(match[1]))
}
}
}
}

https://play.golang.org/p/1zuK7Mhtvsa


或者,您可以声明实现yaml.Unmarshaler接口的类型,并将这些类型用于配置结构中的字段,这些字段期望相应的yaml属性包含环境变量。

type Config struct {
ReportTimeRange struct {
Start StringFromEnv `yaml:"start"`
} `yaml:"reportTimeRange"`
}
var reVar = regexp.MustCompile(`^${(w+)}$`)
type StringFromEnv string
func (e *StringFromEnv) UnmarshalYAML(value *yaml.Node) error {
var s string
if err := value.Decode(&s); err != nil {
return err
}
if match := reVar.FindStringSubmatch(s); len(match) > 0 {
*e = StringFromEnv(os.Getenv(match[1]))
} else {
*e = StringFromEnv(s)
}
return nil
}

https://play.golang.org/p/Zy0rXJ7RRdC

我所理解的是,您希望在内存中程序启动时用环境变量替换占位符{{ .THE_VARIABLE }},而不修改yaml文件。

这个想法是将yaml文件加载到var中,使用template.Execute来替换数据。最后反编组字符串。

我只是保持简单。

YAML文件:

Start: {{ .THE_VARIABLE }}

替换数据:

fileData, _ := ioutil.ReadFile("test.yml")
var finalData bytes.Buffer
t := template.New("config")
t, err := t.Parse(string(fileData))
if err != nil {
panic(err)
}
data := struct {
THE_VARIABLE int
}{
THE_VARIABLE: 30,  // replace with os.Getenv("FOO")
}
t.Execute(&finalData, data)
str := finalData.String()
fmt.Println(str)
// unmarshal YAML here - from finalData.Bytes()

输出:
Start: 30

最新更新