Prérequis

  • Notre machine de déploiement est en mesure de demander à Proxmox VE de créer des conteneurs LXC (nous avons un jeton d’API pour cela dans la variable d’environnement TF_VAR_api_token qui est automatiquement chargée à l’aide de Direnv).
  • Terraform et Ansible sont installés sur cette machine de déploiement.
  • 5 conteneurs LXC ont été déployés précédemment.
  • Nous avons accès à des paires de clés de connexion SSH présentes dans le répertoire ~/.ssh de la machine de déploiement permettant d’accéder à ces conteneurs.

Contexte

La création d’un inventaire Ansible est une opération fastidieuse et nous souhaitons l’automatiser. Le plugin community.general.proxmox va nous y aider.

Installation du plugin

deployer@ubuntu-deploy:~/homelab_julia_pve_tf_ansible$ ansible-galaxy collection install community.general

Création d’un fichier dynamic-inventory.proxmox.yml

plugin: community.general.proxmox
url: https://192.168.1.6:8006
user: 'terraform-prov@pve'
token_id: 'terraform'
token_secret: '69ffadcc-9eb8-4735-ba92-8f55f59698d4'

Installation du plugin

deployer@ubuntu-deploy:~/homelab_julia_pve_tf_ansible$ ansible-galaxy collection install cloud.terraform

ou fichier requirements.yml contenant

---
collections:
  - name: cloud.terraform

et installation du plugin

deployer@ubuntu-deploy:~/homelab_julia_pve_tf_ansible$ ansible-galaxy collection install -r requirements.yml
Starting galaxy collection install process
Process install dependency map
Starting collection install process
Downloading https://galaxy.ansible.com/api/v3/plugin/ansible/content/published/collections/artifacts/cloud-terraform-3.0.0.tar.gz to /home/deployer/.ansible/tmp/ansible-local-12082quhww6ya/tmptmxhtdva/cloud-terraform-3.0.0-muha5ld3
Installing 'cloud.terraform:3.0.0' to '/home/deployer/.ansible/collections/ansible_collections/cloud/terraform'
cloud.terraform:3.0.0 was installed successfully

Nous devons créer un fichier d’inventaire dynamique dynamic-inventory.proxmox.yml

# Configuration de l'inventaire dynamique Proxmox
plugin: community.general.proxmox
url: https://192.168.1.6:8006
user: 'terraform-prov@pve'
token_id: 'terraform'
token_secret: '69ffadcc-9eb8-4735-ba92-8f55f59698d4'
validate_certs: false
want_facts: true
 
 
compose:
  ansible_host: "proxmox_net0.ip | regex_replace('/24', '')"
  # ansible_ssh_private_key_file: "~/.ssh/id_ed25519"
 
# Création d'un groupe pour calcul-distribue
groups:
  calcul_distribue: "'calcul-distribue' in (proxmox_tags_parsed | default([]))"
 
# Ne garder que les conteneurs qui ont le tag calcul-distribue
filters:
  - "'calcul-distribue' in (proxmox_tags_parsed | default([]))"
 

Vérification de la génération de l’inventaire

Nous pouvons vérifier notre inventaire

deployer@ubuntu-deploy:~/homelab_julia_pve_tf_ansible$ ansible-inventory calcul_distribue -i dynamic-inventory
.proxmox.yml --graph
@calcul_distribue:
  |--ubuntu-lxc-5
  |--ubuntu-lxc-2
  |--ubuntu-lxc-4
  |--ubuntu-lxc-1
  |--ubuntu-lxc-3

Utilisation de cet inventaire pour réaliser un essai d’écho ICMP

deployer@ubuntu-deploy:~/homelab_julia_pve_tf_ansible$ ANSIBLE_REMOTE_USER=root ansible calcul_distribue -i dynamic-inventory.proxmox.yml -m ping
ubuntu-lxc-1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
(...)
ubuntu-lxc-5 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

Génération d’un fichier de la liste des adresses IP des conteneurs déployés pour réaliser le calcul

Nous pouvons obtenir les adresses IP des conteneurs déployés (dans un fichier CSV par exemple).

deployer@ubuntu-deploy:~/homelab_julia_pve_tf_ansible$ ansible-inventory -i dynamic-inventory.proxmox.yml --list calcul_distribue | jq -r '._meta.hostvars | [.[].proxmox_net0.ip | split("/")[0]] | @csv' > servers_ip.csv
"192.168.1.201","192.168.1.202","192.168.1.203","192.168.1.204","192.168.1.205"

Exemple de fichier obtenu servers_ip.csv :

"192.168.1.201","192.168.1.202","192.168.1.203","192.168.1.204","192.168.1.205"

ansibleproxmoxve