saltstack執行遠程命令


Remote Execution

  • salt命令執行后的返回結果的數據結構都一致,保證能夠很容易地檢查數據,並存儲在數據庫中。

  • salt 使用python modules來進行遠程管理,可以自己增加python module來擴展。所有可以用python訪問的應用或者服務,如一個shell命令,都可以作為salt中的一個執行模塊。

  • 命令執行

salt '*' test.rand_sleep 120

'*'是指機器名稱,test.rand_sleep 即:modult.function, 120是參數

  • 命令執行過程
  1. salt master通過發布端口發送命令
  2. salt minion檢查命令,看是否需要執行該命令
  3. 若需要,目標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 去看到底支持什么類型。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM