欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python3調(diào)用ansible?api使用實(shí)例例說(shuō)明

 更新時(shí)間:2023年07月31日 09:27:26   作者:鍋包肉  
這篇文章主要為大家介紹了python3?調(diào)用ansible?api使用說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

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 TaskQueueManageransible 底層用到的任務(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)文章!

相關(guān)文章

  • python 去除二維數(shù)組/二維列表中的重復(fù)行方法

    python 去除二維數(shù)組/二維列表中的重復(fù)行方法

    今天小編就為大家分享一篇python 去除二維數(shù)組/二維列表中的重復(fù)行方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • 基于Python的OCR實(shí)現(xiàn)示例

    基于Python的OCR實(shí)現(xiàn)示例

    這篇文章主要介紹了基于Python的OCR實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • python_tkinter彈出對(duì)話框創(chuàng)建2

    python_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-03
  • 高效使用Python字典的清單

    高效使用Python字典的清單

    字典(dict)對(duì)象是 Python 最常用的數(shù)據(jù)結(jié)構(gòu),本文給大家介紹使用Python字典的清單,感興趣的朋友一起看看吧
    2018-04-04
  • Python正則抓取新聞標(biāo)題和鏈接的方法示例

    Python正則抓取新聞標(biāo)題和鏈接的方法示例

    這篇文章主要介紹了Python正則抓取新聞標(biāo)題和鏈接的方法,結(jié)合具體實(shí)例形式分析了Python正則匹配頁(yè)面元素及文件寫入相關(guān)操作技巧,需要的朋友可以參考下
    2017-04-04
  • PyCharm使用技巧之設(shè)置背景圖片方式

    PyCharm使用技巧之設(shè)置背景圖片方式

    這篇文章主要介紹了PyCharm使用技巧之設(shè)置背景圖片方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • python繪制柱狀圖的方法

    python繪制柱狀圖的方法

    這篇文章主要為大家詳細(xì)介紹了python繪制柱狀圖的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • python requests爬取高德地圖數(shù)據(jù)的實(shí)例

    python requests爬取高德地圖數(shù)據(jù)的實(shí)例

    今天小編就為大家分享一篇python requests爬取高德地圖數(shù)據(jù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • python基于雙向鏈表實(shí)現(xiàn)LFU算法

    python基于雙向鏈表實(shí)現(xiàn)LFU算法

    這篇文章主要為大家詳細(xì)介紹了python基于雙向鏈表實(shí)現(xiàn)LFU算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • python實(shí)時(shí)監(jiān)控cpu小工具

    python實(shí)時(shí)監(jiān)控cpu小工具

    這篇文章主要為大家詳細(xì)介紹了python實(shí)時(shí)監(jiān)控cpu的小工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06

最新評(píng)論