寫在前面的話html
遠程執行能夠說是咱們使用 Saltstack 最爲基礎的目的。因此在這裏專門做爲單獨的一篇來詳細的聊聊。node
遠程執行命令python
示例命令:正則表達式
salt '*' cmd.run 'w'
命令分析:vim
salt 是命令自己,* 是執行目標,cmd.run 是 Saltstack 自帶的模塊,目前幾百個。centos
其中一個重要的組成就是執行目標,這是咱們執行命令的目的。關於目標,通常有兩種選擇方式:服務器
1. 基於 Minion ID 的選擇方式。app
2. 基於 Minion 屬性的選擇方式。python2.7
和 Minion ID 相關的選擇方式:spa
1. 直接使用 Minion ID:
salt 'saltstack-node-01' cmd.run 'w'
2. 使用通配符選擇 Minion ID:
# * 選擇全部 salt '*' cmd.run 'w' # 選擇某個開頭的 salt 'saltstack*' cmd.run 'w' # 選擇1或者2 salt 'saltstack-node-0[1|2]' cmd.run 'w' # ? 表明一個字符 salt 'saltstack-node-0?' cmd.run 'w' # 選擇範圍 salt 'saltstack-node-0[1-2]' cmd.run 'w' # 選擇非 salt 'saltstack-node-0[!2]' cmd.run 'w'
3. 使用列表選擇 Minion ID:-L 參數
salt -L 'saltstack-node-01,saltstack-node-02' cmd.run 'w'
4. 正則表達式:-E 參數
salt -E 'saltstack-node-(01|02)' cmd.run 'w'
匹配方式還有不少,這些都是經常使用的,並且,這裏用到的全部方式,在 top.sls 中一樣可使用。
另外,主機名設置建議,例如:erp-service-01-aliyun-oa.example.com
說明:erp-service 是服務,01 是節點,aliyun 是機房,oa 是業務線
5. 使用 IP 或者子網方式:-S 參數
# IP 地址 salt -S '192.168.100.112' cmd.run 'w' # 子網 salt -S '192.168.100.0/24' cmd.run 'w'
6. 對 Minion 進行分組:
在 /etc/salt/master 當前版本的 1192 行,有 nodegroup 配置,能夠修改成以下:
nodegroups: app: 'L@saltstack-node-01,saltstack-node-02'
L@ 其實就至關於 -L 參數,贊成還能夠 G@ 這些樣式,選擇 group 使用 -N 參數:
salt -N app test.ping
7. 還要混合匹配:-C
salt -C 'saltstack-node-01 and G@os:centos or E@saltstack-node-0(2|3)' test.ping
具體能夠看官方文檔,不推薦這種,太麻煩了。
同時,咱們得提一下一個重要得參數,-b:
這個參數指定一次執行多少臺,能夠是數字,也能夠是百分比。這樣不至於一執行機器全掛。
salt '*' -b 1 test.ping
效果以下:
想了解更多能夠查看文檔:
https://www.unixhot.com/docs/saltstack/topics/targeting/index.html
遠程執行模塊
詳細文檔地址:
https://www.unixhot.com/docs/saltstack/ref/modules/all/index.html
這些模塊都是 python 文件,被保存在服務器的:/usr/lib/python2.7/site-packages/salt/modules 目錄下。
咱們只須要關注一下經常使用的,如:network / service / state / cp 等等。
另外能夠簡單作了解的就是執行返回,咱們能夠將執行的記錄和結果都保存到 MySQL 或者 Redis 等服務中,這裏就不過多解釋,具體能夠查看文檔:
https://www.unixhot.com/docs/saltstack/ref/returners/index.html
本身編寫模塊
本身編寫簡單的腳本模塊方法:
1. 在 Master 新建腳本目錄和文件:
# 新建目錄 cd /srv/salt/ && mkdir _modules && cd _modules # 新建文件 vim get_disk.py
內容以下:
def list(): cmd = 'df -h' ret = __salt__['cmd.run'](cmd) return ret
其實就是直接調用 salt 自己的 cmd.run 方法執行命令,返回結果,固然更復制的需求也可使用其餘模塊。
2. 將模塊同步到 Minion:
salt '*' saltutil.sync_modules
結果以下:
能夠查看 Minion 上的狀況 /var/cache/salt/ 目錄,結果以下:
3. 直接執行咱們寫的模塊:
salt '*' get_disk.list
結果以下:
小結
遠程執行其實最主要的就是可以正確的選擇到咱們真的想執行的機器,這裏面有包括咱們本身在定義 Minion ID 時候的設計。一個良好的設計規範才能讓咱們更輕鬆的完成工做的需求。
另外 salt 的執行模塊特別多,咱們只須要記住幾個經常使用的,若是不知道可查文檔。
本身寫模塊是咱們最後的解決思路,在咱們實在無法找到合適的模塊的時候,咱們能夠本身手寫知足咱們需求的模塊。這裏面會使用到 Python 腳本。固然,會 Python 最佳,若是不會也沒有關係,由於咱們寫的內容通常仍是相對於比較簡單的功能。
最後,咱們須要發現一個規律。這種本身定義 Grains,本身定義 modules,咱們都是在 Master 端,而後經過 saltutil 裏面的各類 sync 的方法推送到指定的 Minion 端。瞭解了這一點,可以更好的幫助咱們瞭解 saltstack 的執行思路。