Skip to content

Commit 9915683

Browse files
author
Krisztian Horvath
committed
support multiple salt-masters
1 parent ad9788b commit 9915683

File tree

2 files changed

+42
-5
lines changed

2 files changed

+42
-5
lines changed

saltboot/salt.go

+38-3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717

1818
type SaltActionRequest struct {
1919
Master SaltMaster `json:"master,omitempty"`
20+
Masters []SaltMaster `json:"masters,omitempty"`
2021
Minions []SaltMinion `json:"minions,omitempty"`
2122
Action string `json:"action"`
2223
}
@@ -35,6 +36,7 @@ type SaltMinion struct {
3536
Address string `json:"address"`
3637
Roles []string `json:"roles,omitempty"`
3738
Server string `json:"server,omitempty"`
39+
Servers []string `json:"servers,omitempty"`
3840
HostGroup string `json:"hostGroup,omitempty"`
3941
Domain string `json:"domain,omitempty"`
4042
}
@@ -78,11 +80,22 @@ func distributeActionImpl(distributeActionRequest func([]string, string, string,
7880
}
7981

8082
action := strings.ToLower(request.Action)
83+
log.Printf("[distributeActionImpl] send action request to minions: %s", targets)
8184
for res := range distributeActionRequest(targets, SaltMinionEp+"/"+action, user, pass, signature, signed) {
8285
result = append(result, res)
8386
}
8487

85-
if len(request.Master.Address) > 0 {
88+
if request.Masters != nil && len(request.Masters) > 0 {
89+
var masters []string
90+
for _, master := range request.Masters {
91+
masters = append(masters, master.Address)
92+
}
93+
log.Printf("[distributeActionImpl] send action request to masters: %s", masters)
94+
for res := range distributeActionRequest(masters, SaltServerEp+"/"+action, user, pass, signature, signed) {
95+
result = append(result, res)
96+
}
97+
} else if len(request.Master.Address) > 0 {
98+
log.Printf("[distributeActionImpl] send action request to master: %s", request.Master.Address)
8699
result = append(result, <-distributeActionRequest([]string{request.Master.Address}, SaltServerEp+"/"+action, user, pass, signature, signed))
87100
}
88101
return result
@@ -140,7 +153,15 @@ func SaltMinionRunRequestHandler(w http.ResponseWriter, req *http.Request) {
140153
return
141154
}
142155

143-
masterConf := []byte("master: " + saltMinion.Server)
156+
var masterConf []byte
157+
servers := saltMinion.Servers
158+
if servers != nil && len(servers) > 0 {
159+
log.Printf("[SaltMinionRunRequestHandler] multiple salt masters: %s", servers)
160+
masterConf, _ = yaml.Marshal(map[string][]string{"master": servers})
161+
} else {
162+
log.Printf("[SaltMinionRunRequestHandler] single salt master: %s", saltMinion.Server)
163+
masterConf, _ = yaml.Marshal(map[string][]string{"master": []string{saltMinion.Server}})
164+
}
144165
err = ioutil.WriteFile(baseDir+"/etc/salt/minion.d/master.conf", masterConf, 0644)
145166
if err != nil {
146167
resp = model.Response{ErrorText: err.Error(), StatusCode: http.StatusInternalServerError}
@@ -179,7 +200,21 @@ func SaltServerRunRequestHandler(w http.ResponseWriter, req *http.Request) {
179200
return
180201
}
181202

182-
saltMaster := saltActionRequest.Master
203+
index, err := strconv.Atoi(req.URL.Query().Get("index"))
204+
if err != nil {
205+
log.Printf("[SaltMinionRunRequestHandler] [ERROR] missing index: %s", err)
206+
model.Response{Status: err.Error()}.WriteBadRequestHttp(w)
207+
return
208+
}
209+
210+
var saltMaster SaltMaster
211+
masters := saltActionRequest.Masters
212+
if masters != nil && len(masters) > 0 {
213+
saltMaster = masters[index]
214+
} else {
215+
saltMaster = saltActionRequest.Master
216+
}
217+
183218
ensureIpv6Resolvable(saltMaster.Domain)
184219
if err != nil {
185220
log.Printf("[SaltServerRunRequestHandler] [ERROR] while hostfile update: %s", err)

saltboot/salt_test.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,10 @@ func TestSaltMinionRunRequestHandler(t *testing.T) {
9494
}
9595

9696
content, _ := ioutil.ReadFile(tempDirName + "/etc/salt/minion.d/master.conf")
97-
expected := "master: server"
98-
if string(content) != expected {
97+
var masters map[string][]string
98+
yaml.Unmarshal(content, &masters)
99+
expected := map[string][]string{"master": []string{"server"}}
100+
if masters["master"][0] != expected["master"][0] {
99101
t.Errorf("master config not match %s == %s", expected, string(content))
100102
}
101103

0 commit comments

Comments
 (0)