|
|
@ -23,7 +23,7 @@ import os
|
|
|
|
|
|
|
|
|
|
|
|
import ansible.playbook
|
|
|
|
import ansible.playbook
|
|
|
|
import ansible.constants as C
|
|
|
|
import ansible.constants as C
|
|
|
|
import ansible.utils.template
|
|
|
|
import ansible.utils.template
|
|
|
|
from ansible import errors
|
|
|
|
from ansible import errors
|
|
|
|
from ansible import callbacks
|
|
|
|
from ansible import callbacks
|
|
|
|
from ansible import utils
|
|
|
|
from ansible import utils
|
|
|
@ -53,11 +53,11 @@ def main(args):
|
|
|
|
|
|
|
|
|
|
|
|
# create parser for CLI options
|
|
|
|
# create parser for CLI options
|
|
|
|
parser = utils.base_parser(
|
|
|
|
parser = utils.base_parser(
|
|
|
|
constants=C,
|
|
|
|
constants=C,
|
|
|
|
usage = "%prog playbook.yml",
|
|
|
|
usage = "%prog playbook.yml",
|
|
|
|
connect_opts=True,
|
|
|
|
connect_opts=True,
|
|
|
|
runas_opts=True,
|
|
|
|
runas_opts=True,
|
|
|
|
subset_opts=True,
|
|
|
|
subset_opts=True,
|
|
|
|
check_opts=True,
|
|
|
|
check_opts=True,
|
|
|
|
diff_opts=True
|
|
|
|
diff_opts=True
|
|
|
|
)
|
|
|
|
)
|
|
|
@ -65,13 +65,15 @@ def main(args):
|
|
|
|
help="set additional key=value variables from the CLI")
|
|
|
|
help="set additional key=value variables from the CLI")
|
|
|
|
parser.add_option('-t', '--tags', dest='tags', default='all',
|
|
|
|
parser.add_option('-t', '--tags', dest='tags', default='all',
|
|
|
|
help="only run plays and tasks tagged with these values")
|
|
|
|
help="only run plays and tasks tagged with these values")
|
|
|
|
|
|
|
|
parser.add_option('--skip-tags', dest='skip_tags',
|
|
|
|
|
|
|
|
help="only run plays and tasks whose tags do not match these values")
|
|
|
|
parser.add_option('--syntax-check', dest='syntax', action='store_true',
|
|
|
|
parser.add_option('--syntax-check', dest='syntax', action='store_true',
|
|
|
|
help="perform a syntax check on the playbook, but do not execute it")
|
|
|
|
help="perform a syntax check on the playbook, but do not execute it")
|
|
|
|
parser.add_option('--list-tasks', dest='listtasks', action='store_true',
|
|
|
|
parser.add_option('--list-tasks', dest='listtasks', action='store_true',
|
|
|
|
help="list all tasks that would be executed")
|
|
|
|
help="list all tasks that would be executed")
|
|
|
|
parser.add_option('--step', dest='step', action='store_true',
|
|
|
|
parser.add_option('--step', dest='step', action='store_true',
|
|
|
|
help="one-step-at-a-time: confirm each task before running")
|
|
|
|
help="one-step-at-a-time: confirm each task before running")
|
|
|
|
parser.add_option('--start-at-task', dest='start_at',
|
|
|
|
parser.add_option('--start-at-task', dest='start_at',
|
|
|
|
help="start the playbook at the task matching this name")
|
|
|
|
help="start the playbook at the task matching this name")
|
|
|
|
|
|
|
|
|
|
|
|
options, args = parser.parse_args(args)
|
|
|
|
options, args = parser.parse_args(args)
|
|
|
@ -97,6 +99,9 @@ def main(args):
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
extra_vars = utils.parse_kv(options.extra_vars)
|
|
|
|
extra_vars = utils.parse_kv(options.extra_vars)
|
|
|
|
only_tags = options.tags.split(",")
|
|
|
|
only_tags = options.tags.split(",")
|
|
|
|
|
|
|
|
skip_tags = options.skip_tags
|
|
|
|
|
|
|
|
if options.skip_tags is not None:
|
|
|
|
|
|
|
|
skip_tags = options.skip_tags.split(",")
|
|
|
|
|
|
|
|
|
|
|
|
for playbook in args:
|
|
|
|
for playbook in args:
|
|
|
|
if not os.path.exists(playbook):
|
|
|
|
if not os.path.exists(playbook):
|
|
|
@ -136,6 +141,7 @@ def main(args):
|
|
|
|
extra_vars=extra_vars,
|
|
|
|
extra_vars=extra_vars,
|
|
|
|
private_key_file=options.private_key_file,
|
|
|
|
private_key_file=options.private_key_file,
|
|
|
|
only_tags=only_tags,
|
|
|
|
only_tags=only_tags,
|
|
|
|
|
|
|
|
skip_tags=skip_tags,
|
|
|
|
check=options.check,
|
|
|
|
check=options.check,
|
|
|
|
diff=options.diff
|
|
|
|
diff=options.diff
|
|
|
|
)
|
|
|
|
)
|
|
|
@ -156,13 +162,20 @@ def main(args):
|
|
|
|
print ' %s' % host
|
|
|
|
print ' %s' % host
|
|
|
|
if options.listtasks:
|
|
|
|
if options.listtasks:
|
|
|
|
matched_tags, unmatched_tags = play.compare_tags(pb.only_tags)
|
|
|
|
matched_tags, unmatched_tags = play.compare_tags(pb.only_tags)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Remove skipped tasks
|
|
|
|
|
|
|
|
matched_tags = matched_tags - set(pb.skip_tags)
|
|
|
|
|
|
|
|
|
|
|
|
unmatched_tags.discard('all')
|
|
|
|
unmatched_tags.discard('all')
|
|
|
|
unknown_tags = set(pb.only_tags) - (matched_tags | unmatched_tags)
|
|
|
|
unknown_tags = ((set(pb.only_tags) | set(pb.skip_tags)) -
|
|
|
|
|
|
|
|
(matched_tags | unmatched_tags))
|
|
|
|
|
|
|
|
|
|
|
|
if unknown_tags:
|
|
|
|
if unknown_tags:
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
print ' play #%d (%s): task count=%d' % (playnum, label, len(play.tasks()))
|
|
|
|
print ' play #%d (%s): task count=%d' % (playnum, label, len(play.tasks()))
|
|
|
|
for task in play.tasks():
|
|
|
|
for task in play.tasks():
|
|
|
|
if set(task.tags).intersection(pb.only_tags):
|
|
|
|
if (set(task.tags).intersection(pb.only_tags) and not
|
|
|
|
|
|
|
|
set(task.tags).intersection(pb.skip_tags)):
|
|
|
|
if getattr(task, 'name', None) is not None:
|
|
|
|
if getattr(task, 'name', None) is not None:
|
|
|
|
# meta tasks have no names
|
|
|
|
# meta tasks have no names
|
|
|
|
print ' %s' % task.name
|
|
|
|
print ' %s' % task.name
|
|
|
@ -173,7 +186,7 @@ def main(args):
|
|
|
|
# if we've not exited by now then we are fine.
|
|
|
|
# if we've not exited by now then we are fine.
|
|
|
|
print 'Playbook Syntax is fine'
|
|
|
|
print 'Playbook Syntax is fine'
|
|
|
|
return 0
|
|
|
|
return 0
|
|
|
|
|
|
|
|
|
|
|
|
failed_hosts = []
|
|
|
|
failed_hosts = []
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
try:
|
|
|
@ -202,7 +215,7 @@ def main(args):
|
|
|
|
colorize('ok', t['ok'], 'green'),
|
|
|
|
colorize('ok', t['ok'], 'green'),
|
|
|
|
colorize('changed', t['changed'], 'yellow'),
|
|
|
|
colorize('changed', t['changed'], 'yellow'),
|
|
|
|
colorize('unreachable', t['unreachable'], 'red'),
|
|
|
|
colorize('unreachable', t['unreachable'], 'red'),
|
|
|
|
colorize('failed', t['failures'], 'red')),
|
|
|
|
colorize('failed', t['failures'], 'red')),
|
|
|
|
screen_only=True
|
|
|
|
screen_only=True
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
@ -211,11 +224,11 @@ def main(args):
|
|
|
|
colorize('ok', t['ok'], None),
|
|
|
|
colorize('ok', t['ok'], None),
|
|
|
|
colorize('changed', t['changed'], None),
|
|
|
|
colorize('changed', t['changed'], None),
|
|
|
|
colorize('unreachable', t['unreachable'], None),
|
|
|
|
colorize('unreachable', t['unreachable'], None),
|
|
|
|
colorize('failed', t['failures'], None)),
|
|
|
|
colorize('failed', t['failures'], None)),
|
|
|
|
log_only=True
|
|
|
|
log_only=True
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print ""
|
|
|
|
print ""
|
|
|
|
if len(failed_hosts) > 0:
|
|
|
|
if len(failed_hosts) > 0:
|
|
|
|
return 2
|
|
|
|
return 2
|
|
|
|