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

 ---

 - name: hostname

   hosts: "{{host}}"

   sudo: yes

   tasks:

     - name: copy file to "{{host}}"

       copy: src=/tmp/webAuth.sh dest=/tmp/webAuth.sh mode=0775

     - name: execute webAuth

       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=    changed=    unreachable=    failed=

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

二、python 调用API执行playbook

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

 Python代码: test.py
import sys
import ansible.playbook
from ansible import callbacks
from ansible import utils stats = callbacks.AggregateStats()
playbook_cb = callbacks.PlaybookCallbacks(verbose=utils.VERBOSITY)
runner_cb = callbacks.PlaybookRunnerCallbacks(stats, verbose=utils.VERBOSITY)
def execute(play,params):
pb = ansible.playbook.PlayBook(
playbook=play,
stats=stats,
callbacks=playbook_cb,
runner_callbacks=runner_cb,
check=False,
extra_vars=eval(params)
)
print pb
return pb.run()
if __name__=='__main__':
res=execute(sys.argv[1],sys.argv[2])
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': , 'skipped': , 'ok': , 'changed': , 'failures': }}

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

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

Test.java

 import java.io.InputStreamReader;

 import java.io.BufferedReader;

 import java.io.InputStream;

 import java.io.IOException;

 public class Test{

   public static void main(String args[]) throws IOException{

     String command="python /opt/ansible/test.py /opt/ansible/hostname.yml {'host':'"+args[0]+"'}";

     Process process = Runtime.getRuntime().exec(command);

     printStream(process.getInputStream());

     printStream(process.getErrorStream());

     System.out.println("finish");

   }

 private static void printStream(InputStream inputStream) {

   if (inputStream == null){

     System.out.println("input null");

     return;

   }

   String line = "";

     try(BufferedReader input = new BufferedReader(new InputStreamReader(inputStream)))

     {

       while ((line = input.readLine()) != null) {

         System.out.println(line);

       }

     } catch (IOException e1) {

         System.out.println("输出流失败"+e1);

         e1.printStackTrace();

     }

   }

 }

调用

#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': , 'skipped': , 'ok': , 'changed': , 'failures': }}
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 apihttp://docs.ansible.com/ansible/developing_api.html

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

Ansible playbook API 开发 调用测试的更多相关文章

  1. asp.net开源流程引擎API开发调用接口大全-工作流引擎设计

    关键词: 工作流引擎 BPM系统 接口调用 工作流快速开发平台  工作流流设计  业务流程管理   asp.net 开源工作流 一.程序调用开发接口二.   接口说明 所谓的驰骋工作流引擎的接口,在B ...

  2. ansible 调用playbook api执行(一)

    一 调用ansible playbook api执行playbook 1 准备好hosts文件 root@ansible:~/ansible/playbooks# cat hosts [all:var ...

  3. Python+Django+ansible playbook自动化运维项目实战☝☝☝

    Python+Django+ansible playbook自动化运维项目实战☝☝☝  一.入门引导 DevOPSDevOps(英文Development和Operations的组合)是一组过程.方法 ...

  4. 纯 Java 开发 WebService 调用测试工具(wsCaller.jar)

    注:本文来自hacpai.com:Tanken的<纯 Java 开发 WebService 调用测试工具(wsCaller.jar)>的文章 基于 Java 开发的 WebService ...

  5. web开发调用百度地图API + AK申请

    web开发调用百度地图API + AK申请 要使用百度地图的API我们首先需要在我们的html页面引入js----`` 如何获取百度地图ak: 1.登陆百度地图开发者平台 2.注册百度开发者账号并登陆 ...

  6. vue配置开发,测试,生产环境api

    npm run build 调用开发环境接口,打包开发环境npm run build:test 调用测试环境接口,打包测试环境npm run build:prod 调用生产环境接口,打包生产环境 vu ...

  7. 基于.Net Framework 4.0 Web API开发(2):ASP.NET Web APIs 参数传递方式详解

    概述:  ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.调用API过程中参数的传递是必须的,本节就来谈谈 ...

  8. 百度AI开放平台- API实战调用

    百度AI开放平台- API实战调用 一.      前言 首先说一下项目需求. 两个用户,分别上传了两段不同的文字,要计算两段文字相似度有多少,匹配数据库中的符合条件的数据,初步估计列出来会有60-1 ...

  9. 第一行代码:以太坊(2)-使用Solidity语言开发和测试智能合约

    智能合约是以太坊的核心之一,用户可以利用智能合约实现更灵活的代币以及其他DApp.不过在深入讲解如何开发智能合约之前,需要先介绍一下以太坊中用于开发智能合约的Solidity语言,以及相关的开发和测试 ...

随机推荐

  1. CPU利用率异常的分析思路和方法交流探讨

    CPU利用率异常的分析思路和方法交流探讨在生产运行当中,经常会遇到CPU利用率异常或者不符合预期的情况,此时,往往暗示着系统性能问题.那么究竟是核心应用的问题?是监控工具的问题?还是系统.硬件.网络层 ...

  2. Kettle使用介绍

    本文主要阅读目录如下: 1.Kettle概念 2.下载和部署 3.Kettle环境配置 4.Kettle使用及组件介绍 ETL(Extract-Transform-Load的缩写,即数据抽取.转换.装 ...

  3. U盘装系统

    http://jingyan.baidu.com/article/fec4bce20e344cf2618d8b37.html

  4. 崽崽帮www.zaizaibang.com精选14

    [行走贵州]爽爽贵阳,乐活天堂! 北京儿童医院将建遗传代谢病专科医院 [山东十大最难懂方言]原来青岛话还是很好懂滴 ❤如果南宁的儿童医院长这样…… 成都三所小学入围中国百强小学名单 [乐湖新闻]学习中 ...

  5. Django Form and Modelform Admin定义 高级查询)

    Django的form表单一般具有两种功能 1. 验证输入 2.输入HTML ---------模板----------- from django import forms class BookFor ...

  6. C#动手实践:Kinect V2 开发(1):初步了解及环境搭建

    该分享使用的是Kinect 二代,C#做为编程语言,请知悉 Kinect是微软在2009年6月2日的E3游戏展上,正式公布的XBOX360体感周边外设.它是一种3D体感摄影机,同时它导入了即时动态捕捉 ...

  7. mysql 笔记

    mysql配置主从复制的时候,不能将server-id设置成非数字,这样会导致mysqld启动失败. mysql重启的时候,自动会释放锁(这个锁应该是位于内存的) 执行sql脚本:source /ho ...

  8. CRM Diagnostics CRM 2016 诊断

    http://xxx.xxxxxx.xxx/Organization/tools/diagnostics/diag.aspx

  9. nyoj 142, poj 1039 ,hdu 1454 管道问题

    http://acm.nyist.net/JudgeOnline/problem.php?pid=142 第一道解析几何问题,比较纠结,主要是几个解析几何的基本操作,包括求两线段的叉积,判断左右方向, ...

  10. BdAsyncTask学习

    综述 是什么 BdAsyncTask是仿照系统的AsyncTask重写的异步处理任务.用法和系统原生的AsyncTask一样,复写doInBackground.onPreExecute.onPostE ...