天天看點

ansible2.4 api調用

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>

繼續閱讀