我有一个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文件。
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