Skip to content

Instantly share code, notes, and snippets.

@brent-hoover
Created October 24, 2014 23:23
Show Gist options
  • Select an option

  • Save brent-hoover/7986853243ef0160150f to your computer and use it in GitHub Desktop.

Select an option

Save brent-hoover/7986853243ef0160150f to your computer and use it in GitHub Desktop.
runplaybook
#!/usr/bin/env python
import os
from termcolor import colored, cprint
import ansible.playbook
import ansible.constants as C
import ansible.utils.template
from ansible import errors
from ansible import callbacks
from ansible import utils
from ansible.color import ANSIBLE_COLOR, stringc
from ansible.callbacks import display
def colorize(lead, num, color):
""" Print 'lead' = 'num' in 'color' """
if num != 0 and ANSIBLE_COLOR and color is not None:
return "%s%s%-15s" % (stringc(lead, color), stringc("=", color), stringc(str(num), color))
else:
return "%s=%-4s" % (lead, str(num))
def hostcolor(host, stats, color=True):
if ANSIBLE_COLOR and color:
if stats['failures'] != 0 or stats['unreachable'] != 0:
return "%-37s" % stringc(host, 'red')
elif stats['changed'] != 0:
return "%-37s" % stringc(host, 'yellow')
else:
return "%-37s" % stringc(host, 'green')
return "%-26s" % host
def run_playbook(playbook_name, inventory_file, subset=None, check=False, extra_vars=None):
print('running playbook: %s' % playbook_name)
inventory = ansible.inventory.Inventory(inventory_file)
inventory.subset(subset)
inventory.set_playbook_basedir(os.path.dirname(playbook_name))
stats = callbacks.AggregateStats()
playbook_cb = callbacks.PlaybookCallbacks(verbose=utils.VERBOSITY)
runner_cb = callbacks.PlaybookRunnerCallbacks(stats, verbose=utils.VERBOSITY)
failed_hosts = []
unreachable_hosts = []
playbook = ansible.playbook.PlayBook(playbook=playbook_name, inventory=inventory, callbacks=playbook_cb,
stats=stats, runner_callbacks=runner_cb, extra_vars=extra_vars, check=check)
try:
playbook.run()
hosts = sorted(playbook.stats.processed.keys())
display(callbacks.banner("PLAY RECAP"))
playbook_cb.on_stats(playbook.stats)
for h in hosts:
t = playbook.stats.summarize(h)
if t['failures'] > 0:
failed_hosts.append(h)
if t['unreachable'] > 0:
unreachable_hosts.append(h)
retries = failed_hosts + unreachable_hosts
if len(retries) > 0:
filename = playbook.generate_retry_inventory(retries)
if filename:
display(" to retry, use: --limit @%s\n" % filename)
for h in hosts:
t = playbook.stats.summarize(h)
display("%s : %s %s %s %s" % (
hostcolor(h, t),
colorize('ok', t['ok'], 'green'),
colorize('changed', t['changed'], 'yellow'),
colorize('unreachable', t['unreachable'], 'red'),
colorize('failed', t['failures'], 'red')),
screen_only=True
)
display("%s : %s %s %s %s" % (
hostcolor(h, t, False),
colorize('ok', t['ok'], None),
colorize('changed', t['changed'], None),
colorize('unreachable', t['unreachable'], None),
colorize('failed', t['failures'], None)),
log_only=True
)
print ""
if len(failed_hosts) > 0:
return 2
if len(unreachable_hosts) > 0:
return 3
except errors.AnsibleError, e:
display("ERROR: %s" % e, color='red')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment