Add a "-o" override option so hosts not in a playbook can still be managed by a playbook.

pull/70/merge
Michael DeHaan 13 years ago
parent b213437bfa
commit 9df612f007

@ -50,6 +50,8 @@ def main(args):
help="ask for SSH password") help="ask for SSH password")
parser.add_option("-M", "--module-path", dest="module_path", parser.add_option("-M", "--module-path", dest="module_path",
help="path to module library", default=C.DEFAULT_MODULE_PATH) help="path to module library", default=C.DEFAULT_MODULE_PATH)
parser.add_option('-o', '--override-hosts', dest="override_hosts", default=None,
help="run playbook against these hosts regardless of inventory settings")
parser.add_option('-T', '--timeout', default=C.DEFAULT_TIMEOUT, type='int', parser.add_option('-T', '--timeout', default=C.DEFAULT_TIMEOUT, type='int',
dest='timeout', help="set the SSH timeout in seconds") dest='timeout', help="set the SSH timeout in seconds")
@ -62,6 +64,9 @@ def main(args):
sshpass = None sshpass = None
if options.ask_pass: if options.ask_pass:
sshpass = getpass.getpass(prompt="SSH password: ") sshpass = getpass.getpass(prompt="SSH password: ")
override_hosts = None
if options.override_hosts:
override_hosts = options.override_hosts.split(",")
# run all playbooks specified on the command line # run all playbooks specified on the command line
for playbook in args: for playbook in args:
@ -73,7 +78,8 @@ def main(args):
verbose=True, verbose=True,
remote_pass=sshpass, remote_pass=sshpass,
callbacks=callbacks.PlaybookCallbacks(), callbacks=callbacks.PlaybookCallbacks(),
timeout=options.timeout timeout=options.timeout,
override_hosts=override_hosts,
) )
try: try:
results = pb.run() results = pb.run()

@ -47,15 +47,16 @@ class PlayBook(object):
# ***************************************************** # *****************************************************
def __init__(self, def __init__(self,
playbook =None, playbook = None,
host_list =C.DEFAULT_HOST_LIST, host_list = C.DEFAULT_HOST_LIST,
module_path =C.DEFAULT_MODULE_PATH, module_path = C.DEFAULT_MODULE_PATH,
forks =C.DEFAULT_FORKS, forks = C.DEFAULT_FORKS,
timeout =C.DEFAULT_TIMEOUT, timeout = C.DEFAULT_TIMEOUT,
remote_user =C.DEFAULT_REMOTE_USER, remote_user = C.DEFAULT_REMOTE_USER,
remote_pass =C.DEFAULT_REMOTE_PASS, remote_pass = C.DEFAULT_REMOTE_PASS,
verbose=False, override_hosts = None,
callbacks=None): verbose = False,
callbacks = None):
self.host_list = host_list self.host_list = host_list
self.module_path = module_path self.module_path = module_path
@ -65,6 +66,7 @@ class PlayBook(object):
self.remote_pass = remote_pass self.remote_pass = remote_pass
self.verbose = verbose self.verbose = verbose
self.callbacks = callbacks self.callbacks = callbacks
self.override_hosts = override_hosts
self.callbacks.set_playbook(self) self.callbacks.set_playbook(self)
# store the list of changes/invocations/failure counts # store the list of changes/invocations/failure counts
@ -83,7 +85,8 @@ class PlayBook(object):
self.basedir = os.path.dirname(playbook) self.basedir = os.path.dirname(playbook)
self.playbook = self._parse_playbook(playbook) self.playbook = self._parse_playbook(playbook)
self.host_list, self.groups = ansible.runner.Runner.parse_hosts(host_list) self.host_list, self.groups = ansible.runner.Runner.parse_hosts(
host_list, override_hosts=self.override_hosts)
# ***************************************************** # *****************************************************
@ -499,7 +502,11 @@ class PlayBook(object):
''' run a list of tasks for a given pattern, in order ''' ''' run a list of tasks for a given pattern, in order '''
# get configuration information about the pattern # get configuration information about the pattern
pattern = pg['hosts'] pattern = pg.get('hosts',None)
if self.override_hosts:
pattern = 'all'
if pattern is None:
raise errors.AnsibleError('hosts declaration is required')
vars = self._get_vars(pg, self.basedir) vars = self._get_vars(pg, self.basedir)
vars_files = pg.get('vars_files', {}) vars_files = pg.get('vars_files', {})

@ -149,9 +149,14 @@ class Runner(object):
# ***************************************************** # *****************************************************
@classmethod @classmethod
def parse_hosts(cls, host_list): def parse_hosts(cls, host_list, override_hosts=None):
''' parse the host inventory file, returns (hosts, groups) ''' ''' parse the host inventory file, returns (hosts, groups) '''
if override_hosts is not None:
if type(override_hosts) != list:
raise errors.AnsibleError("override hosts must be a list")
return (override_hosts, dict(ungrouped=override_hosts))
if type(host_list) == list: if type(host_list) == list:
raise Exception("function can only be called on inventory files") raise Exception("function can only be called on inventory files")

Loading…
Cancel
Save