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

This commit is contained in:
Michael DeHaan 2012-03-24 16:19:38 -04:00
parent b213437bfa
commit 9df612f007
3 changed files with 39 additions and 21 deletions

View file

@ -50,6 +50,8 @@ def main(args):
help="ask for SSH password")
parser.add_option("-M", "--module-path", dest="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',
dest='timeout', help="set the SSH timeout in seconds")
@ -62,6 +64,9 @@ def main(args):
sshpass = None
if options.ask_pass:
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
for playbook in args:
@ -73,7 +78,8 @@ def main(args):
verbose=True,
remote_pass=sshpass,
callbacks=callbacks.PlaybookCallbacks(),
timeout=options.timeout
timeout=options.timeout,
override_hosts=override_hosts,
)
try:
results = pb.run()

View file

@ -47,24 +47,26 @@ class PlayBook(object):
# *****************************************************
def __init__(self,
playbook =None,
host_list =C.DEFAULT_HOST_LIST,
module_path =C.DEFAULT_MODULE_PATH,
forks =C.DEFAULT_FORKS,
timeout =C.DEFAULT_TIMEOUT,
remote_user =C.DEFAULT_REMOTE_USER,
remote_pass =C.DEFAULT_REMOTE_PASS,
verbose=False,
callbacks=None):
playbook = None,
host_list = C.DEFAULT_HOST_LIST,
module_path = C.DEFAULT_MODULE_PATH,
forks = C.DEFAULT_FORKS,
timeout = C.DEFAULT_TIMEOUT,
remote_user = C.DEFAULT_REMOTE_USER,
remote_pass = C.DEFAULT_REMOTE_PASS,
override_hosts = None,
verbose = False,
callbacks = None):
self.host_list = host_list
self.module_path = module_path
self.forks = forks
self.timeout = timeout
self.remote_user = remote_user
self.remote_pass = remote_pass
self.verbose = verbose
self.callbacks = callbacks
self.host_list = host_list
self.module_path = module_path
self.forks = forks
self.timeout = timeout
self.remote_user = remote_user
self.remote_pass = remote_pass
self.verbose = verbose
self.callbacks = callbacks
self.override_hosts = override_hosts
self.callbacks.set_playbook(self)
# store the list of changes/invocations/failure counts
@ -83,7 +85,8 @@ class PlayBook(object):
self.basedir = os.path.dirname(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 '''
# 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_files = pg.get('vars_files', {})

View file

@ -149,9 +149,14 @@ class Runner(object):
# *****************************************************
@classmethod
def parse_hosts(cls, host_list):
def parse_hosts(cls, host_list, override_hosts=None):
''' 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:
raise Exception("function can only be called on inventory files")