Hi!
Just a heads-up that I’m thinking of adding a --list-tags option to ansible-playbook. Let me know if there’s a reason why that wouldn’t be a good idea, or it’s not needed etc.
My use-case is that I’d like to know in advance whether a tag is included in the playbook, rather than running the playbook and erroring. I can currently work around this by parsing the error output of ansible-playbook --tags random-hash myplaybook
, but I’d like a nicer way
More background for anyone interested:
I’m using ansible to make writing juju-charms [1] much more fun. juju has a number of lifecycle hooks that are run as a service relates to other services (eg., an app server to a database backend). These hooks can be written in anything you like, but we’ve created some helpers so that when a specific hook is called, it just results in a local ansible playbook being run using the --tags hook-name . So all the state can be declared with all the goodness of playbooks and/or roles, rather than bash scripts or python code.
Currently as a charm author, you need to register the ansible-supported hook names by default [2], but I’d like to make that transparent.
Any feedback welcome, I’ll get started on a pull-request if I don’t hear back.
Thanks
[1] https://juju.ubuntu.com/charms/
[2] eg https://github.com/absoludity/charm-bootstrap-ansible/blob/master/hooks/hooks.py
[3] http://micknelson.wordpress.com/2013/11/08/juju-ansible-simpler-charms/
Actually, I’ve just taken a look at the code and seen that, given that I’m already using python helpers for the ansible support, I could just use ansible.playbook.Play().compare_tags() directly. So no change needed
Just getting back to this - it seems quite complicated to get the tags
for a playbook... here's the helper function that I have:
{{{
def get_tags_for_playbook(playbook_path):
"""Return all tags within a playbook."""
# utils imported first to avoid circular import failure.
import ansible.utils
import ansible.callbacks
import ansible.playbook
stats = ansible.callbacks.AggregateStats()
callbacks = ansible.callbacks.PlaybookRunnerCallbacks(stats)
runner_callbacks =
ansible.callbacks.PlaybookRunnerCallbacks(stats)
playbook = ansible.playbook.PlayBook(playbook=playbook_path,
callbacks=callbacks,
runner_callbacks=runner_callbacks,
stats=stats)
myplay = ansible.playbook.Play(playbook, ds=playbook.playbook[0],
basedir=os.path.dirname(playbook_path))
_, playbook_tags = myplay.compare_tags()
playbook_tags.remove('all')
return playbook_tags
}}}
Perhaps it is worth a feature request - let me know if this should be
easier or if I've missed something above?
Thanks.
-Michael
So yeah.
There’s been interest in adding such before, my requirement is usually that it uses the Playbook API to do these things.
Some things are going to require a minor bit of refactoring to make some of that later.
I generally want to avoid special code specific to /usr/bin/ansible commands that are not contained in playbook API code.
I’d generally think needing the stats class would be “not it”.
Workaround for now has been to just specify an invalid tag and it will list available tags, so that is pretty close, but it happens
as a result of a “live” run, so I understand that’s not quite what you want.
Example:
ansible-playbook foo.yml --list-tags NotATagNameJustShowMeTheTags
Sorry that --list-tags was meant to be just “–tags”
ansible-playbook foo.yml --tags NotATagNameJustShowMeTheTags
Are there any activity for this ?
It is really must have feature because of impossibility to get all tags within huge playbooks, developed by large team.
четвер, 17 квітня 2014 р. 05:19:18 UTC+3 користувач Michael DeHaan написав: