如何使用Ansible2的API做python開發(fā)?
ansible 和 SaltStack 都提供了 Python 直接調(diào)用的API, 這方便了 Pythoner 對(duì)這些軟件進(jìn)行二次開發(fā)和整合, 此功能著實(shí)方便了不少, 比起 Python 代碼中調(diào)用 shell 也略顯專業(yè)!
然而 Ansible 在2.0版本后重構(gòu)了大部分的代碼邏輯, 啟用了2.0版本之前的 Runner 和 Playbook 類, 使得廣大同學(xué)之前的代碼運(yùn)行錯(cuò)誤. 擇日不如撞日, 今天中午對(duì)照 官方的文檔 , 結(jié)合源代碼, 對(duì)2.0版本之后的 Python API 做了下探究
Adhoc
adhoc 其實(shí)就是執(zhí)行 Ansible 模塊, 通過 adhoc 我們可以方便快捷的完成一些臨時(shí)的運(yùn)維操作.
2.0 之前的調(diào)用
import ansible.runner
import json
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)然這里會(huì)去加載默認(rèn)的 inventory
如果不想使用 inventory 文件或者想使用動(dòng)態(tài)的 inventory, 則可以使用 host_list 參數(shù)代替
import ansible.runner
import json
runner = ansible.runner.Runner(
host_list=["10.10.0.1"], # 這里如果明確指定主機(jī)需要傳遞一個(gè)列表, 或者指定動(dòng)態(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)用
import json
from ansible.parsing.dataloader import DataLoader
from ansible.vars import VariableManager
from ansible.inventory import Inventory
from ansible.playbook.play import Play
from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.executor.playbook_executor import PlaybookExecutor
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 加載對(duì)應(yīng)變量
class Options(object):
'''
這是一個(gè)公共的類,因?yàn)閍d-hoc和playbook都需要一個(gè)options參數(shù)
并且所需要擁有不同的屬性,但是大部分屬性都可以返回None或False
因此用這樣的一個(gè)類來省去初始化大一堆的空值的屬性