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
* :Running ansible-playbook using Python API http://*.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