Remote Execution
-
salt命令執行后的返回結果的數據結構都一致,保證能夠很容易地檢查數據,並存儲在數據庫中。
-
salt 使用python modules來進行遠程管理,可以自己增加python module來擴展。所有可以用python訪問的應用或者服務,如一個shell命令,都可以作為salt中的一個執行模塊。
-
命令執行
salt '*' test.rand_sleep 120
'*'是指機器名稱,test.rand_sleep
即:modult.function
, 120
是參數
- 命令執行過程
- salt master通過發布端口發送命令
- salt minion檢查命令,看是否需要執行該命令
- 若需要,目標minion找到執行module 和對應的方法,執行命令,將結果返回
每個命令,都被分成一個工作線程,保證一個salt minion可以同事處理多個jobs
salt state
salt state 系統
salt state系統在salt remote系統不就之后就出現了,對其影響很大。二者非常相似,一個很大的不同在於,state系統包含一個檢查系統是否處於正常狀態的邏輯,檢查完畢之后,會交給salt remote執行命令。
- state 模塊用於跨作業和誇平台系統
- 返回的結果是連續的數據結構,便於檢查和存儲到數據庫
salt state 系統流程
salt sate 和salt remote的主要區別是state 系統內的控制流程。 salt提供特殊命令,用於定義依賴,重用代碼,控制流程,影響變量和模板。
Runner
salt runner
runner 子系統提供了一些在salt master上執行的salt mudule,實時事件視圖,管理salt的文件server,查看salt的采集資料,向minion發送網絡喚醒,調用webhook和其它http 請求等
命令:salt-run
,不需要taget server,因為target就是salt master本身
參數傳遞方式和向satl 執行模塊發送參數的方式相同。
Orchestrate Runner
orchestrate runner 提供了salt的一個核心功能:運行命令,在多個minion上依照一定義好的順序運用配置.
System Data
data
系統數據的兩個主要方面:獲取系統相關數據,傳遞數據至系統。salt提供了兩個不同的子系統,來分別執行這兩個任務:salt grains和salt pillar
salt mine是用於將數據從minion上推送到master上的一個公共的數據存儲庫上,這個庫可以被所有的minion訪問。
grains
grains用於獲取agent的系統數據,是關於操作系統、內存、磁盤和其他系統屬性的靜態信息。
機器啟動時開始采集數據,數據會階段性刷新,或者使用遠程命令執行。
grains的使用場景:使用grains的某一個值,來列出所有的grains,從而周到所有的agent
grains也是trageting系統不可缺少的一部分,用於定位salt state 和 salt pillar數據。
salt pillar
salt pillar用於傳輸數據到系統。 一個場景應用場景就是,不同的minion機器的配置不同,salt pillar使我們可以定義這些數據值,然后使用target的形式賦值給minion,然后值以變量的形式給salt state.
salt pillar數據使用minion 的公鑰編碼,通過加密渠道傳輸,因而salt pillar也適用於發送如密碼,ssh key之類的秘密數據,因為只有target minion機器才能解碼。salt pillar數據從不會被寫入minon的磁盤。
salt pillar 模塊使用yaml文件定義pillar,超過20個salt module(即插件)用於支持一個多變的后端環境。常見的有:Mongo和Redis,都是用於存儲結構化的數據的。有的用戶使用yaml文件存儲,然后使用git 倉庫來管理和發送pillar data。
salt mine
salt mine用於在minion間共享數據。如果建立一個共享DB,可以給運行依賴於db server的salt minion添加配置,使之自動推送自己的ip到salt mine。這比存儲在salt state和salt pillar上好,因為它們需要進行手動更新。
之后若需要數據,可以直接使用salt state file 去salt mine中獲取。
基本子系統的重置,在其它文檔中有介紹。
Python
modules
salt中,每一個子系統都是一個python module
- salt源碼中,所有的module都在salt文件夾下。一個子文件夾就是一個子系統
- modules的命名規則
salt.subsystem.module
執行函數的參數
需要的參數值以特定的順序傳進來,參數之間用空格隔開。optional 參數以鍵值對的形式傳遞
示例命令
salt '*' network.connect google-public-dns-a.google.com port=53 proto=udp timeout=3
salt '*' cp.get_file salt://vimrc /etc/vimrc gzip=5
`salt ns1 pkg.install pkgs=['bind9','bind9-docs','bind-utils']`
`salt '*' pkg.install sources='[{"foo": "salt://foo.deb"},{"bar": "salt://bar.deb"}]'`
State function arguments
state file中,state 函數的調用使用yaml 語法。yaml展示數據類型時,表現更為突出。使用key 獲取參數值
a state example that calls user.present:
user.present:
- name: fred
- shell: /bin/zsh
list:
install bind packages:
pkg.installed:
- pkgs:
- bind9
- bind9-docs
- bind-utils
list dictornary
install bind packages:
pkg.installed:
- pkgs:
- bind9
- bind9-docs
- bind-utils
具體見salt.states.user.present
tips:
並非所有的參數都會列在function 注釋中,有時候需要check source code 去看到底支持什么類型。