Aller au contenu

Inventaire dynamique Ansible/Vagrant

logo

Si comme moi vous utilisez Vagrant pour développer, sachez que Vagrant génère ses propres inventaires. Il le fait déjà, mais vous ne le savez pas. Dès lors que vous utilisez ansible comme provisionneur, il crée l’inventaire dans le répertoire suivant .Vagrant/.Vagrant/provisioners/ansible/inventory. Cet inventaire porte le nom Vagrant_ansible_inventory dont le contenu est par exemple le suivant :

# Generated by Vagrant
builder ansible_host=192.168.121.132 ansible_port=22 ansible_user='Vagrant' ansible_ssh_private_key_file='/home/Vagrant/Projets/ansible/build-containers/.Vagrant/machines/builder/libvirt/private_key'

Vous pouvez utiliser cet inventaire en l’indiquant dans l’option -i ou en l’ajoutant dans votre fichier ansible.cfg local.

Terminal window
ansible -i .vagrant/provisioners/ansible/inventory/ -m ping all
Friday 29 October 2021 09:21:48 +0200 (0:00:00.037) 0:00:00.037 ********
builder | SUCCESS => {
"changed": false,
"ping": "pong"
}
Friday 29 October 2021 09:21:48 +0200 (0:00:00.328) 0:00:00.365 ********
===============================================================================
ping -----------------------------------------------------------------------0.33s

Dans votre fichier ansible.cfg :

[defaults]
inventory=.vagrant/provisioners/ansible/inventory

Ajouter des variables

Host_vars permet d’ajouter des variables à cet inventaire :

Vagrant.configure("2") do |config|
config.vm.define "host1"
config.vm.define "host2"
config.vm.provision "ansible" do |ansible|
ansible.playbook = "playbook.yml"
ansible.host_vars = {
"host1" => {"http_port" => 80,
"maxRequestsPerChild" => 808},
"host2" => {"http_port" => 303,
"maxRequestsPerChild" => 909}
}
end
end

Ce qui donne :

# Generated by Vagrant
host1 ansible_host=... http_port=80 maxRequestsPerChild=808
host2 ansible_host=... http_port=303 maxRequestsPerChild=909

Créer des groupes

On peut regrouper des machines avec groups :

Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/trusty64"
config.vm.define "machine1"
config.vm.define "machine2"
config.vm.provision "ansible" do |ansible|
ansible.playbook = "playbook.yml"
ansible.groups = {
"group1" => ["machine1"],
"group2" => ["machine2"],
"group3" => ["machine[1:2]"],
"group4" => ["other_node-[a:d]"], # silly group definition
"all_groups:children" => ["group1", "group2"],
"group1:vars" => {"variable1" => 9,
"variable2" => "example"}
}
end
end

Ce qui donne :

# Generated by Vagrant
machine1 ansible_host=127.0.0.1 ansible_port=2200 ansible_user='vagrant' ansible_ssh_private_key_file='/home/.../.vagrant/machines/machine1/virtualbox/private_key'
machine2 ansible_host=127.0.0.1 ansible_port=2222 ansible_user='vagrant' ansible_ssh_private_key_file='/home/.../.vagrant/machines/machine2/virtualbox/private_key'
[group1]
machine1
[group2]
machine2
[group3]
machine[1:2]
[group4]
other_node-[a:d]
[all_groups:children]
group1
group2
[group1:vars]
variable1=9
variable2=example

Voilà qui va vous simplifier la vie et ouvrir d’autres perspectives d’utilisation de Vagrant.

Toutes les infos ici