Python API

本章将展示几种有趣的Ansible API调用方式.你可以使用Ansible的Python API来管理节点,可以通过扩展Ansible来响应大量的Python事件,你可以写各种的插件,并且,你可以通过插件来调取外部数据源.本文主要向读者简单介绍一下 Runner 和 Playbook 的API.

如果你想使用除Python的其他方法调用Ansible,使用其异步回调事件,或者访问控制,日志管理,可以访问 Ansible Tower,它提供了非常丰富的 REST API.

此外,Ansible本身也是基于他本身的API来实现的,所以你将拥有足够的权限来进行二次封装.本章将讨论Python API的使用.

Python API

Ansible的Python API 功能十分强大,它造就了ansible CLI和ansible-playbook.

以下是一个简单调用的例子:

  1. import ansible.runner
  2.  
  3. runner = ansible.runner.Runner(
  4. module_name='ping',
  5. module_args='',
  6. pattern='web*',
  7. forks=10
  8. )
  9. datastructure = runner.run()

该方法将返回每个host主机是否可以被ping通.返回类型详情请参阅 模块相关.:

  1. {
  2. "dark" : {
  3. "web1.example.com" : "failure message"
  4. },
  5. "contacted" : {
  6. "web2.example.com" : 1
  7. }
  8. }

每个模型均可以返回任意JSON格式数据,所以Ansible可以作为一个框架被封装在各种应用程序和脚本之中.

更具体的例子

以下的脚本将打印出所有机器的运行时间和系统负载信息:

  1. #!/usr/bin/python
  2.  
  3. import ansible.runner
  4. import sys
  5.  
  6. # 构造ansible runner 并且开启10个线程向远程主机执行uptime命令
  7. results = ansible.runner.Runner(
  8. pattern='*', forks=10,
  9. module_name='command', module_args='/usr/bin/uptime',
  10. ).run()
  11.  
  12. if results is None:
  13. print "No hosts found"
  14. sys.exit(1)
  15.  
  16. print "UP ***********"
  17. for (hostname, result) in results['contacted'].items():
  18. if not 'failed' in result:
  19. print "%s >>> %s" % (hostname, result['stdout'])
  20.  
  21. print "FAILED *******"
  22. for (hostname, result) in results['contacted'].items():
  23. if 'failed' in result:
  24. print "%s >>> %s" % (hostname, result['msg'])
  25.  
  26. print "DOWN *********"
  27. for (hostname, result) in results['dark'].items():
  28. print "%s >>> %s" % (hostname, result)

高级的开发人员可能会去阅读ansible的源码,但使用 Runner() API (使用它能提供的选项)可以增强命令行执行 ansibleansible-playbook 的功能.

See also