ansible 調用jar包並將結果分發到目標機

ansible 很是好用,在目標機不安裝任何agent的狀況下,能夠用簡單的yaml語法實現複雜的運維功能。最近我有一個需求,須要調用jar包實現,可是目標機是空白的機器,上面沒有安裝jdk,只有系統和python。此時應該怎麼作呢?python

方案

開始的想法是實現一個ansible module,這個module先在ansible 控制機上完成jar包的運行,而後將jar包的運行結果拷貝到目標機上去。寫了一些代碼驗證後發現ansible的module是在目標機上執行的,原有方案行不通。
閱讀了ansible的相關資料後,採用瞭如下方案:運維

  1. 實現一個 ansible action plugin,action plugin是在 ansible 控制機上執行的,它會在控制機上運行jar。學習

  2. 實現一個 ansible role,這個role作兩件事情。
    調用剛實現的 action plugin,而後記錄結果到某個文件;並經過 ansible copy將結果文件拷貝到目標機。code

action plugin

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

action plugin存放路徑

自定義的plugin,須要配置ansible.cfg,在其中填寫action_plugins參數。get

action_plugins  = /myplugin/action_plugins

若是這個plugin的複用性不強,像本方案,會定義一個role使用它,那麼我建議直接在該role下建立一個action_plugins目錄,把剛實現的action plugin的py文件放到這個目錄下,能夠減小一個配置項。io

用role粘合action plugin和copy

我也能夠在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

相關文章
相關標籤/搜索