I am trying to find the best way to write roles which have a per item
configurations. By that I mean something like nginx or uwsgi where there
are multiple sites or applications.
For example my current nginx role has a nginx_sites variable which is a
dictionary of multiple site configurations:
nginx_sites:
proj1:
- root /var/www
- listen 80
- location: /
options:
- include uwsgi_params
- uwsgi_pass unix:///var/run/uwsgi/app/proj1/socket
proj2:
- root /var/www
- listen 8080
- location: /
options:
- include uwsgi_params
- uwsgi_pass unix:///var/run/uwsgi/app/proj2/socket
Then my uwsgi role has a uswgi_apps variable where the different
applications are defined:
uwgis_apps:
proj1:
wsgi_file: /srv/django/proj1/src/project/wsgi.py
virtualenv: /srv/django/proj1/env
proj2:
wsgi_file: /srv/django/proj2/src/project/wsgi.py
virtualenv: /srv/django/proj2/env
My django role would than have a django_projects variable with multiple
projects:
django_projects:
proj1: <git repository>
proj2: <git repository>
My problem with this is, that I need to know all the paths and eventually
other options for the "upper" roles. In my opinion the path to the uwsgi
socket is something internal to the role (it could depend on the os) so I
would like some kind of "fact" variable like
uwsgi_sockets["proj1"] to use in the above configuration. The same with the
uwsgi configuration.
I thougt about splitting the roles in two parts a global role which would
install and configure the nginx and uwsgi packages and a site/application
role which would install the configuration for one site/application. These
roles would depend on the global roles.
Then I could write a playbook like so
- hosts: django_host
roles:
- role: django_project
django_project_repo: <git repository of proj1>
- role: uwsgi_application
uwsgi_application_name: proj1
uwsgi_application_config:
wsgi_file: {{ django_project_wsgi_file }}
virtualenv: {{ django_project_virtualenv }}
- role: nginx_site
nginx_site_name: proj1
nginx_site_config:
- root /var/www
- listen 80
- location: /
options:
- include uwsgi_params
- uwsgi_pass unix://{{ uwsgi_application_socket }}
- role: django_project
django_project_repo: <git repository of proj2>
- role: uwsgi_application
uwsgi_application_name: proj2
uwsgi_application_config:
wsgi_file: {{ django_project_wsgi_file }}
virtualenv: {{ django_project_virtualenv }}
- role: nginx_site
nginx_site_name: proj2
nginx_site_config:
- root /var/www
- listen 8080
- location: /
options:
- include uwsgi_params
- uwsgi_pass unix://{{ uwsgi_application_socket }}
I don't know if this is even possible because the variables must be set
after each invokation of the roles. I would have to specify the options in
the playbook itself instead of in the group_vars files.
So long story short, is this a good aproach? Is it even possible? How do
you solve such dependencies in the role configurations? (the roles
themselves are not dependent)
--
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/cce8b33b-3053-4fab-a17c-a0c16efd3b0b%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.