wxyfj 发表于 2018-1-2 11:48:31

ansible api

# -*- coding: utf-8 -*-  

  
#from tempfile import NamedTemporaryFile
  
import os.path
  

  
from ansible.inventory import Inventory
  
from ansible.runner import Runner
  
from ansible.playbook import PlayBook
  
from ansible.inventory.group import Group
  
from ansible.inventory.host import Host
  
from ansible import callbacks
  
from ansible import utils
  
#from django.template.loader import get_template
  
#from django.template import Context
  
from passlib.hash import sha512_crypt
  

  
API_DIR = os.path.dirname(os.path.abspath(__file__))
  
ANSIBLE_DIR = os.path.join(API_DIR, 'playbooks')
  

  

  
class AnsibleError(StandardError):
  

  
def __init__(self, error, data='', message=''):
  
super(AnsibleError, self).__init__(message)
  
self.error = error
  
self.data = data
  
self.message = message
  

  

  
class CommandValueError(AnsibleError):
  

  
def __init__(self, field, message=''):
  
super(CommandValueError, self).__init__('value:invalid', field, message)
  

  

  
class MyInventory(Inventory):
  

  
def __init__(self, resource):
  

  
self.resource = resource
  
self.inventory = Inventory(host_list=[])
  
self.gen_inventory()
  

  
def my_add_group(self, hosts, groupname, groupvars=None):
  

  
my_group = Group(name=groupname)
  

  
if groupvars:
  
for key, value in groupvars.iteritems():
  
my_group.set_variable(key, value)
  

  
for host in hosts:
  
hostname = host.get("ip")
  
hostip = host.get('ip', hostname)
  
hostport = host.get("port")
  
username = host.get("username")
  
password = host.get("password")
  
my_host = Host(name=hostname, port=hostport)
  
my_host.set_variable('ansible_ssh_host', hostip)
  
my_host.set_variable('ansible_ssh_port', hostport)
  
my_host.set_variable('ansible_ssh_user', username)
  
my_host.set_variable('ansible_ssh_pass', password)
  

  
for key, value in host.iteritems():
  
if key not in ["hostname", "port", "username", "password"]:
  
my_host.set_variable(key, value)
  

  
my_group.add_host(my_host)
  

  
self.inventory.add_group(my_group)
  

  
def gen_inventory(self):
  

  
if isinstance(self.resource, list):
  
self.my_add_group(self.resource, 'deploy')
  
elif isinstance(self.resource, dict):
  
for groupname, hosts_and_vars in self.resource.iteritems():
  
self.my_add_group(hosts_and_vars.get("hosts"), groupname, hosts_and_vars.get("vars"))
  

  

  
class MyRunner(MyInventory):
  

  
def __init__(self, *args, **kwargs):
  
super(MyRunner, self).__init__(*args, **kwargs)
  
self.results_raw = {}
  

  
def run(self, module_name='shell', module_args='', timeout=10, forks=10, pattern='*',
  
become=False, become_method='sudo', become_user='root', become_pass=''):
  

  
hoc = Runner(module_name=module_name,
  
module_args=module_args,
  
timeout=timeout,
  
inventory=self.inventory,
  
pattern=pattern,
  
forks=forks,
  
become=become,
  
become_method=become_method,
  
become_user=become_user,
  
become_pass=become_pass
  
)
  
self.results_raw = hoc.run()
  
logger.debug(self.results_raw)
  
return self.results_raw
  

  
@property
  
def results(self):
  
result = {'failed': {}, 'ok': {}}
  
dark = self.results_raw.get('dark')
  
contacted = self.results_raw.get('contacted')
  
if dark:
  
for host, info in dark.items():
  
result['failed'] = info.get('msg')
  

  
if contacted:
  
for host, info in contacted.items():
  
if info.get('invocation').get('module_name') in ['raw', 'shell', 'command', 'script']:
  
if info.get('rc') == 0:
  
result['ok'] = info.get('stdout') + info.get('stderr')
  
else:
  
result['failed'] = info.get('stdout') + info.get('stderr')
  
else:
  
if info.get('failed'):
  
result['failed'] = info.get('msg')
  
else:
  
