Peter Pik
Peter Pik

Reputation: 11193

host_vars and group_vars are not getting loaded

I have below folder structure, which seem to make it build and load the roles, but the group and host vars are not being loaded. How come?

/etc/ansible/

- hosts
- requirements.yml
- group_vars/
    - app/
        - postgres.yml
- host_vars/
    - app1/
        - postgres.yml
- roles

/documents/ansible/

- playbook.yml
- vagrant

host file

# Application servers
[app]
192.168.60.6

# Group multi 
[multi:children]
app


#variables applied to all servers
[multi:vars]
ansible_ssh_user=vagrant
ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key

**vagrant **

# -*- mode: ruby -*-
# vi: set ft=ruby :


Vagrant.configure("2") do |config|

  # Genral Vagrant VM Configuration.
  config.vm.box = "geerlingguy/centos7"
  config.ssh.insert_key = false
  config.vm.synced_folder ".", "/vagrant", disabled: true
  config.vm.provider :virtualbox do |v|
    v.memory = 256
    v.linked_clone = true
  end

  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "playbook.yml"
  end

# Application server 1
config.vm.define "app1" do |app|
  app.vm.hostname = "orc-app1.dev"
  app.vm.network :private_network, ip: "192.168.60.6"
end

end

Upvotes: 3

Views: 2618

Answers (2)

Andrew Richards
Andrew Richards

Reputation: 1668

Here's what works for me; it's a combo of various advice found on this and other sites,

Solution

In my Vagrantfile (esp. note the ansible.groups line),

 config.vm.provision "ansible" do |ansible|
  ansible.playbook = "provisioning/site.yml"
  # "default" is the name of the VM as in auto-generated
  ansible.groups = { "vagrant" => ["default"] }
end

My inventory data for the VM goes in provisioning/host_vars/default and/or provisioning/group_vars/vagrant - either as files or directories with files (I prefer this so I can have a file for each role I'm using). Ensure these inventory files have a meaningful extension (so .yml assuming YAML format files) thus provisioning/host_vars/default/role_name.yml or provisioning/group_vars/vagrant/role_name.yml. provisioning can be a directory or (my preference) a symlink; the latter means I can have a common set of roles for my vagrant-handled VMs. Gotcha: Using filename extensions is important; I notice that inventory data that I used to have in files without extensions is now ignored, so I think this is a change in how Ansible reads its inventory.

Background details

The ansible.groups setting in the Vagrantfile tweaks the auto-generated inventory in .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory mentioned in @techraf's answer to add,

[vagrant]
default

The line in the Vagrantfile shown above,

  ansible.playbook = "provisioning/site.yml"

not only specifies the playbook, but also means the playbook directory (or symlink to a directory) is provisioning/.

Vagrant looks in provisioning/host_vars etc because "You can also add group_vars/ and host_vars/ directories to your playbook directory." (from this inventory documentation)

For clarity, here are the contents of each vagrant VM directory,

.vagrant/
ansible.cfg
provisioning -> shared_playbook_directory
Vagrantfile

and in the shared playbook directory,

group_vars/
host_vars/
roles/
site.yml

FYI this Ansible & Vagrant intro page details the host_vars, group_vars etc. inventory layout very well.

Upvotes: 0

techraf
techraf

Reputation: 68479

Vagrant by default uses its own, auto-generated inventory file in .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory.

There is an option ansible.inventory_path in Vagrant to point to the inventory file/directory other than the auto-generated one, but you don't use it to point to the /etc/ansible/hosts in Vagrantfile, so Vagrant is completely unaware of it. Likewise it does not look for host_vars and group_vars in the /etc/ansible.


On the other hand, the path to roles is not overridden by the inventory file, so the fact that Vagrant uses its own one does not influence the path for roles.

They are loaded by default from /etc/ansible/roles (or whatever directory Ansible uses as its default, for example /usr/local/etc/ansible/roles on macOS).

Upvotes: 1

Related Questions