jumpserver/apps/ops/utils.py

151 lines
4.3 KiB
Python
Raw Normal View History

2017-03-15 16:43:43 +00:00
# ~*~ coding: utf-8 ~*~
import time
2017-03-15 16:43:43 +00:00
from django.utils import timezone
2017-12-21 03:31:13 +00:00
from django.db import transaction
2017-12-21 18:08:29 +00:00
from django_celery_beat.models import PeriodicTask, IntervalSchedule
2017-03-15 16:43:43 +00:00
2017-12-10 16:29:25 +00:00
from common.utils import get_logger, get_object_or_none, get_short_uuid_str
from .ansible import AdHocRunner, CommandResultCallback
from .inventory import JMSInventory
from .ansible.exceptions import AnsibleError
2017-12-10 16:29:25 +00:00
from .models import AdHocRunHistory, Task, AdHoc
2017-03-15 16:43:43 +00:00
logger = get_logger(__file__)
2017-12-06 10:31:51 +00:00
2017-12-07 05:01:33 +00:00
2017-12-10 16:29:25 +00:00
def record_adhoc(func):
def _deco(adhoc, **options):
2017-12-15 07:50:15 +00:00
record = AdHocRunHistory(adhoc=adhoc, task=adhoc.task)
2017-12-10 16:29:25 +00:00
time_start = time.time()
try:
result = func(adhoc, **options)
record.is_finished = True
if result.results_summary.get('dark'):
record.is_success = False
else:
record.is_success = True
record.result = result.results_raw
record.summary = result.results_summary
return result
finally:
record.date_finished = timezone.now()
record.timedelta = time.time() - time_start
record.save()
return _deco
def get_adhoc_inventory(adhoc):
if adhoc.become:
become_info = {
'become': {
adhoc.become
}
}
2017-12-07 08:25:50 +00:00
else:
2017-12-10 16:29:25 +00:00
become_info = None
2017-12-07 08:25:50 +00:00
2017-12-10 16:29:25 +00:00
inventory = JMSInventory(
adhoc.hosts, run_as_admin=adhoc.run_as_admin,
run_as=adhoc.run_as, become_info=become_info
)
return inventory
2017-12-07 08:25:50 +00:00
2017-12-10 16:29:25 +00:00
def get_inventory(hostname_list, run_as_admin=False, run_as=None, become_info=None):
return JMSInventory(
hostname_list, run_as_admin=run_as_admin,
run_as=run_as, become_info=become_info
)
2017-12-07 08:25:50 +00:00
2017-12-10 16:29:25 +00:00
def get_adhoc_runner(hostname_list, run_as_admin=False, run_as=None, become_info=None):
inventory = get_inventory(
hostname_list, run_as_admin=run_as_admin,
run_as=run_as, become_info=become_info
)
runner = AdHocRunner(inventory)
return runner
2017-12-07 08:25:50 +00:00
@record_adhoc
2017-12-10 16:29:25 +00:00
def run_adhoc_object(adhoc, **options):
"""
2017-12-10 16:29:25 +00:00
:param adhoc: Instance of AdHoc
:param options: ansible support option, like forks ...
:return:
"""
2017-12-10 16:29:25 +00:00
name = adhoc.task.name
inventory = get_adhoc_inventory(adhoc)
runner = AdHocRunner(inventory)
2017-12-15 07:50:15 +00:00
for k, v in options.items():
runner.set_option(k, v)
try:
2017-12-10 16:29:25 +00:00
result = runner.run(adhoc.tasks, adhoc.pattern, name)
return result
except AnsibleError as e:
logger.error("Failed run adhoc {}, {}".format(name, e))
raise
2017-12-10 16:29:25 +00:00
def run_adhoc(hostname_list, pattern, tasks, name=None,
run_as_admin=False, run_as=None, become_info=None):
if name is None:
name = "Adhoc-task-{}-{}".format(
get_short_uuid_str(),
timezone.now().strftime("%Y-%m-%d %H:%M:%S"),
)
inventory = get_inventory(
hostname_list, run_as_admin=run_as_admin,
run_as=run_as, become_info=become_info
)
runner = AdHocRunner(inventory)
return runner.run(tasks, pattern, play_name=name)
2017-12-15 07:50:15 +00:00
def create_or_update_task(
task_name, hosts, tasks, pattern='all', options=None,
run_as_admin=False, run_as="", become_info=None,
created_by=None
):
2017-12-21 03:31:13 +00:00
print(options)
print(task_name)
2017-12-15 07:50:15 +00:00
task = get_object_or_none(Task, name=task_name)
if task is None:
task = Task(name=task_name, created_by=created_by)
task.save()
adhoc = task.get_latest_adhoc()
new_adhoc = AdHoc(task=task, pattern=pattern,
run_as_admin=run_as_admin,
run_as=run_as)
new_adhoc.hosts = hosts
new_adhoc.tasks = tasks
new_adhoc.options = options
new_adhoc.become = become_info
if not adhoc or adhoc != new_adhoc:
new_adhoc.save()
task.latest_adhoc = new_adhoc
2017-12-21 03:31:13 +00:00
print("Return task")
2017-12-10 16:29:25 +00:00
return task
2017-12-21 18:08:29 +00:00
def create_periodic_tasks(tasks):
for name, detail in tasks.items():
schedule, _ = IntervalSchedule.objects.get_or_create(
every=detail['schedule'],
period=IntervalSchedule.SECONDS,
)
task = PeriodicTask.objects.create(
interval=schedule,
name=name,
task=detail['task'],
args=json.dumps(detail.get('args', [])),
kwargs=json.dumps(detail.get('kwargs', {})),
)
print("Create periodic task: {}".format(task))
2017-12-10 16:29:25 +00:00