1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<code>AnsibleAPI.py 實作多程序釋出代碼</code>
<code>#!/usr/bin/python</code>
<code># --*-- coding:utf-8 --*--</code>
<code>import</code> <code>json</code>
<code>import</code> <code>logging</code>
<code>from</code> <code>ansible.parsing.dataloader </code><code>import</code> <code>DataLoader</code>
<code>from</code> <code>ansible.</code><code>vars</code><code>.manager </code><code>import</code> <code>VariableManager</code>
<code>from</code> <code>ansible.inventory.manager </code><code>import</code> <code>InventoryManager</code>
<code>from</code> <code>ansible.playbook.play </code><code>import</code> <code>Play</code>
<code>from</code> <code>ansible.executor.task_queue_manager </code><code>import</code> <code>TaskQueueManager</code>
<code>from</code> <code>ansible.executor.playbook_executor </code><code>import</code> <code>PlaybookExecutor</code>
<code>from</code> <code>ansible.plugins.callback </code><code>import</code> <code>CallbackBase</code>
<code>from</code> <code>collections </code><code>import</code> <code>namedtuple</code>
<code>from</code> <code>ansible </code><code>import</code> <code>constants as C</code>
<code>import</code> <code>ansible.executor.task_result</code>
<code>import</code> <code>multiprocessing</code>
<code>class</code> <code>ResultsCollector(CallbackBase):</code>
<code> </code><code>def</code> <code>v2_runner_on_ok(</code><code>self</code><code>,result):</code>
<code> </code><code>host </code><code>=</code> <code>result._host</code>
<code> </code><code>logging.basicConfig(level</code><code>=</code><code>logging.DEBUG,</code>
<code> </code><code>format</code><code>=</code><code>'%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s'</code><code>,</code>
<code> </code><code>datefmt</code><code>=</code><code>'%a, %d %b %Y %H:%M:%S'</code><code>,</code>
<code> </code><code>filename</code><code>=</code><code>'/root/cmdb/script/publish.log'</code><code>,</code>
<code> </code><code>filemode</code><code>=</code><code>'w'</code>
<code> </code><code>)</code>
<code> </code><code>logging.warning(</code><code>'===v2_runner_on_ok===host=%s===result=%s'</code> <code>%</code> <code>(host, result._result))</code>
<code> </code><code>#print(json.dumps({host.name: result._result}, indent=4))</code>
<code> </code>
<code> </code><code>def</code> <code>v2_runner_on_failed(</code><code>self</code><code>,result,ignore_errors</code><code>=</code><code>False</code><code>):</code>
<code> </code><code>logging.warning(</code><code>'===v2_runner_on_failed====host=%s===result=%s'</code> <code>%</code> <code>(host, result._result))</code>
<code> </code><code>def</code> <code>v2_runner_on_unreachable(</code><code>self</code><code>,result):</code>
<code> </code><code>logging.warning(</code><code>'===v2_runner_on_unreachable====host=%s===result=%s'</code> <code>%</code> <code>(host, result._result))</code>
<code>class</code> <code>AnsibleAPI(</code><code>object</code><code>):</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>,hostlist,image_name,playbooks, </code><code>*</code><code>args, </code><code>*</code><code>*</code><code>kwargs):</code>
<code> </code><code>self</code><code>.playbooks </code><code>=</code> <code>playbooks</code>
<code> </code><code>self</code><code>.passwords </code><code>=</code> <code>None</code>
<code> </code><code>self</code><code>.callback </code><code>=</code> <code>None</code>
<code> </code><code>Options </code><code>=</code> <code>namedtuple(</code><code>'Options'</code><code>,[</code><code>'connection'</code><code>,</code><code>'remote_user'</code><code>,</code><code>'ask_sudo_pass'</code><code>,</code><code>'verbosity'</code><code>,</code><code>'ack_pass'</code><code>,</code><code>'module_path'</code><code>, </code><code>'forks'</code><code>, </code><code>'become'</code><code>, </code><code>'become_method'</code><code>,</code><code>'become_user'</code><code>,</code><code>'check'</code><code>, </code><code>'listhosts'</code><code>, </code><code>'listtasks'</code><code>, </code><code>'listtags'</code><code>,</code><code>'syntax'</code><code>,</code><code>'sudo_user'</code><code>, </code><code>'sudo'</code><code>, </code><code>'diff'</code><code>])</code>
<code> </code><code>self</code><code>.options </code><code>=</code> <code>Options(connection</code><code>=</code><code>'smart'</code><code>,remote_user</code><code>=</code><code>'root'</code><code>,ack_pass</code><code>=</code><code>None</code><code>,sudo_user</code><code>=</code><code>'root'</code><code>,forks</code><code>=</code><code>5</code><code>, sudo</code><code>=</code><code>'yes'</code><code>, ask_sudo_pass</code><code>=</code><code>False</code><code>, verbosity</code><code>=</code><code>5</code><code>,module_path</code><code>=</code><code>None</code><code>,become</code><code>=</code><code>True</code><code>, become_method</code><code>=</code><code>'sudo'</code><code>, become_user</code><code>=</code><code>'root'</code><code>,check</code><code>=</code><code>None</code><code>, listhosts</code><code>=</code><code>False</code><code>,listtasks</code><code>=</code><code>False</code><code>, listtags</code><code>=</code><code>None</code><code>, syntax</code><code>=</code><code>None</code><code>,diff</code><code>=</code><code>False</code><code>)</code>
<code> </code><code>self</code><code>.loader </code><code>=</code> <code>DataLoader()</code>
<code> </code><code>self</code><code>.inventory </code><code>=</code> <code>InventoryManager(loader</code><code>=</code><code>self</code><code>.loader,sources</code><code>=</code><code>[</code><code>'hosts'</code><code>])</code>
<code> </code><code>self</code><code>.variable_manager </code><code>=</code> <code>VariableManager(loader</code><code>=</code><code>self</code><code>.loader,inventory</code><code>=</code><code>self</code><code>.inventory)</code>
<code> </code><code>self</code><code>.variable_manager.extra_vars </code><code>=</code> <code>{</code><code>"image_name"</code><code>: image_name,</code><code>'host'</code><code>:hostlist}</code>
<code> </code><code>def</code> <code>runplaybook(</code><code>self</code><code>):</code>
<code> </code><code>playbook </code><code>=</code> <code>PlaybookExecutor(</code>
<code> </code><code>playbooks</code><code>=</code><code>self</code><code>.playbooks,</code>
<code> </code><code>inventory</code><code>=</code><code>self</code><code>.inventory,</code>
<code> </code><code>variable_manager</code><code>=</code><code>self</code><code>.variable_manager,</code>
<code> </code><code>loader</code><code>=</code><code>self</code><code>.loader,</code>
<code> </code><code>options</code><code>=</code><code>self</code><code>.options,</code>
<code> </code><code>passwords</code><code>=</code><code>None</code><code>)</code>
<code> </code><code>playbook._tqm._stdout_callback </code><code>=</code> <code>ResultsCollector()</code>
<code> </code><code>playbook.run()</code>
<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>'__main__'</code><code>:</code>
<code> </code><code># 建立對象</code>
<code> </code><code>an1 </code><code>=</code> <code>AnsibleAPI(</code><code>'192.168.194.129,192.168.194.128'</code><code>,</code><code>'common-oss-dc3a25.tar'</code><code>,[</code><code>'/etc/ansible/update.yml'</code><code>])</code>
<code> </code><code>#an2 = AnsibleAPI('192.168.194.128','common-oss-dc3a25.tar',['/etc/ansible/update.yml'])</code>
<code> </code><code>#processes = []</code>
<code> </code><code>p1 </code><code>=</code> <code>multiprocessing.Process(name</code><code>=</code><code>'process_one'</code><code>,target</code><code>=</code><code>an1.runplaybook)</code>
<code> </code><code>#p2 = multiprocessing.Process(name='process_two',target=an1.runplaybook)</code>
<code> </code><code>#processes.append(p1)</code>
<code> </code><code>#processes.append(p2)</code>
<code> </code><code>#for p in processes:</code>
<code> </code><code># p.start()</code>
<code> </code><code># 等待子程序結束,主程序退出</code>
<code> </code><code># p.join() #可以加浮點數參數,等待多久就不等了</code>
<code> </code><code>p1.start()</code>
<code> </code><code>if</code> <code>p1.is_alive():</code>
<code> </code><code>print</code><code>(</code><code>'正在釋出'</code><code>)</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>print</code><code>(</code><code>'釋出結束'</code><code>)</code>
<code></code><code> 本文轉自小白的希望 51CTO部落格,原文連結http://blog.51cto.com/haoyonghui/2052084:,如需轉載請自行聯系原作者</code>
<code></code><code></code>
<code></code>