diff --git a/examples/playbooks/roles/foo/files/foo.txt b/examples/playbooks/roles/foo/files/foo.txt new file mode 100644 index 0000000000..7b6f19a00c --- /dev/null +++ b/examples/playbooks/roles/foo/files/foo.txt @@ -0,0 +1,2 @@ +This is a file + diff --git a/examples/playbooks/roles/foo/handlers/main.yml b/examples/playbooks/roles/foo/handlers/main.yml new file mode 100644 index 0000000000..d41caad6f9 --- /dev/null +++ b/examples/playbooks/roles/foo/handlers/main.yml @@ -0,0 +1,6 @@ +--- + +- name: blippy + shell: echo notifier called, and the value of x is '{{ x }}' + + diff --git a/examples/playbooks/roles/foo/main.yml b/examples/playbooks/roles/foo/main.yml new file mode 100644 index 0000000000..d763d16cfd --- /dev/null +++ b/examples/playbooks/roles/foo/main.yml @@ -0,0 +1,8 @@ +--- + +- name: template operation + template: src=foo.j2 dest=/etc/motd + +- action: shell echo 'hi webserver' + notify: + - blippy diff --git a/examples/playbooks/roles/foo/tasks/main.yml b/examples/playbooks/roles/foo/tasks/main.yml new file mode 100644 index 0000000000..13a143dc9f --- /dev/null +++ b/examples/playbooks/roles/foo/tasks/main.yml @@ -0,0 +1,9 @@ +--- + +- name: copy operation + copy: src=foo.txt dest=/tmp/roles_test1.txt + +- name: template operation + template: src=foo.j2 dest=/tmp/roles_test2.txt + notify: + - blippy diff --git a/examples/playbooks/roles/foo/templates/foo.j2 b/examples/playbooks/roles/foo/templates/foo.j2 new file mode 100644 index 0000000000..172015653f --- /dev/null +++ b/examples/playbooks/roles/foo/templates/foo.j2 @@ -0,0 +1 @@ +I am a {{ ansible_os_family }} distribution. diff --git a/examples/playbooks/roles/foo/vars/main.yml b/examples/playbooks/roles/foo/vars/main.yml new file mode 100644 index 0000000000..68576ba28f --- /dev/null +++ b/examples/playbooks/roles/foo/vars/main.yml @@ -0,0 +1,3 @@ +--- +x: '{{ ansible_machine }}' + diff --git a/examples/playbooks/roletest.yml b/examples/playbooks/roletest.yml new file mode 100644 index 0000000000..8aa934588f --- /dev/null +++ b/examples/playbooks/roletest.yml @@ -0,0 +1,39 @@ +# in Ansible 1.2 and later, roles allow easy best-practices organization of content +# and maximize shareability of ansible building blocks. +# +# suppose a playbook applied to a group of hosts includes two roles, foo and bar. +# +# what do roles do in this case? +# +# listing the roles as foo and bar will auto include the following: +# +# tasks from ./roles/foo/tasks/main.yml, then ./roles/bar/tasks/main.yml +# handlers from ./roles/foo/handlers/main.yml, then ./roles/bar/handlers/main.yml +# vars from ./roles/foo/vars/main.yml, then ./roles/bar/vars/main.yml +# +# should any of these files not exist, that is ok, and they will simply not be loaded. +# +# should the task file in foo/tasks/main.yml want to include subtasks in other files, that +# is also permitted. +# +# templates and copy operations also get smarter about where to look for content when using +# roles. +# +# as an example, a task in foo/tasks/main.yml could copy or template a file by +# referencing a "src=foo.j2" rather than having to explicitly path src=roles/foo/templates/foo.j2. + +--- + + - hosts: all + roles: + - foo + + # add as many roles as you like, roles takes a list of roles names + # these paths can be qualified, but if bare, it will look from them in + # roles/$rolename relative to the playbook + # + # - bar + + # explicit tasks and handlers can be used, but are not required. + # they will run after the roles if present. + diff --git a/lib/ansible/playbook/play.py b/lib/ansible/playbook/play.py index d0a3e9138a..7c5a746255 100644 --- a/lib/ansible/playbook/play.py +++ b/lib/ansible/playbook/play.py @@ -127,11 +127,13 @@ class Play(object): new_vars_files = [] for orig_path in roles: path = utils.path_dwim(self.basedir, orig_path) - if not os.path.isdir(path): - path2 = utils.path_dwim(self.basedir, os.path.join(self.basedir, 'roles', orig_path)) + if not os.path.isdir(path) and not orig_path.startswith(".") and not orig_path.startswith("/"): + path2 = utils.path_dwim(self.basedir, os.path.join('roles', orig_path)) if not os.path.isdir(path2): raise errors.AnsibleError("cannot find role in %s or %s" % (path, path2)) path = path2 + elif not os.path.isdir(path): + raise errors.AnsibleError("cannot find role in %s" % (path)) task = utils.path_dwim(self.basedir, os.path.join(path, 'tasks', 'main.yml')) handler = utils.path_dwim(self.basedir, os.path.join(path, 'handlers', 'main.yml')) vars_file = utils.path_dwim(self.basedir, os.path.join(path, 'vars', 'main.yml'))