Not sure if this is considered an edge case, or if there's a better way to
model things (suggestions appreciated). FWIW, I just started using
Ansible, so please let me know if there's a more idiomatic approach.
Let's say I have a group of docker containers that I want to build images
for to form an environment - so containers for web servers, database
servers, cache servers, some other arbitrary services, etc. I'd like to be
able to automate the creation of this environment within a single playbook.
So, I create a playbook called "docker-cluster". It has some basic
bootstrapping roles like making sure the right Python modules are installed
(python-apt, python-pycurl, docker-py), etc. It also has a role for
building each of the docker images (www, mysql, mongodb, redis, etc).
However, each of these docker images might be built on another local docker
image (e.g., not something that will be pulled from the Docker repository,
so it needs to be built as a prerequisite), so I have the dependencies
listed out as other roles before the actual final containers' roles. The
final list looks something like this:
roles:
- { role: base } # handles general python modules that
Ansible requires
- { role: docker } # handles docker_image prereqs, e.g.
docker-py
- { role: docker-base } # base container, e.g. supervisord, sshd,
etc
- { role: docker-mount } # mount points for --volumes-from, e.g.
shared NAS
- { role: docker-www-base } # boilerplate for web servers
- { role: docker-db-base } # boilerplate for database servers
- { role: docker-app-www } # final web server image
- { role: docker-app-db } # final database server image
etc. We could clean that up by using a common role that has vars passed
in, but that makes reusability a bit more tedious since implementors need
to be aware of any potential changes down the road. This works as expected.
The problem comes when I try to consolidate this a bit - I shouldn't need
to specify these dependencies in the implementation, I should specify them
in the role themselves. Which is great, because there's dependency
support, and it's awesome. But since these roles are all very similar,
they have the same variable names. So for the docker-app-www image, we
might have the following task definition:
# app/www/tasks/main.yml
---
- name: Build {{ tag }}
docker_image: name="{{ tag }}" tag="latest" path="{{ build_path }}" state=
present
# app/www/vars/main.yml
---
tag: my/www
build_path: /path/to/my/www/dockerfile/dir
Great. But now when we introduce a dependency:
# app/www/meta/main.yml
---
dependencies:
- { role: app/base }
which is the same, except for its own variables:
# app/base/tasks/main.yml
---
- name: Build {{ tag }}
docker_image: name="{{ tag }}" tag="latest" path="{{ build_path }}" state=
present
# app/base/vars/main.yml
---
tag: my/base
build_path: /path/to/my/base/dockerfile/dir
we end up with the base task's variables being overridden by the depending
context, so we end up injecting the wrong vars into the dependency.
As an side, this is intentionally a little verbose - these tasks are
identical (except for the vars), so we could use include here instead, but
the point still stands that if I reused the same task I would have to
specify which variables to use anywhere each task was used - vs them being
broken out into separate tasks and letting them have their own var
definitions by virtue of Ansible's task magic.
Any thoughts about how to approach a situation like this (a task with N
levels of dependencies that are all the same task except for
dependency-specific variables, without having to explicitly define the
variables everywhere the task was used) would be greatly appreciated - I'm
not against a total restructuring either, so please let me know if there's
a more sensible way to manage it according to Ansible.
Thanks!
--
You received this message because you are subscribed to the Google Groups
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/ansible-project/915a5a03-9114-4d6c-b990-9c364ff73afd%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.