From 969c3feb13393af7ad2e0c36ad198d5ab99abf98 Mon Sep 17 00:00:00 2001 From: Michael DeHaan Date: Wed, 11 Jul 2012 20:30:30 -0400 Subject: [PATCH] Allow include statements from plays to specify tags (see tags.yml example file). Also be smart and don't run a play at all if no tasks in the play match any of the tags specified. This includes not running the setup actions! --- examples/playbooks/tags.yml | 20 ++++++++++---------- lib/ansible/playbook/__init__.py | 3 +++ lib/ansible/playbook/play.py | 11 +++++++++++ lib/ansible/playbook/task.py | 5 ++++- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/examples/playbooks/tags.yml b/examples/playbooks/tags.yml index 82eaa83333..95725bc259 100644 --- a/examples/playbooks/tags.yml +++ b/examples/playbooks/tags.yml @@ -3,27 +3,27 @@ # # assume: ansible-playbook tags.yml --tags foo # -# only tags with the given tags will be run when --tags is specified +# try this with: +# --tags foo +# --tags bar # -# (an include statement will also be able to set tags on all included -# tasks at some point in the future) +# note the include syntax to tag all tasks included below +# it is a short hand over adding "tag:" to each task entry - -- name: example play +- name: example play one hosts: all user: root tasks: - name: hi tags: foo - action: shell echo "first play ran" + action: shell echo "first task ran" -- name: example play +- name: example play two hosts: all user: root tasks: - name: hi tags: bar - action: shell echo "second play ran" - - + action: shell echo "second task ran" + - include: tasks/base.yml tags=base diff --git a/lib/ansible/playbook/__init__.py b/lib/ansible/playbook/__init__.py index 0c1c9ec924..16d4a663d4 100644 --- a/lib/ansible/playbook/__init__.py +++ b/lib/ansible/playbook/__init__.py @@ -282,6 +282,9 @@ class PlayBook(object): def _run_play(self, play): ''' run a list of tasks for a given pattern, in order ''' + if not play.should_run(self.only_tags): + return + self.callbacks.on_play_start(play.name) # push any variables down to the system # and get facts/ohai/other data back up diff --git a/lib/ansible/playbook/play.py b/lib/ansible/playbook/play.py index 3acc76945c..a25872a30d 100644 --- a/lib/ansible/playbook/play.py +++ b/lib/ansible/playbook/play.py @@ -79,6 +79,7 @@ class Play(object): task_vars = self.vars.copy() if 'include' in x: tokens = shlex.split(x['include']) + for t in tokens[1:]: (k,v) = t.split("=", 1) task_vars[k]=v @@ -151,6 +152,16 @@ class Play(object): # ************************************************* + def should_run(self, tags): + ''' does the play match any of the tags? ''' + for task in self._tasks: + for task_tag in task.tags: + if task_tag in tags: + return True + return False + + # ************************************************* + def _update_vars_files_for_host(self, host): if not host in self.playbook.SETUP_CACHE: diff --git a/lib/ansible/playbook/task.py b/lib/ansible/playbook/task.py index c65de2235c..6441ec2942 100644 --- a/lib/ansible/playbook/task.py +++ b/lib/ansible/playbook/task.py @@ -62,6 +62,9 @@ class Task(object): if len(tokens) > 1: self.module_args = tokens[1] + import_tags = [] + if 'tags' in self.module_vars: + import_tags = self.module_vars['tags'].split(",") self.name = utils.template(self.name, self.module_vars) self.action = utils.template(self.name, self.module_vars) @@ -78,7 +81,7 @@ class Task(object): self.tags.append(apply_tags) elif type(apply_tags) == list: self.tags.extend(apply_tags) - + self.tags.extend(import_tags)