ansible_playbook.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from collections import namedtuple
  2. import logging
  3. from ansible.parsing.dataloader import DataLoader
  4. from ansible.vars import VariableManager
  5. from ansible.inventory import Inventory
  6. from ansible.executor.playbook_executor import PlaybookExecutor
  7. from kalliope.core.NeuronModule import NeuronModule, MissingParameterException
  8. logging.basicConfig()
  9. logger = logging.getLogger("kalliope")
  10. class Ansible_playbook(NeuronModule):
  11. def __init__(self, **kwargs):
  12. super(Ansible_playbook, self).__init__(**kwargs)
  13. self.task_file = kwargs.get('task_file', None)
  14. self.sudo = kwargs.get('sudo', False)
  15. self.sudo_user = kwargs.get('sudo_user', False)
  16. self.sudo_password = kwargs.get('sudo_password', False)
  17. # check if parameters have been provided
  18. if self._is_parameters_ok():
  19. variable_manager = VariableManager()
  20. loader = DataLoader()
  21. options = self._get_options()
  22. passwords = {'become_pass': self.sudo_password}
  23. inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list="localhost")
  24. variable_manager.set_inventory(inventory)
  25. playbooks = [self.task_file]
  26. executor = PlaybookExecutor(
  27. playbooks=playbooks,
  28. inventory=inventory,
  29. variable_manager=variable_manager,
  30. loader=loader,
  31. options=options,
  32. passwords=passwords)
  33. executor.run()
  34. def _is_parameters_ok(self):
  35. if self.task_file is None:
  36. raise MissingParameterException("task_file parameter required")
  37. # check if the user want to use sudo for root privileges
  38. if self.sudo:
  39. # the user must set a login and password
  40. if not self.sudo_user:
  41. raise MissingParameterException("sudo_user parameter required with sudo True")
  42. if not self.sudo_password:
  43. raise MissingParameterException("sudo_password parameter required with sudo True")
  44. return True
  45. def _get_options(self):
  46. """
  47. Return a valid dict of option usable by Ansible depending on the sudo value if set
  48. :return: dict of option
  49. """
  50. Options = namedtuple('Options',
  51. ['connection', 'forks', 'become', 'become_method', 'become_user', 'check', 'listhosts',
  52. 'listtasks', 'listtags', 'syntax', 'module_path'])
  53. if self.sudo:
  54. options = Options(connection='local', forks=100, become=True, become_method="sudo",
  55. become_user=self.sudo_user, check=False, listhosts=False, listtasks=False, listtags=False,
  56. syntax=False, module_path="")
  57. else:
  58. options = Options(connection='local', forks=100, become=None, become_method=None, become_user=None,
  59. check=False, listhosts=False, listtasks=False, listtags=False, syntax=False,
  60. module_path="")
  61. logger.debug("Ansible options: %s" % str(options))
  62. return options