Ansible playbook API 开发 调用测试
Ansible是Agentless的轻量级批量配置管理工具,由于出现的比较晚(13年)基于Ansible进行开发的相关文档较少,因此,这里通过一些小的实验,结合现有资料以及源码,探索一下Ansible的二次开发。
随笔的内容分为三个部分
- playbook编辑执行
- python 调用API执行playbook
- 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 开发 调用测试的更多相关文章
- asp.net开源流程引擎API开发调用接口大全-工作流引擎设计
关键词: 工作流引擎 BPM系统 接口调用 工作流快速开发平台 工作流流设计 业务流程管理 asp.net 开源工作流 一.程序调用开发接口二. 接口说明 所谓的驰骋工作流引擎的接口,在B ...
- ansible 调用playbook api执行(一)
一 调用ansible playbook api执行playbook 1 准备好hosts文件 root@ansible:~/ansible/playbooks# cat hosts [all:var ...
- Python+Django+ansible playbook自动化运维项目实战☝☝☝
Python+Django+ansible playbook自动化运维项目实战☝☝☝ 一.入门引导 DevOPSDevOps(英文Development和Operations的组合)是一组过程.方法 ...
- 纯 Java 开发 WebService 调用测试工具(wsCaller.jar)
注:本文来自hacpai.com:Tanken的<纯 Java 开发 WebService 调用测试工具(wsCaller.jar)>的文章 基于 Java 开发的 WebService ...
- web开发调用百度地图API + AK申请
web开发调用百度地图API + AK申请 要使用百度地图的API我们首先需要在我们的html页面引入js----`` 如何获取百度地图ak: 1.登陆百度地图开发者平台 2.注册百度开发者账号并登陆 ...
- vue配置开发,测试,生产环境api
npm run build 调用开发环境接口,打包开发环境npm run build:test 调用测试环境接口,打包测试环境npm run build:prod 调用生产环境接口,打包生产环境 vu ...
- 基于.Net Framework 4.0 Web API开发(2):ASP.NET Web APIs 参数传递方式详解
概述: ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.调用API过程中参数的传递是必须的,本节就来谈谈 ...
- 百度AI开放平台- API实战调用
百度AI开放平台- API实战调用 一. 前言 首先说一下项目需求. 两个用户,分别上传了两段不同的文字,要计算两段文字相似度有多少,匹配数据库中的符合条件的数据,初步估计列出来会有60-1 ...
- 第一行代码:以太坊(2)-使用Solidity语言开发和测试智能合约
智能合约是以太坊的核心之一,用户可以利用智能合约实现更灵活的代币以及其他DApp.不过在深入讲解如何开发智能合约之前,需要先介绍一下以太坊中用于开发智能合约的Solidity语言,以及相关的开发和测试 ...
随机推荐
- Servlet、JSP中页面跳转的方式
一.Servlet:当然,在servlet中,一般跳转都发生在doGet, doPost等方法里面.1) redirect 方式response.sendRedirect("success ...
- DBA-mysql-字符集
查看支持的字符集:show charset; 查看现使用字符集:status; 1.在[mysqld]下添加 default-character-set=utf8 (mysql 5.1版本) char ...
- 读取DBF文件数据
#region 返回DBF表 public static System.Data.DataTable getDTFromDBF(string fullPath) { string pDir = Sys ...
- [Linux] - Docker移动数据到其它盘的办法
由于使用yum安装Docker,默认是数据是存放在系统盘/var/lib目录下,需要把它放到其实盘里头.方法可以这样做: 1.在其它盘中新建一个目录,比如我的:/yunpan/docker mkdir ...
- [2015.02.02]文本编码转换专家 v2.6
软件名称:文本编码转换专家最新版本:v2.6操作系统:XP/2003/Win7/Win2008软件介绍:文本编码转换专家,界面简洁易用,功能强大实用.自动识别文件编码,有效转换成目标编码.真正的多线程 ...
- jQuery EasyUI:根据数据库内容生成适合于easyui-tree的JSON数据格式
1,jQuery EasyUI中easyui-tree特定的JSON数据格式 [ {"id":1,"text":"某公司","ch ...
- 阿里云的9折推荐码 8DIER4
推荐码: 8DIER4 我有一个阿里云9折推荐码:8DIER4,分享给你,第一次购买云服务器或云数据库可享受原价9折优惠,还可多人使用,拿走不谢. 阿里云地址:http://www.aliyun.co ...
- VirtualBox后台运行虚拟机(无图形界面启动虚拟机)
有时候可能会用虚拟机搭建集群,这是通常希望不现实图形界面,试了半天,似乎只有Virtual Box支持无图形界面运行虚拟机,方法如下: 在Virtual Box的安装目录中找到VBoxManage,M ...
- python 中__name__ = '__main__' 的作用
有句话经典的概括了这段代码的意义: "Make a script both importable and executable" 意思就是说让你写的脚本模块既可以导入到别的模块中用 ...
- lsyncd 实时同步
1. 几大实时同步工具比较 1.1 inotify + rsync 最近一直在寻求生产服务服务器上的同步替代方案,原先使用的是inotify + rsync,但随着文件数量的增大到100W+,目录下的 ...