cli.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import logging
  2. import sys
  3. import os
  4. import pprint
  5. from ansible.parsing.dataloader import DataLoader
  6. from ansible.inventory.manager import InventoryManager
  7. import subprocess
  8. pp = pprint.PrettyPrinter()
  9. logger = logging.getLogger(__name__)
  10. DEFAULT_HOST_FILE = 'hosts'
  11. DEFAULT_PLAYBOOK = 'playbook.yml'
  12. DEFAULT_ANSIBLE_DIR = 'lab/ansible'
  13. def get_inventory() -> dict:
  14. host_file = os.path.join(DEFAULT_ANSIBLE_DIR, DEFAULT_HOST_FILE)
  15. loader = DataLoader()
  16. inventory = InventoryManager(loader=loader, sources=host_file)
  17. x = {}
  18. ignore = ('all', 'ungrouped')
  19. x.update(inventory.groups['all'].serialize()['vars'])
  20. group_dict = inventory.get_groups_dict()
  21. for group in inventory.groups:
  22. if group in ignore:
  23. continue
  24. x.update({
  25. group: group_dict[group]
  26. })
  27. return x
  28. def roles() -> list:
  29. sorted_roles = sorted(list(get_inventory().keys()))
  30. if sys.stdin and sys.stdin.isatty():
  31. for role in sorted_roles:
  32. print(role)
  33. return sorted_roles
  34. def push(roles):
  35. if len(roles) == 1:
  36. roles = roles[0]
  37. else:
  38. roles = ",".join(roles)
  39. cmd = "ansible-playbook"
  40. limit = f"--limit={roles}"
  41. call_list = [cmd, DEFAULT_PLAYBOOK, "-i", DEFAULT_HOST_FILE, limit]
  42. print(call_list)
  43. if sys.stdin and sys.stdin.isatty():
  44. subprocess.run(call_list, cwd=DEFAULT_ANSIBLE_DIR)
  45. def main():
  46. del sys.argv[0]
  47. if len(sys.argv) > 0:
  48. func = sys.argv.pop(0)
  49. args = sys.argv
  50. if args:
  51. return eval(func)(args)
  52. else:
  53. return eval(func)()
  54. if __name__ == '__main__':
  55. main()