// Пример внешнего модуля для goherence — демонстрирует контракт // stdin/stdout JSON, тот же, что использует и сам goherence для builtin. // Собери его через build.sh и положи результат в modules.d/hello/ // рядом с manifest.json — goherence подхватит его как модуль `hello`. package main import ( "encoding/json" "fmt" "os" ) // Input и Result дублируют контракт из internal/module/module.go — // внешний модуль не импортирует goherence как зависимость (он может // быть написан вообще не на Go), поэтому просто повторяет форму JSON. type Input struct { SchemaVersion int `json:"schema_version"` Args map[string]interface{} `json:"args"` Host string `json:"host"` Become bool `json:"become"` CheckMode bool `json:"check_mode"` } type Result struct { SchemaVersion int `json:"schema_version"` Changed bool `json:"changed"` Failed bool `json:"failed"` Msg string `json:"msg"` Diff interface{} `json:"diff,omitempty"` } func main() { var in Input if err := json.NewDecoder(os.Stdin).Decode(&in); err != nil { fmt.Fprintln(os.Stderr, "hello: невалидный input JSON:", err) os.Exit(1) } name, _ := in.Args["name"].(string) if name == "" { name = "world" } result := Result{ SchemaVersion: 1, Changed: false, // модуль ничего не меняет на хосте — просто демонстрационный Msg: fmt.Sprintf("hello, %s (host=%s, check_mode=%v)", name, in.Host, in.CheckMode), } json.NewEncoder(os.Stdout).Encode(result) }