2022-10-08 11:12:04 +00:00
|
|
|
import os
|
2023-01-16 11:02:09 +00:00
|
|
|
import uuid
|
2017-03-05 12:53:24 +00:00
|
|
|
|
2022-10-08 11:12:04 +00:00
|
|
|
import ansible_runner
|
2022-09-30 10:49:45 +00:00
|
|
|
from django.conf import settings
|
2022-10-08 11:12:04 +00:00
|
|
|
|
2022-09-30 10:49:45 +00:00
|
|
|
from .callback import DefaultCallback
|
2023-07-17 05:59:45 +00:00
|
|
|
from ..utils import get_ansible_log_verbosity
|
2020-12-29 13:05:18 +00:00
|
|
|
|
2017-03-05 15:30:14 +00:00
|
|
|
|
2023-06-14 11:48:43 +00:00
|
|
|
class CommandInBlackListException(Exception):
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
2022-09-30 10:49:45 +00:00
|
|
|
class AdHocRunner:
|
|
|
|
cmd_modules_choices = ('shell', 'raw', 'command', 'script', 'win_shell')
|
2017-12-06 10:31:51 +00:00
|
|
|
|
2022-12-26 11:02:05 +00:00
|
|
|
def __init__(self, inventory, module, module_args='', pattern='*', project_dir='/tmp/', extra_vars={},
|
2022-12-27 08:06:21 +00:00
|
|
|
dry_run=False, timeout=-1):
|
2022-09-30 10:49:45 +00:00
|
|
|
self.id = uuid.uuid4()
|
2017-12-10 16:29:25 +00:00
|
|
|
self.inventory = inventory
|
2022-09-30 10:49:45 +00:00
|
|
|
self.pattern = pattern
|
|
|
|
self.module = module
|
|
|
|
self.module_args = module_args
|
|
|
|
self.project_dir = project_dir
|
|
|
|
self.cb = DefaultCallback()
|
|
|
|
self.runner = None
|
2022-11-16 13:06:14 +00:00
|
|
|
self.extra_vars = extra_vars
|
2022-12-26 11:02:05 +00:00
|
|
|
self.dry_run = dry_run
|
2022-12-27 08:06:21 +00:00
|
|
|
self.timeout = timeout
|
2022-09-30 10:49:45 +00:00
|
|
|
|
|
|
|
def check_module(self):
|
|
|
|
if self.module not in self.cmd_modules_choices:
|
|
|
|
return
|
2023-05-31 09:16:48 +00:00
|
|
|
if self.module_args and self.module_args.split()[0] in settings.SECURITY_COMMAND_BLACKLIST:
|
2023-06-14 12:04:20 +00:00
|
|
|
raise CommandInBlackListException(
|
|
|
|
"Command is rejected by black list: {}".format(self.module_args.split()[0]))
|
2022-09-30 10:49:45 +00:00
|
|
|
|
|
|
|
def run(self, verbosity=0, **kwargs):
|
|
|
|
self.check_module()
|
2023-07-17 05:59:45 +00:00
|
|
|
verbosity = get_ansible_log_verbosity(verbosity)
|
2022-09-30 10:49:45 +00:00
|
|
|
|
2022-10-08 11:12:04 +00:00
|
|
|
if not os.path.exists(self.project_dir):
|
|
|
|
os.mkdir(self.project_dir, 0o755)
|
|
|
|
|
2022-09-30 10:49:45 +00:00
|
|
|
ansible_runner.run(
|
2022-12-27 08:06:21 +00:00
|
|
|
timeout=self.timeout if self.timeout > 0 else None,
|
2022-11-16 13:06:14 +00:00
|
|
|
extravars=self.extra_vars,
|
2022-09-30 10:49:45 +00:00
|
|
|
host_pattern=self.pattern,
|
|
|
|
private_data_dir=self.project_dir,
|
2017-03-05 15:30:14 +00:00
|
|
|
inventory=self.inventory,
|
2022-09-30 10:49:45 +00:00
|
|
|
module=self.module,
|
|
|
|
module_args=self.module_args,
|
|
|
|
verbosity=verbosity,
|
|
|
|
event_handler=self.cb.event_handler,
|
|
|
|
status_handler=self.cb.status_handler,
|
|
|
|
**kwargs
|
2017-12-06 10:31:51 +00:00
|
|
|
)
|
2022-09-30 10:49:45 +00:00
|
|
|
return self.cb
|
2017-03-05 15:30:14 +00:00
|
|
|
|
|
|
|
|
2022-09-30 10:49:45 +00:00
|
|
|
class PlaybookRunner:
|
2022-10-12 10:08:57 +00:00
|
|
|
def __init__(self, inventory, playbook, project_dir='/tmp/', callback=None):
|
2022-09-30 10:49:45 +00:00
|
|
|
self.id = uuid.uuid4()
|
2017-12-10 16:29:25 +00:00
|
|
|
self.inventory = inventory
|
2022-09-30 10:49:45 +00:00
|
|
|
self.playbook = playbook
|
|
|
|
self.project_dir = project_dir
|
2022-10-12 10:08:57 +00:00
|
|
|
if not callback:
|
|
|
|
callback = DefaultCallback()
|
|
|
|
self.cb = callback
|
2017-03-06 15:34:54 +00:00
|
|
|
|
2022-09-30 10:49:45 +00:00
|
|
|
def run(self, verbosity=0, **kwargs):
|
2023-07-17 05:59:45 +00:00
|
|
|
verbosity = get_ansible_log_verbosity(verbosity)
|
2018-03-30 14:03:43 +00:00
|
|
|
|
2022-09-30 10:49:45 +00:00
|
|
|
ansible_runner.run(
|
|
|
|
private_data_dir=self.project_dir,
|
2017-03-05 15:30:14 +00:00
|
|
|
inventory=self.inventory,
|
2022-09-30 10:49:45 +00:00
|
|
|
playbook=self.playbook,
|
|
|
|
verbosity=verbosity,
|
|
|
|
event_handler=self.cb.event_handler,
|
|
|
|
status_handler=self.cb.status_handler,
|
2023-01-16 11:02:09 +00:00
|
|
|
host_cwd=self.project_dir,
|
2022-09-30 10:49:45 +00:00
|
|
|
**kwargs
|
2017-03-05 15:30:14 +00:00
|
|
|
)
|
2022-09-30 10:49:45 +00:00
|
|
|
return self.cb
|
2022-10-08 08:55:14 +00:00
|
|
|
|
|
|
|
|
|
|
|
class CommandRunner(AdHocRunner):
|
|
|
|
def __init__(self, inventory, command, pattern='*', project_dir='/tmp/'):
|
|
|
|
super().__init__(inventory, 'shell', command, pattern, project_dir)
|
|
|
|
|
|
|
|
def run(self, verbosity=0, **kwargs):
|
|
|
|
return super().run(verbosity, **kwargs)
|