result['ok'] = info.get('changed')
  
return result
  

  

  
class MyTask(MyRunner):
  

  
def __init__(self, *args, **kwargs):
  
super(MyTask, self).__init__(*args, **kwargs)
  

  
def passwd_test(self, username, password):
  

  

  
def chan_root_pw(self, username, password):
  

  
encrypt_pass = sha512_crypt.encrypt(password)
  
module_args = 'name=%s password=%s update_password=always' % (username, encrypt_pass)
  

  
self.run("user", module_args, become=True)
  

  
return self.results
  

  
def qd_initialize(self, username, password):
  

  

  
def qd_php(self, username, password):
  

  

  
def qd_tomcat(self, username, password):
  

  

  

  

  
class CustomAggregateStats(callbacks.AggregateStats):
  

  
def __init__(self):
  
super(CustomAggregateStats, self).__init__()
  
self.results = []
  

  
def compute(self, runner_results, setup=False, poll=False, ignore_errors=False):
  
super(CustomAggregateStats, self).compute(runner_results, setup, poll, ignore_errors)
  
self.results.append(runner_results)
  

  
def summarize(self, host):
  
summarized_info = super(CustomAggregateStats, self).summarize(host)
  
summarized_info['result'] = self.results
  
return summarized_info
  

  

  
class MyPlaybook(MyInventory):
  

  
def __init__(self, *args, **kwargs):
  
super(MyPlaybook, self).__init__(*args, **kwargs)
  

  
def run(self, playbook_relational_path, extra_vars=None):
  
stats = CustomAggregateStats()
  
playbook_cb = callbacks.PlaybookCallbacks(verbose=utils.VERBOSITY)
  
runner_cb = callbacks.PlaybookRunnerCallbacks(stats, verbose=utils.VERBOSITY)
  
playbook_path = os.path.join(ANSIBLE_DIR, playbook_relational_path)
  

  
pb = PlayBook(playbook=playbook_path, stats=stats, callbacks=playbook_cb, runner_callbacks=runner_cb, inventory=self.inventory, extra_vars=extra_vars, check=False)
  

  
self.results_raw = pb.run()
  

  
@property
  
def results(self):
  
result = {"failed": {}, "ok": {}}
  

  
resultss = self.results_raw.values()
  
for i in resultss.get('result'):
  
dark = i.get('dark')
  
contacted = i.get('contacted')
  
if contacted:
  
for host, info in contacted.items():
  
if info.get('invocation').get('module_name') in ['raw', 'shell', 'script']:
  
if info.get('rc') == 0:
  
#result['ok'] = info.get('stdout') + info.get('stderr')
  
result["ok"] = info.get('invocation').get('module_args')
  
else:
  
result["failed"] = info.get('invocation').get('module_args')
  
#result['failed'] = info.get('stdout') + info.get('stderr')
  
elif info.get('invocation').get('module_name') in ['template', 'copy']:
  
if info.get('changed'):
  
result["ok"] = info.get('dest')
  
else:
  
result["failed"] = info.get('dest')
  
elif info.get('invocation').get('module_name') in ['command']:
  
if info.get('rc') == 0:
  
result["ok"] = info.get('stdout') + info.get('stderr')
  
else:
  
result["failed"] = info.get('stdout') + info.get('stderr')
  
if dark:
  
for host, info in dark.items():
  
result["failed"] = info.get('changed')
  
return result
  

  

  
class App(MyPlaybook):
  

  
def __init__(self, *args, **kwargs):
  
super(App, self).__init__(*args, **kwargs)
  

  
@staticmethod
  
def nginx_vars(upstreams, upstream, servers, server_ssls, locations):
  
extra_vars = {'upstreams': upstreams, 'upstream': upstream, 'servers': servers, 'server_ssls': server_ssls, 'locations': locations}
  
return extra_vars
  

  
def nginx_conf_deploy(self, playbook, upstreams, upstream, servers, server_ssls, locations):
  
vars = self.nginx_vars(upstreams, upstream, servers, server_ssls, locations)
  
self.run(playbook, vars)
  
return self.results
  
#return self.results_raw
页: [1]
查看完整版本: ansible api