@@ -17,6 +17,7 @@ import (
17
17
18
18
type SaltActionRequest struct {
19
19
Master SaltMaster `json:"master,omitempty"`
20
+ Masters []SaltMaster `json:"masters,omitempty"`
20
21
Minions []SaltMinion `json:"minions,omitempty"`
21
22
Action string `json:"action"`
22
23
}
@@ -35,6 +36,7 @@ type SaltMinion struct {
35
36
Address string `json:"address"`
36
37
Roles []string `json:"roles,omitempty"`
37
38
Server string `json:"server,omitempty"`
39
+ Servers []string `json:"servers,omitempty"`
38
40
HostGroup string `json:"hostGroup,omitempty"`
39
41
Domain string `json:"domain,omitempty"`
40
42
}
@@ -78,11 +80,22 @@ func distributeActionImpl(distributeActionRequest func([]string, string, string,
78
80
}
79
81
80
82
action := strings .ToLower (request .Action )
83
+ log .Printf ("[distributeActionImpl] send action request to minions: %s" , targets )
81
84
for res := range distributeActionRequest (targets , SaltMinionEp + "/" + action , user , pass , signature , signed ) {
82
85
result = append (result , res )
83
86
}
84
87
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 )
86
99
result = append (result , <- distributeActionRequest ([]string {request .Master .Address }, SaltServerEp + "/" + action , user , pass , signature , signed ))
87
100
}
88
101
return result
@@ -140,7 +153,15 @@ func SaltMinionRunRequestHandler(w http.ResponseWriter, req *http.Request) {
140
153
return
141
154
}
142
155
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
+ }
144
165
err = ioutil .WriteFile (baseDir + "/etc/salt/minion.d/master.conf" , masterConf , 0644 )
145
166
if err != nil {
146
167
resp = model.Response {ErrorText : err .Error (), StatusCode : http .StatusInternalServerError }
@@ -179,7 +200,21 @@ func SaltServerRunRequestHandler(w http.ResponseWriter, req *http.Request) {
179
200
return
180
201
}
181
202
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
+
183
218
ensureIpv6Resolvable (saltMaster .Domain )
184
219
if err != nil {
185
220
log .Printf ("[SaltServerRunRequestHandler] [ERROR] while hostfile update: %s" , err )
0 commit comments