run_cli.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #!/usr/bin/env python2
  2. import argparse
  3. import sys
  4. import re
  5. import subprocess
  6. import os
  7. import csv
  8. import json
  9. def main():
  10. parser = argparse.ArgumentParser(
  11. prog=sys.argv[0], description='Configure a switch port')
  12. parser.add_argument('--switch', '-s', metavar='<SWITCH NAME(s)>',
  13. help='Switch name or names (comma-separated) on which to run commands (defaults to all) ')
  14. parser.add_argument('--commands', '-c', metavar='<COMMAND(s)>', help='Pipe-separated list of commands to run', required=True)
  15. parser.add_argument('--parents', '-p', metavar='<PARENT(s)>', help='Pipe-separated list of parents for all commands')
  16. parser.add_argument('--username', '-u', metavar='<USERNAME>',
  17. help='Username to use to connect to the N9Ks', required=True)
  18. args = parser.parse_args()
  19. clist = args.commands.split('|')
  20. plist = []
  21. if args.parents:
  22. plist = args.parents.split('|')
  23. os.environ['ANSIBLE_FORCE_COLOR'] = 'True'
  24. os.environ['ANSIBLE_HOST_KEY_CHECKING'] = 'False'
  25. os.environ['ANSIBLE_PERSISTENT_COMMAND_TIMEOUT'] = '300'
  26. command = ['ansible-playbook', '-i', 'inventory/hosts',
  27. '-u', args.username, '-k', '-e',
  28. '{{"cli_commands": {}}}'.format(
  29. json.dumps(clist)), '-e', '{{"cli_parents": {}}}'.format(json.dumps(plist)),
  30. '-e', 'ansible_python_interpreter={}'.format(sys.executable),
  31. 'run-cli-playbook.yml']
  32. if args.switch:
  33. command += ['--limit', '{}'.format(args.switch)]
  34. p = subprocess.Popen(command, stdout=subprocess.PIPE,
  35. stderr=subprocess.STDOUT)
  36. for c in iter(lambda: p.stdout.read(1), ''):
  37. sys.stdout.write(c)
  38. sys.stdout.flush()
  39. if __name__ == '__main__':
  40. main()