I've seen a few threads about looping over a list on a role, and the
currently preferred method seems to be to pass the list as a variable and
do the looping in each task.
My problem is that I not only want to use each variable as is, but also
construct new variables based on logic over multiple keys in the original
list, and that would be used in several different tasks. I'll show an
example that hopefully makes more sense, but I seem to run in to this issue
over and over again.
In my example case I want to set up multiple virtual hosts on a single
server. Some are https and some are not, and I want to make one vhost on
each port the default.
I currently have a role that accepts a single vhost parameter, and a
playbook where I invoke it once for each virtual host (example is
simplified):
---
- role: vhost
vhost:
name: www.example.com
ssl: yes
primary: yes
- role: vhost
vhost:
name: www.example.com
ssl: no
primary: yes
- role: vhost
vhost:
name: foo.example2.com
ssl: no
primary: no
---
I then have logic in my role that constructs a path to the config file and
a dir where the document root and other virtual host specific files should
be placed.
The config file should be "{{ name }}.conf", but to separate the ssl host
from the non-ssl for the same domain I want the former to be prefixed with
"ssl-". And since this is the primary ssl host it should also be prefixed
with "_" to be loaded first. The path to the document root should also
include the possible "ssl-"-prefix, and the domain name, but not the
"_"-prefix.
To not have to repeat that logic in each task that reference either of the
paths, I set up two new variables, vhost_base_name and vhost_config_file,
through the "defaults/main.yml" file (and also some intermediate variables):
---
vhost_ssl_prefix: "{{ 'ssl-' if (vhost.ssl|bool) else '' }}"
vhost_base_name: "{{ vhost_ssl_prefix }}{{ vhost.name }}"
vhost_primary_prefix: "{{ '_' if (vhost.primary|bool) else '' }}"
vhost_config_file: "{{ vhost_primary_prefix }}{{ vhost_base_name }}.conf"
---
How could I convert this kind of setup to use a list of vhosts in the role
(so I can put the list in a host_vars or group_vars file instead of in a
host specific playbook)? The only way I found is to make (local) command
tasks that loop over the list and echo new strings and registers them in a
new variable. But both the commands and looping over and referencing the
results quickly becomes very unreadable, and it makes me think I'm working
against the flow of the system.
Regards
/Daniel
--
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/81b4b23a-e7be-4a62-b858-399fdf090044%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.