Advertisement
Guest User

Untitled

a guest
Sep 12th, 2017
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.23 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Author: ken.liu
  4. # @Date: 2017-09-07 10:19:39
  5. # @Last Modified by: ken.liu
  6. # @Last Modified time: 2017-09-12 16:05:01
  7.  
  8. import os
  9. import sys
  10. import logging
  11. from collections import namedtuple
  12.  
  13. from ansible.parsing.dataloader import DataLoader
  14. from ansible.vars import VariableManager
  15.  
  16. from ansible.inventory import Inventory
  17. from ansible.inventory.group import Group
  18. from ansible.inventory.host import Host
  19.  
  20. from ansible.playbook.play import Play
  21. from ansible.executor.playbook_executor import PlaybookExecutor
  22. from ansible.executor.task_queue_manager import TaskQueueManager
  23.  
  24. from ansible.plugins.callback import CallbackBase
  25.  
  26. logger = logging.basicConfig()
  27.  
  28. class ResultsCollector(CallbackBase):
  29. def __init__(self, *args, **kwargs):
  30. super(ResultsCollector, self).__init__(*args, **kwargs)
  31. self.host_ok = {}
  32. self.host_unreachable = {}
  33. self.host_failed = {}
  34.  
  35. def v2_runner_on_unreachable(self, result):
  36. self.host_unreachable[result._host.get_name()] = result
  37.  
  38. def v2_runner_on_ok(self, result, *args, **kwargs):
  39. self.host_ok[result._host.get_name()] = result
  40.  
  41. def v2_runner_on_failed(self, result, *args, **kwargs):
  42. self.host_failed[result._host.get_name()] = result
  43.  
  44. class MyInventory(Inventory):
  45. def __init__(self, resource, loader, variable_manager):
  46. self.resource = resource
  47. self.inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list=[])
  48. self.gen_inventory()
  49.  
  50. def gen_inventory(self):
  51. if isinstance(self.resource, list):
  52. self.my_add_group(self.resource, 'default_group')
  53. elif isinstance(self.resource, dict):
  54. for groupname, hosts_and_vars in self.resource.iteritems():
  55. self.my_add_group(hosts_and_vars.get('hosts'), groupname, hosts_and_vars.get('vars'))
  56.  
  57. def my_add_group(self, hosts, groupname, groupvars=None):
  58. my_group = Group(name=groupname)
  59.  
  60. if groupvars:
  61. for key, value in groupvars.iteritems():
  62. my_group.set_variable(key, value)
  63.  
  64. for host in hosts:
  65. hostname = host.get('hostname')
  66. host_ip = host.get('ip', hostname)
  67. host_port = host.get('port')
  68. username = host.get('username')
  69. password = host.get('password')
  70. ssh_key = host.get('ssh_key')
  71.  
  72. my_host = Host(name=hostname, port=host_port)
  73. my_host.set_variable('ansible_ssh_host', host_ip)
  74. my_host.set_variable('ansible_ssh_port', host_port)
  75. my_host.set_variable('ansible_ssh_user', username)
  76. my_host.set_variable('ansible_ssh_pass', password)
  77. my_host.set_variable('ansible_ssh_private_key_file', ssh_key)
  78.  
  79. for key, value in host.iteritems():
  80. if key not in ['hostname', 'port', 'username', 'password']:
  81. my_host.set_variable(key, value)
  82.  
  83. my_group.add_host(my_host)
  84.  
  85. self.inventory.add_group(my_group)
  86.  
  87. class AnsibleAPI(object):
  88. def __init__(self, resource, *args, **kwargs):
  89. self.resource = resource
  90. self.inventory = None
  91. self.variable_manager = None
  92. self.loader = None
  93. self.options = None
  94. self.passwords = None
  95. self.callback = None
  96. self.__initializeData()
  97. self.results_raw = {}
  98.  
  99. def __initializeData(self):
  100. Options = namedtuple('Options', [
  101. 'connection', 'module_path', 'forks', 'timeout', 'remote_user',
  102. 'ask_pass', 'private_key_file', 'ssh_common_args', 'ssh_extra_args',
  103. 'sftp_extra_args', 'scp_extra_args', 'become', 'become_method', 'become_user', 'ask_value_pass',
  104. 'verbosity', 'check', 'listhosts', 'listtasks', 'listtags', 'syntax'
  105. ]
  106. )
  107.  
  108. self.variable_manager = VariableManager()
  109. self.loader = DataLoader()
  110. self.options = Options(
  111. connection='smart',
  112. module_path='/usr/share/ansible',
  113. forks=100, timeout=10,
  114. remote_user='root', ask_pass=False,
  115. private_key_file='ssh/ansible.pem',
  116. ssh_common_args=None, ssh_extra_args=None, sftp_extra_args=None, scp_extra_args=None,
  117. become=None, become_method=None, become_user='root',
  118. ask_value_pass=False, verbosity=None, check=False, listhosts=False,
  119. listtasks=False, listtags=False, syntax=False
  120. )
  121.  
  122. self.passwords = dict(sshpass=None, becomepass=None)
  123. self.inventory = MyInventory(self.resource, self.loader, self.variable_manager).inventory
  124. self.variable_manager.set_inventory(self.inventory)
  125.  
  126. def run(self, host_list, module_name, module_args):
  127. play_source = dict(
  128. name='Ansible Play',
  129. hosts=host_list,
  130. gather_facts='no',
  131. tasks=[
  132. dict(action=dict(module=module_name, args=module_args))
  133. ]
  134. )
  135. play = Play().load(play_source, variable_manager=self.variable_manager, loader=self.loader)
  136.  
  137. tqm = None
  138. self.callback = ResultsCollector()
  139. try:
  140. tqm = TaskQueueManager(
  141. inventory=self.inventory,
  142. variable_manager=self.variable_manager,
  143. loader=self.loader,
  144. options=self.options,
  145. passwords=self.passwords,
  146. )
  147. tqm._stdout_callback = self.callback
  148. tqm.run(play)
  149. finally:
  150. if tqm is not None:
  151. tqm.cleanup()
  152.  
  153. def run_playbook(self, host_list, role_name, role_uuid, temp_param):
  154. try:
  155. self.callback = ResultsCollector()
  156. filenames = ['' + '/handlers/ansible/v1_0/sudoers.yml']
  157. template_file = ''
  158. if not os.path.exists(template_file):
  159. sys.exit()
  160.  
  161. host_list_str = ','.join([item for item in host_list])
  162.  
  163. extra_vars = {}
  164. extra_vars['host_list'] = host_list_str
  165. extra_vars['username'] = role_name
  166. extra_vars['template_dir'] = template_file
  167. extra_vars['command_list'] = temp_param.get('cmdList')
  168. extra_vars['role_uuid'] = 'role-%s' % role_uuid
  169.  
  170. self.variable_manager.extra_vars = extra_vars
  171.  
  172. executor = PlaybookExecutor(
  173. playbooks=filenames,
  174. inventory=self.inventory,
  175. variable_manager=self.variable_manager,
  176. loader=self.loader,
  177. options=self.options,
  178. passwords=self.passwords,
  179. )
  180. executor._tqm._stdout_callback = self.callback
  181. executor.run()
  182. except Exception as e:
  183. print "error:",e.message
  184.  
  185. def get_result(self):
  186. self.results_raw = {'success': {}, 'failed': {}, 'unreachable': {}}
  187.  
  188. for host, result in self.callback.host_ok.items():
  189. self.results_raw['success'][host] = result._result
  190.  
  191. for host, result in self.callback.host_failed.items():
  192. self.results_raw['failed'][host] = result._result.get('msg') or result._result
  193.  
  194. for host, result in self.callback.host_unreachable.items():
  195. self.results_raw['unreachable'][host] = result._result['msg']
  196.  
  197. return self.results_raw
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement