Ansible和SaltStack都提供了Python直接調(diào)用的API,這方便了Pythoner對這些軟件進(jìn)行二次開發(fā)和整合,此功能著實(shí)方便了不少,比起Python代碼中調(diào)用shell也略顯專業(yè)!
然而Ansible在2.0版本后重構(gòu)了大部分的代碼邏輯,啟用了2.0版本之前的Runner和Playbook類,使得廣大同學(xué)之前的代碼運(yùn)行錯誤.擇日不如撞日,今天中午對照官方的文檔,結(jié)合源代碼,對2.0版本之后的PythonAPI做了下探究
Adhoc
adhoc其實(shí)就是執(zhí)行Ansible模塊,通過adhoc我們可以方便快捷的完成一些臨時的運(yùn)維操作.
2.0之前的調(diào)用
importansible.runner
importjson
runner=ansible.runner.Runner(
module_name='ping',#模塊名
module_args='',#模塊參數(shù)
pattern='all',#目標(biāo)機(jī)器的pattern
forks=10
)
datastructure=runner.run()
data=json.dumps(datastructure,indent=4)
當(dāng)然這里會去加載默認(rèn)的inventory
如果不想使用inventory文件或者想使用動態(tài)的inventory,則可以使用host_list參數(shù)代替
importansible.runner
importjson
runner=ansible.runner.Runner(
host_list=["10.10.0.1"],#這里如果明確指定主機(jī)需要傳遞一個列表,或者指定動態(tài)inventory腳本
module_name='ping',#模塊名
module_args='',#模塊參數(shù)
extra_vars={"ansible_ssh_user":"root","ansible_ssh_pass":"xx"},
forks=10
)
datastructure=runner.run()
data=json.dumps(datastructure,indent=4)
2.0之后的調(diào)用
importjson
fromansible.parsing.dataloaderimportDataLoader
fromansible.varsimportVariableManager
fromansible.inventoryimportInventory
fromansible.playbook.playimportPlay
fromansible.executor.task_queue_managerimportTaskQueueManager
fromansible.executor.playbook_executorimportPlaybookExecutor
loader=DataLoader()#用來加載解析yaml文件或JSON內(nèi)容,并且支持vault的解密
variable_manager=VariableManager()#管理變量的類,包括主機(jī),組,擴(kuò)展等變量,之前版本是在inventory中的
inventory=Inventory(loader=loader,variable_manager=variable_manager)
variable_manager.set_inventory(inventory)#根據(jù)inventory加載對應(yīng)變量
classOptions(object):
'''
這是一個公共的類,因?yàn)閍d-hoc和playbook都需要一個options參數(shù)
并且所需要擁有不同的屬性,但是大部分屬性都可以返回None或False
因此用這樣的一個類來省去初始化大一堆的空值的屬性