ansible 很是好用,在目標機不安裝任何agent的狀況下,能夠用簡單的yaml語法實現複雜的運維功能。最近我有一個需求,須要調用jar包實現,可是目標機是空白的機器,上面沒有安裝jdk,只有系統和python。此時應該怎麼作呢?python
開始的想法是實現一個ansible module,這個module先在ansible 控制機上完成jar包的運行,而後將jar包的運行結果拷貝到目標機上去。寫了一些代碼驗證後發現ansible的module是在目標機上執行的,原有方案行不通。
閱讀了ansible的相關資料後,採用瞭如下方案:運維
實現一個 ansible action plugin,action plugin是在 ansible 控制機上執行的,它會在控制機上運行jar。學習
實現一個 ansible role,這個role作兩件事情。
調用剛實現的 action plugin,而後記錄結果到某個文件;並經過 ansible copy將結果文件拷貝到目標機。code
action plugin是一種特殊的module,它在控制機上運行,實現模版以下,能夠在處理邏輯處寫上本身的處理代碼。能夠根據本身的處理結果填寫result字典,若是失敗要填寫result['failed'],修改爲功了要填寫result['changed']。ci
from ansible.plugins.action import ActionBase class ActionModule(ActionBase): def run(self, tmp=None, task_vars=None): # 調用 ActionBase的run if task_vars is None: task_vars = dict() result = super(ActionModule, self).run(tmp, task_vars) # 獲取入參 source = self._task.args.get('src', None) dest = self._task.args.get('dest', None) # 失敗填寫返回結果 if dest is not None: result['failed'] = True result['msg'] = "'dest' cannot be specified on a template" # 處理邏輯 # 成功填寫返回結果 result['changed'] = True result['msg'] = "change success" return result
自定義的plugin,須要配置ansible.cfg,在其中填寫action_plugins參數。get
action_plugins = /myplugin/action_plugins
若是這個plugin的複用性不強,像本方案,會定義一個role使用它,那麼我建議直接在該role下建立一個action_plugins目錄,把剛實現的action plugin的py文件放到這個目錄下,能夠減小一個配置項。io
我也能夠在action plugin中用python實現copy到目標機的功能,重複造輪子意義不大,ansible 的role能夠把多種要素粘合起來,被外面調用,調用者不用關注role的實現細節。class
--- - name: run my jar action: myplugin src="/home/my.jar" dest="/home/result.txt" - name: copy result file to target copy: src: "/home/result.txt" dest: "/tmp/myjar/result.txt"
這是個人一次嘗試,你們有什麼新的思路能夠回帖給我,很但願和你們一塊兒來學習ansible.import