Access role file different than main.yml

When specifying a role to use in a playbook, is it possible to target a different file other than main.yml? I ask because I’m struggling to find the proper way to layout a playbook and role for my project.

Currently I have roles created for common tasks like nginx, mysql, varnish, etc. I also have a role created specifically for my project. Inside that role I handle things like installing project specific things like APC, memcache, etc. These are each handled by a separate file that is included in the main.yml. I also have a file for deployment that is also included in the main.yml. However, I don’t really want to have code deploy each time I provision a server.

My thought was to create a deploy.yml file in the root and somehow include the role for the project, but just the deploy portion.

How are people handling this with their projects?

So the task file roles/foo/tasks/main.yml is always loaded, however this pattern is common:

main.yml:

I’m aware that I can do that, and have been thinking I might try to implement some sort of variable to determine if I include my deploy.yml file. This solution would work in that code wouldn’t deploy unless I explicitly set that variable via the command line. The problem with that is that code deployment would be accompanied by all of the other tasks for provisioning the server, which is no bueno.

“The problem with that is that code deployment would be accompanied by all of the other tasks for provisioning the server, which is no bueno.”

I don’t understand this part, can you elaborate?

I’d like to be able to run a role and, by default, exclude the code deployment portion. I’d also like to be able to deploy the code without running any other tasks.

I could include a line in the main.yml file for my project role that would only include the deploy.yml file when the deploy_code variable is true. Something similar to below:

  • include: deploy.yml
    when: “deploy_code”

To deploy code, I would run a command like the following:

ansible-playbook site.yml --extra-vars “deploy_code=true”

The problem with this is that my site.yml file has several other entries besides just my project role. The same is true for my project role’s main.yml – it contains other includes besides the deploy.yml. So if run the above command, yes my code will deploy, but every other task will also run, which I don’t want to have happen.

Does that make things clearer at all?

you want conditional includes?

instead of the current case in which includes apply their conditions to all
included tasks.

If you want this, use group_by to create a dynamic group and then apply roles to the dynamic group.

I read a bit about this but am no 100% sure the direction to go. If possible could you give an example how this would work for deployment?

Hi James,

You may consider to use tags with include: http://docs.ansible.com/playbooks_tags.html

- include: deploy.yml tags=deployment

Then, to perform deployment only:

ansible-playbook example.yml --tags "deployment"

And to perform everything else except deployment:

ansible-playbook example.yml --skip-tags "deployment"

The downside is you have to explicitly disable deployment tag for default run. Probably not much of an issue if used in script.

Consider splitting your site.yml up into smaller files all included from site.yml, and just using those, or usings tags.