Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to pass variables from one role downstream to other dependency roles with ansible?

I have a generic webserver role that is using another nginx role to spawn new vservers.

webserver/meta/main.yml looks like:

allow_duplicates: yes
dependencies:
  - role: nginx
    name: api vserver
    frontend_port: "{{ frontend_port }}"
    domain: "{{ api_domain }}"
    backend_host: 127.0.0.1
  - role: nginx
    name: portal vserver
    domain: "{{ portal_domain }}"
    backend_host: 127.0.0.1

The problem is that these variables are supposed to be defined inside the webserver-role/vars/(test|staging).yml

Is seems that Ansible will try to load the dependencies before loading the variables.

How can I solve this problem? I don't want to put any configuration specifics inside the low level roles.

Also, I do not want to put configurations inside the playbook itself because these configurations are shared across multiple playbooks.

like image 310
sorin Avatar asked Mar 04 '16 14:03

sorin


1 Answers

This scenario works with Ansible 2.2.
Vars for dependent roles are specified in main role's vars files:

./roles/role1/tasks/main.yml:

- debug: msg="{{ role_param }}"

./roles/role2/meta/main.yml:

allow_duplicates: yes
dependencies:
  - role: role1
    role_param: "{{ param1 }}"
  - role: role1
    role_param: "{{ param2 }}"

./roles/role2/tasks/main.yml:

- debug: msg=role2

./roles/role2/vars/main.yml:

param1: hello1
param2: hello2

Result:

PLAY [localhost] ***************************************************************

TASK [role1 : debug] ***********************************************************
ok: [localhost] => {
    "msg": "hello1"
}

TASK [role1 : debug] ***********************************************************
ok: [localhost] => {
    "msg": "hello2"
}

TASK [role2 : debug] ***********************************************************
ok: [localhost] => {
    "msg": "role2"
}
like image 77
Konstantin Suvorov Avatar answered Sep 20 '22 03:09

Konstantin Suvorov