Question:
In my local.yml
I’m able to run the playbook and reference variables within group_vars/all
however I’m not able to access variables within group_vars/phl-stage
. Let’s assume the following.
1 2 |
ansible-playbook -i phl-stage site.yml |
I have a variable, let’s call it deploy_path
that’s different for each environment. I place the variable within group_vars/< environment name >
. If I include the file group_vars/phl-stage
within vars_files
it works but I would’ve thought the group file would be automatically loaded?
site.yml
1 2 |
- include: local.yml |
local.yml
1 2 3 4 5 6 7 |
- hosts: 127.0.0.1 connection: local vars_files: - "group_vars/perlservers" - "group_vars/deploy_list" |
group_vars/phl-stage
1 2 3 4 5 6 7 8 9 10 11 12 |
[webservers] phl-web1 phl-web2 [perlservers] phl-perl1 phl-perl2 [phl-stage:children] webservers perlservers |
Directory structure:
1 2 3 4 5 6 7 |
group_vars all phl-stage phl-prod site.yml local.yml |
Answer:
You’re confusing the structure a bit.
- The
group_vars
directory contains files for each hostgroup defined in your inventory file. The files define variables that member hosts can use. - The inventory file doesn’t reside in the
group_vars
dir, it should be outside. - Only hosts that are members of a group can use its variables, so unless you put 127.0.0.1 in a group, it won’t be able to use any group_vars beside those defined in
group_vars/all
.
What you want is this dir structure:
1 2 3 4 5 6 7 8 |
group_vars/ all perlservers phl-stage hosts site.yml local.yml |
Your hosts file should look like this, assuming 127.0.0.1 is just a staging server and not perl or web server:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[webservers] phl-web1 phl-web2 [perlservers] phl-perl1 phl-perl2 [phl-stage] 127.0.0.1 [phl-stage:children] webservers perlservers |
So you define which hosts belong to which group in the inventory, and then for each group you define variables in its group_vars file.