我有一個 GO 腳本,它在呼叫報告時生成尋呼機職責,它有自己的 config.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
我需要在 config.yaml 檔案中傳遞環境變數。我試圖這樣使用${THE_VARIABLE}:
reportTimeRange:
start: ${THE_VARIABLE}
任何人都可以幫助我如何在 config.yaml 檔案中傳遞我的 Linux 環境變數而無需編輯腳本。
uj5u.com熱心網友回復:
解組 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
uj5u.com熱心網友回復:
我的理解是,您想{{ .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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/334900.html
