| Index: run.py |
| =================================================================== |
| --- a/run.py |
| +++ b/run.py |
| @@ -15,6 +15,16 @@ |
| help='user name for use with SSH, must exist on all hosts' |
| ) |
| + parser.add_argument( |
| + '-l', '--local', action='store_false', dest='remote', default=None, |
| + help='use the local version of hosts.yaml' |
| + ) |
| + |
| + parser.add_argument( |
| + '-r', '--remote', metavar='<master>', dest='remote', type=str, |
| + help='use a remote (puppet-master) version of hosts.yaml' |
| + ) |
| + |
| return parser |
| def parseOptions(args): |
| @@ -41,25 +51,40 @@ |
| options.hosts = hosts |
| return options |
| -def getValidHosts(): |
| - dirname = os.path.dirname(sys.argv[0]) |
| - path_name = os.path.join(dirname, 'modules', 'private', 'hiera', 'hosts.yaml') |
| - with open(path_name, 'rb') as handle: |
| - config = yaml.load(handle) |
| +def getValidHosts(options): |
| + path_canonical = ('modules', 'private', 'hiera', 'hosts.yaml') |
| + |
| + if options.remote: |
| + login = ['-l', options.user] if options.user else [] |
| + path_name = '/etc/puppet/infrastructure/%s' % ("/".join(path_canonical),) |
| + command = ['ssh'] + login + [options.remote, '--', 'sudo', 'cat', path_name] |
| + child = subprocess.Popen(command, stderr=sys.stderr, stdout=subprocess.PIPE) |
| + config = yaml.load(child.stdout) |
| + child.stdout.close() |
| + child.wait() |
| + elif options.remote is False: |
| + dirname = os.path.dirname(sys.argv[0]) |
| + path_name = os.path.join(dirname, *path_canonical) |
| + with open(path_name, 'rb') as handle: |
| + config = yaml.load(handle) |
| + else: |
| + print >>sys.stderr, 'Please either specify a --remote host or use --local' |
| + sys.exit(1) |
| + |
| servers = config.get('servers', {}) |
| return servers |
| -def resolveHostList(hosts): |
| +def resolveHostList(options): |
| result = set() |
| try: |
| - valid_hosts = getValidHosts() |
| + valid_hosts = getValidHosts(options) |
| except Warning as error: |
| print >>sys.stderr, 'Warning: failed to determine valid hosts:', error |
| - result.update(hosts) |
| + result.update(options.hosts) |
| else: |
| - for name in hosts: |
| + for name in options.hosts: |
| chunk = [ |
| value.get('dns', key) for (key, value) in valid_hosts.items() |
| @@ -87,7 +112,7 @@ |
| if __name__ == '__main__': |
| options = parseOptions(sys.argv[1:]) |
| - selectedHosts = resolveHostList(options.hosts) |
| + selectedHosts = resolveHostList(options) |
| if len(selectedHosts) == 0: |
| print >>sys.stderr, 'No valid hosts or groups specified, nothing to do' |
| sys.exit(0) |