ansibleはjarパッケージを呼び出し、結果をターゲットに配布します.

2414 ワード

ansibleは非常に使いやすく、ターゲットマシンにagentがインストールされていない場合、簡単なyaml構文で複雑なメンテナンス機能を実現できます.最近、jarパッケージ実装を呼び出す必要がありますが、ターゲットマシンは空白のマシンで、jdkがインストールされていません.システムとpythonしかありません.この時どうすればいいですか?
イニシアチブ
最初のアイデアは、ansibleコントローラでjarパケットの実行を完了し、jarパケットの実行結果をターゲットマシンにコピーするansible moduleを実現することです.いくつかのコード検証を書いた後、ansibleのmoduleがターゲットマシンで実行されていることがわかり、元のスキームは通用しません.ansibleの関連資料を読んだ後、以下の案を採用した.
  • は、ansibleコントローラ上で実行され、jarがコントローラ上で実行されるansible action pluginを実現する.
  • はansible roleを実現し、このroleは2つのことをします.実装されたばかりのaction pluginを呼び出し、結果をファイルに記録します.結果ファイルをansible copyでターゲットマシンにコピーします.

  • action plugin
    Action pluginは特殊なmoduleで、制御機で実行され、以下のようにテンプレートを実現し、処理ロジックに自分の処理コードを書くことができます.自分の処理結果に基づいてresult辞書に記入し、失敗したらresult['failed']に記入し、修正に成功したらresult['changed']に記入します.
    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

    Actionplugin格納パス
    カスタムpluginはansibleを構成する必要があります.cfg、ここにaction_を記入pluginsパラメータ.
    action_plugins  = /myplugin/action_plugins

    このpluginの多重性が強くなく、本スキームのようにroleを定義して使用する場合は、roleの下にaction_を直接作成することをお勧めします.pluginsディレクトリは、実装されたばかりのaction pluginのpyファイルをこのディレクトリの下に置くことで、構成項目を減らすことができます.
    roleでaction pluginとcopyを接着する
    私もaction pluginの中でpythonでcopyからターゲットマシンまでの機能を実現することができて、繰り返しホイールを作る意味は大きくなくて、ansibleのroleは多種の要素を接着することができて、外で呼び出されて、呼び出し者はroleの実現の細部に関心を持つ必要はありません.
    ---
    - 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を学ぶことを望みます.