python3調(diào)用ansible?api使用實(shí)例例說(shuō)明
python3 安裝ansible 模塊
pip3 install ansible pip3 install ansible_runner pip3 install ansible_inventory pip3 install ansible_playbook
獲取官方實(shí)例并修改
https://docs.ansible.com/ansible/latest/dev_guide/developing_api.html
核心類介紹
導(dǎo)入類完整路徑 | 功能用途 |
---|---|
from ansible.module_utils.common.collections import ImmutableDict | 用于添加選項(xiàng)。比如: 指定遠(yuǎn)程用戶remote_user=None |
from ansible.parsing.dataloader import DataLoader | 讀取 json/ymal/ini 格式的文件的數(shù)據(jù)解析器 |
from ansible.vars.manager import VariableManager | 管理主機(jī)和主機(jī)組的變量管理器 |
from ansible.inventory.manager import InventoryManager | 管理資源庫(kù)的,可以指定一個(gè) inventory 文件等 |
from ansible.playbook.play import Play | 用于執(zhí)行 Ad-hoc 的類 ,需要傳入相應(yīng)的參數(shù) |
from ansible.executor.task_queue_manager import TaskQueueManager | ansible 底層用到的任務(wù)隊(duì)列管理器 |
ansible.plugins.callback.CallbackBase | 處理任務(wù)執(zhí)行后返回的狀態(tài) |
from ansible import context | 上下文管理器,他就是用來(lái)接收 ImmutableDict 的示例對(duì)象 |
import ansible.constants as C | 用于獲取 ansible 產(chǎn)生的臨時(shí)文檔。 |
from ansible.executor.playbook_executor import PlaybookExecutor | 執(zhí)行 playbook 的核心類 |
from ansible.inventory.host import Group | 對(duì) 主機(jī)組 執(zhí)行操作 ,可以給組添加變量等操作,擴(kuò)展 |
from ansible.inventory.host import Host | 對(duì) 主機(jī) 執(zhí)行操作 ,可以給主機(jī)添加變量等操作,擴(kuò)展 |
示例
[root@dev-technology-215l shell]# cat ansible2.py import json import shutil from ansible.module_utils.common.collections import ImmutableDict from ansible.parsing.dataloader import DataLoader from ansible.vars.manager import VariableManager from ansible.inventory.manager import InventoryManager from ansible.playbook.play import Play from ansible.executor.task_queue_manager import TaskQueueManager from ansible.plugins.callback import CallbackBase from ansible import context import ansible.constants as C class ResultCallback(CallbackBase): """ 重寫callbackBase類的部分方法 """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.host_ok = {} self.host_unreachable = {} self.host_failed = {} self.task_ok = {} def v2_runner_on_unreachable(self, result): self.host_unreachable[result._host.get_name()] = result def v2_runner_on_ok(self, result, **kwargs): self.host_ok[result._host.get_name()] = result def v2_runner_on_failed(self, result, **kwargs): self.host_failed[result._host.get_name()] = result class MyAnsiable2(): def __init__(self, connection='local', # 連接方式 local 本地方式,smart ssh方式 remote_user=None, # ssh 用戶 remote_password=None, # ssh 用戶的密碼,應(yīng)該是一個(gè)字典, key 必須是 conn_pass private_key_file=None, # 指定自定義的私鑰地址 sudo=None, sudo_user=None, ask_sudo_pass=None, module_path=None, # 模塊路徑,可以指定一個(gè)自定義模塊的路徑 become=None, # 是否提權(quán) become_method=None, # 提權(quán)方式 默認(rèn) sudo 可以是 su become_user=None, # 提權(quán)后,要成為的用戶,并非登錄用戶 check=False, diff=False, listhosts=None, listtasks=None,listtags=None, verbosity=3, syntax=None, start_at_task=None, inventory=None): # 函數(shù)文檔注釋 """ 初始化函數(shù),定義的默認(rèn)的選項(xiàng)值, 在初始化的時(shí)候可以傳參,以便覆蓋默認(rèn)選項(xiàng)的值 """ context.CLIARGS = ImmutableDict( connection=connection, remote_user=remote_user, private_key_file=private_key_file, sudo=sudo, sudo_user=sudo_user, ask_sudo_pass=ask_sudo_pass, module_path=module_path, become=become, become_method=become_method, become_user=become_user, verbosity=verbosity, listhosts=listhosts, listtasks=listtasks, listtags=listtags, syntax=syntax, start_at_task=start_at_task, ) # 三元表達(dá)式,假如沒(méi)有傳遞 inventory, 就使用 "localhost," # 指定 inventory 文件 # inventory 的值可以是一個(gè) 資產(chǎn)清單文件 # 也可以是一個(gè)包含主機(jī)的元組,這個(gè)僅僅適用于測(cè)試 # 比如 : 1.1.1.1, # 如果只有一個(gè) IP 最后必須有英文的逗號(hào) # 或者: 1.1.1.1, 2.2.2.2 self.inventory = inventory if inventory else "localhost," # 實(shí)例化數(shù)據(jù)解析器 self.loader = DataLoader() # 實(shí)例化 資產(chǎn)配置對(duì)象 self.inv_obj = InventoryManager(loader=self.loader, sources=self.inventory) # 設(shè)置密碼 self.passwords = remote_password # 實(shí)例化回調(diào)插件對(duì)象 self.results_callback = ResultCallback() # 變量管理器 self.variable_manager = VariableManager(self.loader, self.inv_obj) def run(self, hosts='localhost', gether_facts="no", module="ping", args='', task_time=0): """ 參數(shù)說(shuō)明: task_time -- 執(zhí)行異步任務(wù)時(shí)等待的秒數(shù),這個(gè)需要大于 0 ,等于 0 的時(shí)候不支持異步(默認(rèn)值)。這個(gè)值應(yīng)該等于執(zhí)行任務(wù)實(shí)際耗時(shí)時(shí)間為好 """ play_source = dict( name = "Ad-hoc", hosts = hosts, gather_facts = gether_facts, tasks = [ # 這里每個(gè) task 就是這個(gè)列表中的一個(gè)元素,格式是嵌套的字典 # 也可以作為參數(shù)傳遞過(guò)來(lái),這里就簡(jiǎn)單化了。 {"action":{"module": module, "args": args}, "async": task_time, "poll": 0}]) play = Play().load(play_source, variable_manager=self.variable_manager, loader=self.loader) tqm = None try: tqm = TaskQueueManager( inventory=self.inv_obj , variable_manager=self.variable_manager, loader=self.loader, passwords=self.passwords, stdout_callback=self.results_callback) result = tqm.run(play) finally: if tqm is not None: tqm.cleanup() shutil.rmtree(C.DEFAULT_LOCAL_TMP, True) def playbook(self,playbooks): """ Keyword arguments: playbooks -- 需要是一個(gè)列表類型 """ from ansible.executor.playbook_executor import PlaybookExecutor playbook = PlaybookExecutor(playbooks=playbooks, inventory=self.inv_obj, variable_manager=self.variable_manager, loader=self.loader, passwords=self.passwords) # 使用回調(diào)函數(shù) playbook._tqm._stdout_callback = self.results_callback result = playbook.run() def get_result(self): result_raw = {'success':{},'failed':{},'unreachable':{}} # print(self.results_callback.host_ok) for host,result in self.results_callback.host_ok.items(): result_raw['success'][host] = result._result for host,result in self.results_callback.host_failed.items(): result_raw['failed'][host] = result._result for host,result in self.results_callback.host_unreachable.items(): result_raw['unreachable'][host] = result._result # 最終打印結(jié)果,并且使用 JSON 繼續(xù)格式化 print(json.dumps(result_raw, indent=4)) return json.dumps(result_raw)
測(cè)試run ansible
[root@dev-technology-215l shell]# cat ansible_run_wc.py from ansible2 import * #引用修改過(guò)的ansible2.py 的所有模塊 import ansible_runner import subprocess import os, sys, json, datetime, time ansible3 = MyAnsiable2(inventory='/data/ansible/host/hosts', connection='smart') #創(chuàng)建資源庫(kù)對(duì)象 ansible3.run(hosts= "192.168.0.94", module="shell", args='pm2 ls | grep sk_service_design_calculate_rda | wc -l') stdout_dict = json.loads(ansible3.get_result()) print(stdout_dict,type(stdout_dict)) print(stdout_dict['success']['192.168.0.94']['stdout'],'######wc')
運(yùn)行結(jié)果:
[root@dev-technology-215l shell]# python ansible_run_wc.py
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
{
"success": {
"192.168.0.94": {
"changed": true,
"end": "2020-07-06 14:59:30.529462",
"stdout": "3",
"cmd": "pm2 ls|grep sk_service_design_calculate_rda|wc -l",
"rc": 0,
"start": "2020-07-06 14:59:30.309994",
"stderr": "",
"delta": "0:00:00.219468",
"invocation": {
"module_args": {
"creates": null,
"executable": null,
"_uses_shell": true,
"strip_empty_ends": true,
"_raw_params": "pm2 ls|grep sk_service_design_calculate_rda|wc -l",
"removes": null,
"argv": null,
"warn": true,
"chdir": null,
"stdin_add_newline": true,
"stdin": null
}
},
"stdout_lines": [
"3"
],
"stderr_lines": [],
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"_ansible_no_log": false
}
},
"failed": {},
"unreachable": {}
}
{'success': {'192.168.0.94': {'changed': True, 'end': '2020-07-06 14:59:30.529462', 'stdout': '3', 'cmd': 'pm2 ls|grep sk_service_design_calculate_rda|wc -l', 'rc': 0, 'start': '2020-07-06 14:59:30.309994', 'stderr': '', 'delta': '0:00:00.219468', 'invocation': {'module_args': {'creates': None, 'executable': None, '_uses_shell': True, 'strip_empty_ends': True, '_raw_params': 'pm2 ls|grep sk_service_design_calculate_rda|wc -l', 'removes': None, 'argv': None, 'warn': True, 'chdir': None, 'stdin_add_newline': True, 'stdin': None}}, 'stdout_lines': ['3'], 'stderr_lines': [], 'ansible_facts': {'discovered_interpreter_python': '/usr/bin/python'}, '_ansible_no_log': False}}, 'failed': {}, 'unreachable': {}} <class 'dict'>
3 ######wc
ansible playbook 測(cè)試
ansible-playbook python 腳本
[root@dev-technology-215l shell]# cat ansible_playbook_test.py from ansible2 import * import ansible_runner import subprocess import os, sys, json, datetime, time import urllib.request ansible3 = MyAnsiable2(inventory='/data/ansible/host/hosts', connection='smart') ansible3.playbook(playbooks=['test.yml']) stdout_dict = json.loads(ansible3.get_result()) print(stdout_dict,type(stdout_dict)) #print(stdout_dict['success']['192.168.0.94']['stdout'])
test.yml
[root@dev-technology-215l shell]# grep -C5 192.168.0.94 /data/ansible/host/hosts ###rda-環(huán)境node高負(fù)載應(yīng)用linux標(biāo)準(zhǔn)A組### [rda-highload-node-service-linux-stdA] 192.168.0.94 ansible_ssh_user=root ansible_ssh_pass="Sxxx-xxxx"
- name: test server hosts: 'rda-highload-node-service-linux-stdA' tasks: - name: online pm2 ls raw: ls /data/
測(cè)試結(jié)果
[root@dev-technology-215l shell]# python ansible_playbook_test.py
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
{
"success": {
"192.168.0.94": {
"rc": 0,
"stdout": "lost+found pm2-log pm2-web rsyslog samba xxxx-java xxxx-node source\r\n",
"stdout_lines": [
"lost+found pm2-log pm2-web rsyslog samba xxxx-java xxxx-node source"
],
"stderr": "Shared connection to 192.168.0.94 closed.\r\n",
"stderr_lines": [
"Shared connection to 192.168.0.94 closed."
],
"changed": true,
"_ansible_no_log": false
}
},
"failed": {},
"unreachable": {}
}
{'success': {'192.168.0.94': {'rc': 0, 'stdout': 'lost+found pm2-log pm2-web rsyslog samba xxxx-java xxxx-node source\r\n', 'stdout_lines': ['lost+found pm2-log pm2-web rsyslog samba xxxx-java xxxx-node source'], 'stderr': 'Shared connection to 192.168.0.94 closed.\r\n', 'stderr_lines': ['Shared connection to 192.168.0.94 closed.'], 'changed': True, '_ansible_no_log': False}}, 'failed': {}, 'unreachable': {}} <class 'dict'>
[root@dev-technology-215l shell]#
以上就是python3 調(diào)用ansible api使用說(shuō)明的詳細(xì)內(nèi)容,更多關(guān)于python3 調(diào)用ansible api的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- python使用IP歸屬地查詢API追蹤網(wǎng)絡(luò)活動(dòng)
- Django Rest Framework框架構(gòu)建復(fù)雜API技能詳解
- vue使用ArcGis?API?for?js創(chuàng)建地圖實(shí)現(xiàn)示例
- ArcGis?API?for?js在vue.js中的使用示例詳解
- Flask進(jìn)階之構(gòu)建RESTful?API和數(shù)據(jù)庫(kù)交互操作
- TypeScript開發(fā)HapiJS應(yīng)用詳解
- JavaScript國(guó)際化API格式化數(shù)據(jù)Intl.NumberFormat使用講解
- 智能文本糾錯(cuò)API應(yīng)用工作原理分析
相關(guān)文章
python 去除二維數(shù)組/二維列表中的重復(fù)行方法
今天小編就為大家分享一篇python 去除二維數(shù)組/二維列表中的重復(fù)行方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01python_tkinter彈出對(duì)話框創(chuàng)建2
這篇文章主要介紹了python_tkinter彈出對(duì)話框創(chuàng)建,上以篇文章我們簡(jiǎn)單的對(duì)對(duì)話框創(chuàng)建做了簡(jiǎn)單介紹,本文將繼續(xù)更多相關(guān)內(nèi)容,需要的小伙伴可以參考一下2022-03-03python requests爬取高德地圖數(shù)據(jù)的實(shí)例
今天小編就為大家分享一篇python requests爬取高德地圖數(shù)據(jù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11python基于雙向鏈表實(shí)現(xiàn)LFU算法
這篇文章主要為大家詳細(xì)介紹了python基于雙向鏈表實(shí)現(xiàn)LFU算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05python實(shí)時(shí)監(jiān)控cpu小工具
這篇文章主要為大家詳細(xì)介紹了python實(shí)時(shí)監(jiān)控cpu的小工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06