轉自:https://segmentfault.com/a/1190000000513137
今天在進行 saltstack 多環境的時候,遇到一個問題,最終得到解決,好記性不如爛筆頭,記錄。
首先,我在 salt master 服務器上對 /etc/salt/master
配置文件進行多環境配置,配置文件如下:
file_roots: base: - /srv/salt/base dev: - /srv/salt/dev prod: - /srv/salt/prod test: - /srv/salt/test
然后在分別建立配置文件所配置的目錄。
其中我的 /srv/salt/prod
的目錄樹如下:
/srv/salt/prod
|-- nginx | `-- stock.sls |-- stock.prod.com | `-- nginx | `-- stock.prod.com `-- top.sls
我做這個主要是為了對集群中的 nginx
的配置文件進行批量管理,當配置文件變更后,能進行批量推送。
弄完以上后,執行命令讓其生效:
sudo salt -N STOCK state.highstate -v
執行完畢,能成功生效,但是突然想到個問題,這個是全局的所有的環境的所有的狀態生效,如果我要只對 prod
環境的某一個狀態生效呢,或者是其他的環境。於是查看官方文檔,發現了可以使用 state.sls
來指定特定的進行處理,當時也沒有細看,就直接執行命令:
sudo salt -N STOCK state.sls nginx.stock
結果執行報錯,告訴我在 base
下面沒有匹配到 nginx.stock
當時想,不應該是,我不是定義了么,開始是以為 state.sls
和 state.highstate
一樣,會對所有的環境遍歷。
有問題,就 google 唄,然后 google 了下沒有出來,啃官方文檔去,找到 state.sls
的那段,發現定義如下:
salt.modules.state.sls(mods,saltenv='base',test=None,exclude=None,queue=False,env=None,concurrent=False,**kwargs)
從上面可以看出, state.sls
默認的運行環境是 base
,另外通過查看了下 saltstack 的 google groups ,發現綠肥也對這個解答了下, state.sls
並不讀取 top.sls
,所以 state.sls
需要單獨執行哪些 sls 的話,需要你自定義。
綠肥解答的連接請點擊這里
注:由於萬惡的長城的存在,請准備梯子。
經過上面的查看,因此,修正執行命令
sudo salt -N STOCK state.sls saltenv='prod' nginx.stock
多加一個參數 saltenv
,問題解決。更詳細的內容請看官方的文檔介紹 - salt.modules.state.sls