ansible api2.0 多進程執行不同的playbook


  1. 自動化運維工具:ansible
  2. 多進程調用ansible api的應用場景:   應用系統檢查
    • 一個應用系統可能具有20—50台服務器的集群,初步的系統層面檢查可以用一個統一的playbook來檢查,比如(df -h這種命令)。但是深入到應用層的話,就有些個性化的應用了,比如有2台http服務器,有20台中間件服務器在加4台數據庫服務器等等,檢查項都是不同的。如果現在還要進行批量的系統檢查,就不能用同一個playbook了。另外,如果順序執行的話,等待時間就會非常長,而且沒有必要,因為中間件的檢查和數據庫的檢查沒有必然的先后順序的要求,可以同步執行。
    • 所以因為上述的場景需求,導致我們需要多進程調用ansible api來動態生成Inventory並執行不同的playbook
  3. 實現步驟
    1. 基於ansible python api 2.0 二次開發,封裝接口
    2. 創建多個ansible 對象,不同的inventory 不同的playbook
    3. 創建多進程,執行程序 
  4. 注意事項
    1. ansible api2.0 相較於1.0復雜了許多,也更加靈活。這個需要去閱讀原代碼,需要多花點時間和耐心
    2. 在用多進程之前,我嘗試使用多線程,這塊好像ansible不支持threading ,所以就用multiprocessing代替
  5. 代碼

 AnsibleAPI.py

 1 #!/usr/bin/env python
 2 # coding=utf-8
 3 import json
 4 import logging
 5 from ansible.parsing.dataloader import DataLoader
 6 from ansible.vars import VariableManager
 7 from ansible.inventory import Inventory
 8 from ansible.playbook.play import Play
 9 from ansible.executor.task_queue_manager import TaskQueueManager
10 from ansible.executor.playbook_executor import PlaybookExecutor
11 from ansible.plugins.callback import CallbackBase
12 from collections import namedtuple
13 from ansible import constants as C
14 import ansible.executor.task_result
15 import multiprocessing
16 
17 
18 class ResultsCollector(CallbackBase):
19 
20     def v2_runner_on_ok(self, result):
21         host = result._host
22         logging.warning('===v2_runner_on_ok====host=%s===result=%s' % (host, result._result))
23 
24 
25     def v2_runner_on_failed(self, result, ignore_errors=False):
26         host = result._host
27         logging.warning('===v2_runner_on_failed====host=%s===result=%s' % (host, result._result))
28 
29     def v2_runner_on_unreachable(self, result):
30         host = result._host
31         logging.warning('===v2_runner_on_unreachable====host=%s===result=%s' % (host, result._result))
32 
33 
34 class AnsibleAPI(object):
35     def __init__(self, hostlist, playbooks, *args, **kwargs):
36         self.hostlist = hostlist
37         self.playbooks = playbooks
38         self.passwords = None
39         self.callback = None
40         Options = namedtuple('Options', ['connection', 'remote_user', 'ask_sudo_pass', 'verbosity', 'ack_pass',
41                                          'module_path', 'forks', 'become', 'become_method', 'become_user',
42                                          'check', 'listhosts', 'listtasks', 'listtags', 'syntax',
43                                          'sudo_user', 'sudo', 'display_skipped_hosts'])
44 
45         self.options = Options(connection='smart', remote_user='root', ack_pass=None, sudo_user='root',
46                                forks=200, sudo='yes', ask_sudo_pass=False, verbosity=5, module_path=None,
47                                become=True, become_method='su', become_user='root', check=None, listhosts=False,
48                                listtasks=False, listtags=None, syntax=None, display_skipped_hosts=False)
49         self.loader = DataLoader()
50         self.variable_manager = VariableManager()
51         self.inventory = Inventory(loader=self.loader, variable_manager=self.variable_manager,
52                                    host_list=self.hostlist)
53         self.variable_manager.set_inventory(self.inventory)
54         self.variable_manager.extra_vars = {"ansible_ssh_user": "root"}  # 額外參數,包括playbook參數 key:value
55 
56     def runplaybook(self):
57         playbook = PlaybookExecutor( 
58             playbooks=self.playbooks,
59             inventory=self.inventory,
60             variable_manager=self.variable_manager,
61             loader=self.loader,
62             options=self.options,
63             passwords=None)
64         playbook._tqm._stdout_callback = ResultsCollector()
65         playbook.run()
66 
67 if __name__ == '__main__':
68     #創建對象
69     anl = AnsibleAPI(['10.26.222.216'], ['/root/ansibleInventory_cl/df.yml'])
70     an2 = AnsibleAPI(['10.26.222.210', '10.26.222.213'], ['/root/ansibleInventory_cl/ifconfig.yml'])
71     #多進程
72     processes = []
73     p1 = multiprocessing.Process(name='process_one', target=anl.runplaybook)
74     p2 = multiprocessing.Process(name='process_two', target=an2.runplaybook)
75     processes.append(p1)
76     processes.append(p2)
77     for p in processes:
78         p.start()
79 
80     print('tasks completed')

 

 

 

   

 

 

     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM