• Ansible playbook API 开发 调用测试


        Ansible是Agentless的轻量级批量配置管理工具,由于出现的比较晚(13年)基于Ansible进行开发的相关文档较少,因此,这里通过一些小的实验,结合现有资料以及源码,探索一下Ansible的二次开发。

        随笔的内容分为三个部分

    1. playbook编辑执行
    2. python 调用API执行playbook
    3. java调用python程序进行playbook的执行

        实验的环境是centos6,ansible版本是1.9.4,python版本是2.6.6,jdk版本是1.7U79

    一、playbook编辑执行

      编辑playbook,这里实现的功能是复制一个脚本到指定节点并执行,需要注意的是yaml的格式,注意缩进

      webAuth.yml

     1 ---
     2 
     3 - name: hostname
     4 
     5   hosts: "{{host}}"
     6 
     7   sudo: yes
     8 
     9   tasks:
    10 
    11     - name: copy file to "{{host}}"
    12 
    13       copy: src=/tmp/webAuth.sh dest=/tmp/webAuth.sh mode=0775
    14 
    15    
    16 
    17     - name: execute webAuth
    18 
    19       script: /tmp/webAuth.sh

      如果想运行该playbook可以使用

    # ansible-playbook /opt/ansible/webAuth.yml --extra-vars 'host=’nodes'

      此时将会有返回结果。

    PLAY [hostname] ***************************************************************
    
     
    
    GATHERING FACTS ***************************************************************
    
    ok: [192.168.10.110]
    
     
    
    TASK: [copy file to "{{host}}"] ***********************************************
    
    ok: [192.168.10.110]
    
     
    
    TASK: [execute webAuth] *******************************************************
    
    changed: [192.168.10.110]
    
     
    
    PLAY RECAP ********************************************************************
    
    192.168.10.110              : ok=3    changed=1    unreachable=0    failed=0

       能够执行成功说明playbook是没问题的,如果报错误,那么根据提示进行修改即可。

    二、python 调用API执行playbook

        下面使用Python调用API接口执行上面的playbook

     1 Python代码: test.py
     2 import sys
     3 import ansible.playbook
     4 from ansible import callbacks
     5 from ansible import utils
     6 
     7 stats = callbacks.AggregateStats()
     8 playbook_cb = callbacks.PlaybookCallbacks(verbose=utils.VERBOSITY)
     9 runner_cb = callbacks.PlaybookRunnerCallbacks(stats, verbose=utils.VERBOSITY)
    10 def execute(play,params):
    11   pb = ansible.playbook.PlayBook(
    12     playbook=play,
    13     stats=stats,
    14     callbacks=playbook_cb,
    15     runner_callbacks=runner_cb,
    16     check=False,
    17     extra_vars=eval(params)
    18   )
    19   print pb
    20   return  pb.run()
    21 if __name__=='__main__':
    22   res=execute(sys.argv[1],sys.argv[2])
    23   print res

    代码中 playbook=play 是由命令行给出需要执行的playbook脚本路径,stats是用于收集执行的过程状态,playbook_cb是playbook_cb 用来输出执行的结果,runner_callbacks用来输出playbook执行期间的结果。

    执行

    python test.py /opt/ansible/webAuth.yml '{"host":"cloudeploy-nodes"}'

    返回结果:

    PLAY [hostname] ***************************************************************
    
     
    
    GATHERING FACTS ***************************************************************
    
    ok: [192.168.10.110]
    
     
    
    TASK: [copy file to "{{host}}"] ***********************************************
    
    changed: [192.168.10.110]
    
     
    
    TASK: [execute webAuth] *******************************************************
    
    ok: [192.168.10.110]
    
    {'192.168.10.110': {'unreachable': 0, 'skipped': 0, 'ok': 2, 'changed': 1, 'failures': 0}}

    三、java调用python程序进行playbook的执行

      使用JAVA调用python来实现java执行playbook

    Test.java

     1 import java.io.InputStreamReader;
     2 
     3 import java.io.BufferedReader;
     4 
     5 import java.io.InputStream;
     6 
     7 import java.io.IOException;
     8 
     9 public class Test{
    10 
    11   public static void main(String args[]) throws IOException{
    12 
    13     String command="python /opt/ansible/test.py /opt/ansible/hostname.yml {'host':'"+args[0]+"'}";
    14 
    15     Process process = Runtime.getRuntime().exec(command);
    16 
    17     printStream(process.getInputStream());
    18 
    19     printStream(process.getErrorStream());
    20 
    21     System.out.println("finish");
    22 
    23   }
    24 
    25 private static void printStream(InputStream inputStream) {
    26 
    27   if (inputStream == null){
    28 
    29     System.out.println("input null");
    30 
    31     return;
    32 
    33   }
    34 
    35   String line = "";
    36 
    37     try(BufferedReader input = new BufferedReader(new InputStreamReader(inputStream)))
    38 
    39     {
    40 
    41       while ((line = input.readLine()) != null) {
    42 
    43         System.out.println(line);
    44 
    45       }
    46 
    47     } catch (IOException e1) {
    48 
    49         System.out.println("输出流失败"+e1);
    50 
    51         e1.printStackTrace();
    52 
    53     }
    54 
    55   }
    56 
    57 }

    调用

    #java Test cloudeploy

    这里将playbook的路径固定了,同样可以作为参数传入。

    执行结果:

    PLAY [hostname] *************************************************************** 
    
    GATHERING FACTS *************************************************************** 
    ok: [192.168.10.110]
    
    TASK: [return hostname] ******************************************************* 
    changed: [192.168.10.110]
    
    TASK: [copy file to "{{host}}"] *********************************************** 
    ok: [192.168.10.110]
    
    TASK: [execute webAuth] ******************************************************* 
    changed: [192.168.10.110]
    {'192.168.10.110': {'unreachable': 0, 'skipped': 0, 'ok': 4, 'changed': 2, 'failures': 0}}
    finish

    表明执行成功,查看对应节点,文件将被复制并执行

    参考资料:

    Github: playbook 源码 :https://github.com/ansible/ansible/blob/release1.8.4/lib/ansible/playbook/__init__.py

    Kisips: Ansible文档 playbook进阶: http://www.kisops.com/?p=42

    361way: ansible小节十 ansible api  http://www.361way.com/ansible-api/4446.html

    StackOverflow :Running ansible-playbook using Python API   http://stackoverflow.com/questions/27590039/running-ansible-playbook-using-python-api

    Ansible :developing api http://docs.ansible.com/ansible/developing_api.html

    google: ansible 论坛   https://groups.google.com/forum/#!topic/ansible-project/V1PoNJcXV_w

  • 相关阅读:
    echarts图表重设尺寸
    文本文档中各字母出现次数汇总(java)
    30道随机运算
    随机生成验证码
    原码,反码,补码
    动手动脑(一)
    模拟银行ATM系统(基础版)
    2018暑期周总结报告(五)
    2018暑期周总结报告(四)
    2018暑期周总结报告(三)
  • 原文地址:https://www.cnblogs.com/xpxstar/p/4940281.html
Copyright © 2020-2023  润新知