Aller au contenu principal

Inventaire dynamique Ansible/vagrant

· 2 minutes de lecture
Stéphane ROBERT
Consultant DevOps

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.

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