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.

以下是一個簡單呼叫的例子:

import ansible.runner

runner = ansible.runner.Runner(
   module_name='ping',
   module_args='',
   pattern='web*',
   forks=10
)
datastructure = runner.run()

該方法將返回每個host主機是否可以被ping通.返回類型詳情請參閱 模組相關.:

{
    "dark" : {
       "web1.example.com" : "failure message"
    },
    "contacted" : {
       "web2.example.com" : 1
    }
}

每個模型均可以返回任意JSON格式資料,所以Ansible可以作為一個框架被封裝在各種應用程式和指令碼之中.

更具體的例子

以下的指令碼將打印出所有機器的執行時間和系統負載資訊:

#!/usr/bin/python

import ansible.runner
import sys

# 構造ansible runner 並且開啟10個執行緒向遠端主機執行uptime命令
results = ansible.runner.Runner(
    pattern='*', forks=10,
    module_name='command', module_args='/usr/bin/uptime',
).run()

if results is None:
   print "No hosts found"
   sys.exit(1)

print "UP ***********"
for (hostname, result) in results['contacted'].items():
    if not 'failed' in result:
        print "%s >>> %s" % (hostname, result['stdout'])

print "FAILED *******"
for (hostname, result) in results['contacted'].items():
    if 'failed' in result:
        print "%s >>> %s" % (hostname, result['msg'])

print "DOWN *********"
for (hostname, result) in results['dark'].items():
    print "%s >>> %s" % (hostname, result)

高階的開發人員可能會去閱讀ansible的源碼,但使用 Runner() API (使用它能提供的選項)可以增強命令列執行 ansibleansible-playbook 的功能.

See also

開發動態的Inventory資料來源
Developing dynamic inventory integrations
Developing Modules
How to develop modules
Developing Plugins
How to develop plugins
Development Mailing List
Mailing list for development topics
irc.freenode.net
#ansible IRC chat channel