Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Merge pull request #6299 from jimi-c/issue_4656_role_deps_across_plays

Keep track of role dependencies across plays
  • Loading branch information...
commit 0e98496e1294173781cb87345594944b9392bd8b 2 parents 94a7fb6 + 73c883c
@jimi-c jimi-c authored
View
1  CHANGELOG.md
@@ -6,6 +6,7 @@ Ansible Changes By Release
Major features/changes:
* The deprecated legacy variable templating system has been finally removed. Use {{ foo }} always not $foo or ${foo}.
+* Role dependencies are now tracked across multiple plays, making common roles easier to include in dependencies without any special variable tricks.
New Modules:
View
9 lib/ansible/playbook/__init__.py
@@ -240,13 +240,20 @@ def run(self):
plays = []
matched_tags_all = set()
unmatched_tags_all = set()
+ included_roles = []
# loop through all patterns and run them
self.callbacks.on_start()
for (play_ds, play_basedir) in zip(self.playbook, self.play_basedirs):
- play = Play(self, play_ds, play_basedir, vault_password=self.vault_password)
+ play = Play(self, play_ds, play_basedir, included_roles=included_roles, vault_password=self.vault_password)
assert play is not None
+ # add any new roles brought in by this play to the
+ # global list of roles we're tracking
+ for role in play.included_roles:
+ if role not in included_roles:
+ included_roles.append(role)
+
matched_tags, unmatched_tags = play.compare_tags(self.only_tags)
matched_tags_all = matched_tags_all | matched_tags
unmatched_tags_all = unmatched_tags_all | unmatched_tags
View
18 lib/ansible/playbook/play.py
@@ -49,7 +49,7 @@ class Play(object):
# *************************************************
- def __init__(self, playbook, ds, basedir, vault_password=None):
+ def __init__(self, playbook, ds, basedir, included_roles=[], vault_password=None):
''' constructor loads from a play datastructure '''
for x in ds.keys():
@@ -81,7 +81,7 @@ def __init__(self, playbook, ds, basedir, vault_password=None):
self._update_vars_files_for_host(None)
# now we load the roles into the datastructure
- self.included_roles = []
+ self.included_roles = included_roles
ds = self._load_roles(self.roles, ds)
# and finally re-process the vars files as they may have
@@ -227,6 +227,20 @@ def _build_role_dependencies(self, roles, dep_stack, passed_vars={}, level=0):
if meta_data:
allow_dupes = utils.boolean(meta_data.get('allow_duplicates',''))
+ # if any tags were specified as role/dep variables, merge
+ # them into the passed_vars so they're passed on to any
+ # further dependencies too, and so we only have one place
+ # (passed_vars) to look for tags going forward
+ def __merge_tags(var_obj):
+ old_tags = passed_vars.get('tags', [])
+ new_tags = var_obj.get('tags', [])
+ if isinstance(new_tags, basestring):
+ new_tags = [new_tags, ]
+ return list(set(old_tags + new_tags))
+
+ passed_vars['tags'] = __merge_tags(role_vars)
+ passed_vars['tags'] = __merge_tags(dep_vars)
+
# if tags are set from this role, merge them
# into the tags list for the dependent role
if "tags" in passed_vars:
Please sign in to comment.
Something went wrong with that request. Please try again.