Please forgive a question from a newbie going about things in what is almost surely the wrong way.
I’ve got two groups, “webservers” and “dbservers”, which are the same machine in dev and different machines in production. I’ve defined the provisioning for each group in terms of roles, so it looks something like:
-
hosts: webservers
roles: -
nginx
-
nodejs
-
n-number-of-other-roles-from-ansible-galaxy
-
webservers
-
hosts: dbservers
roles: -
postgresql
-
n-number-of-other-roles-from-ansible-galaxy
-
dbservers
My problem is that the nginx, nodejs, postgresql, and other roles I didn’t write might require system packages I haven’t installed yet, so I’d like to have a “common” role that all hosts use first that installs the packages. This role would refer to a variable “system_packages” and apt-get install all the packages in that list. In production, I can simply use group_vars for the two groups, but in dev, I can’t do that quite as easily because both roles are active at once, so one of them will have their “system_packages” overwritten. My idea for a workaround was to define system_packages as being either the current value of system_packages or an empty list, concatenated with the role-specific packages list. In code, it looks like (roles/webservers/vars/main.yml):
webserver_packages:
- curl
- tmux
empty_list:
system_packages_copy: “{% if system_packages is defined %} {{system_packages}} {% else %} {{empty_list}} {% endif %}”
system_packages: “{{ webserver_system_packages + webserver_system_packages_copy }}”
This fails because of the indirect self-reference by the system_packages variable. Is there a workaround for this behavior? Or is there some better approach for what I’m trying to do?