Gestion des Instances Proxmox avec Ansible
Création :
Dans le précédent guide, nous avions vu l’utilisation de l’inventaire dynamique Ansible pour Proxmox. Dans ce guide, nous verrons les modules Ansible pour proxmox. Je ne détaillerai pas le provisionnement des instances de conteneurs ou de VM car je confie cette tâche à Terraform. Je vais simplement documenter ce que nous pouvons faire avec chacun des modules de la collection.
Configuration
Pour éviter d’exposer les informations d’authentification dans le playbook, je vais chiffrer les données dans un fichier avec Ansible Vault.
Le contenu du fichier proxmox_auth.yml
:
proxmox_api_host: proxmox.robert.localproxmox_api_node: proxmoxproxmox_api_user: 'terraform-prov@pve'proxmox_api_token_id: 'terraform'proxmox_api_token_secret: '85b12793-73c5-4d72-87b8-xxxxxxxx'
On le chiffre avec ansible vault :
ansible-vault encrypt proxmox_auth.yml
On fait de même avec le fichier d’inventaire :
ansible-vault encrypt inventory.proxmox.yml
Installation des pré-requis sur le node
Pour que les playbooks fonctionnent, il faut installer le module python
proxmoxer
. Pourquoi ne pas le faire avec Ansible ? :
---- name: Test proxmox vault hosts: proxmox tasks: - name: Install pip ansible.builtin.package: name: - python3-pip - python3-proxmoxer state: present
Pour simplifier le lancement, je crée un fichier de mot de passe :
~/vault_password_file
. On peut lancer le playbook ainsi :
ansible-playbook install.yml -i inventory.proxmox.yml -e @proxmox_auth.yml --vault-password-file=~/vault_password_file
Récupérer des infos sur les domains
Pour obtenir des informations sur les utilisateurs, nous utiliserons le module
proxmox_domain_info
:
---- name: Test proxmox vault hosts: proxmox tasks: - name: Get info community.general.proxmox_user_info: api_host: "{{ proxmox_api_host }}" node: "{{ proxmox_api_node }}" api_user: "{{ proxmox_api_user }}" api_token_id: "{{ proxmox_api_token_id }}" api_token_secret: "{{ proxmox_api_token_secret }}" register: infos
- name: Display infos # Comment ansible.builtin.debug: var: infos
On lance le playbook :
ansible-playbook playbook_info.yml -i inventory.proxmox.yml -e @proxmox_auth.yml --vault-password-file=~/vault_password_file
PLAY [Test proxmox vault] ****
TASK [Gathering Facts] ****ok: [proxmox]
TASK [Get info] ****ok: [proxmox]
TASK [Display infos] ****ok: [proxmox] => { "infos": { "changed": false, "failed": false, "proxmox_domains": [ { "comment": "Proxmox VE authentication server", "realm": "pve", "type": "pve" }, { "comment": "Linux PAM standard authentication", "realm": "pam", "type": "pam" } ] }}
PLAY RECAP ****proxmox : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Récupérer des infos sur les users
Pour obtenir des informations sur les utilisateurs, nous utiliserons le module
proxmox_user_info
:
---- name: Test proxmox vault hosts: proxmox tasks: - name: Get info community.general.proxmox_user_info: api_host: "{{ proxmox_api_host }}" node: "{{ proxmox_api_node }}" api_user: "{{ proxmox_api_user }}" api_token_id: "{{ proxmox_api_token_id }}" api_token_secret: "{{ proxmox_api_token_secret }}" register: infos
- name: Display infos # Comment ansible.builtin.debug: var: infos
On lance le playbook :
ansible-playbook playbook_info.yml -i inventory.proxmox.yml -e @proxmox_auth.yml --vault-password-file=~/vault_password_file
TASK [Display infos] ****ok: [proxmox] => { "infos": { "changed": false, "failed": false, "proxmox_users": [ { "domain": "pam", "enabled": true, "expire": 0, "groups": [], "realm-type": "pam", "tokens": [], "user": "root", "userid": "root@pam" }, { "domain": "pve", "enabled": true, "expire": 0, "groups": [], "realm-type": "pve", "tokens": [ { "comment": "Terraform token", "expire": 0, "privsep": false, "tokenid": "terraform" } ], "user": "terraform-prov", "userid": "terraform-prov@pve" } ] }}
PLAY RECAP ****proxmox
Récupérer les infos sur les groupes d’utilsateurs
Pour obtenir des informations sur les groupes, nous utiliserons le module
proxmox_group_info
:
---- name: Test proxmox vault hosts: proxmox tasks: - name: Get info community.general.proxmox_group_info: api_host: "{{ proxmox_api_host }}" node: "{{ proxmox_api_node }}" api_user: "{{ proxmox_api_user }}" api_token_id: "{{ proxmox_api_token_id }}" api_token_secret: "{{ proxmox_api_token_secret }}" register: infos
- name: Display infos # Comment ansible.builtin.debug: var: infos
On lance le playbook :
ansible-playbook playbook_info.yml -i inventory.proxmox.yml -e @proxmox_auth.yml --vault-password-file=~/vault_password_file
TASK [Display infos] ****ok: [proxmox] => { "infos": { "changed": false, "failed": false, "proxmox_groups": [ { "groupid": "test", "users": [ "" ] } ] }}
Récupérer des infos sur les taches
Pour obtenir des informations sur les groupes, nous utiliserons le module
proxmox_group_info
:
- name: Test proxmox vault hosts: proxmox tasks: - name: Get info community.general.proxmox_tasks_info: api_host: "{{ proxmox_api_host }}" # node: "{{ proxmox_api_node }}" api_user: "{{ proxmox_api_user }}" api_token_id: "{{ proxmox_api_token_id }}" api_token_secret: "{{ proxmox_api_token_secret }}" node: "{{ proxmox_api_node }}" register: infos
- name: Display infos # Comment ansible.builtin.debug: var: infos
On lance le playbook :
ansible-playbook playbook_info.yml -i inventory.proxmox.yml -e @proxmox_auth.yml --vault-password-file=~/vault_password_file
TASK [Display infos] ****ok: [proxmox] => { "infos": { "changed": false, "failed": false, "proxmox_tasks": [ { "endtime": 1704205986, "id": "101", "node": "proxmox", "pid": 892569, "pstart": 44801281, "starttime": 1704205984, "status": "OK", "type": "vzstart", "upid": "UPID:proxmox:000D9E99:02AB9D01:65941EA0:vzstart:101:root@pam:", "user": "root@pam" }, ...
Récupérer les infos sur le stockage
Pour obtenir des informations sur les stockages, nous utiliserons le module
proxmox_storage_info
:
- name: Test proxmox vault hosts: proxmox tasks: - name: Get info community.general.proxmox_storage_info: api_host: "{{ proxmox_api_host }}" # node: "{{ proxmox_api_node }}" api_user: "{{ proxmox_api_user }}" api_token_id: "{{ proxmox_api_token_id }}" api_token_secret: "{{ proxmox_api_token_secret }}" # node: "{{ proxmox_api_node }}" register: infos
- name: Display infos # Comment ansible.builtin.debug: var: infos
On lance le playbook :
TASK [Display infos] ****ok: [proxmox] => { "infos": { "changed": false, "failed": false, "proxmox_storages": [ { "content": [ "snippets", "iso", "images", "vztmpl", "backup", "rootdir" ], "digest": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "path": "/var/lib/vz", "priority": 0, "prune-backups": { "keep-all": "1" }, "storage": "local", "type": "dir" } ] }}
Récupérer des infos sur des instances (lxc ou qemu)
Pour obtenir des informations sur une instance proxmox, nous utiliserons le
module proxmox_vm_info
:
---- name: Test proxmox vault hosts: proxmox tasks: - name: Get info community.general.proxmox_vm_info: api_host: "{{ proxmox_api_host }}" node: "{{ proxmox_api_node }}" api_user: "{{ proxmox_api_user }}" api_token_id: "{{ proxmox_api_token_id }}" api_token_secret: "{{ proxmox_api_token_secret }}" type: lxc register: infos
- name: Display infos # Comment ansible.builtin.debug: var: infos
On peut filtrer sur le nom ou sur le type de node. Ici, on affiche toutes les
instances de type lxc
. On exécute :
ansible-playbook playbook_info.yml -i inventory.proxmox.yml -e @proxmox_auth.yml --vault-password-file=~/vault_password_file
TASK [Display infos] ****ok: [proxmox] => { "infos": { "changed": false, "failed": false, "proxmox_vms": [ { "cpu": 0, "cpus": 1, "disk": 550600704, "diskread": 57077760, "diskwrite": 2105344, "id": "lxc/101", "maxcpu": 1, "maxdisk": 8350298112, "maxmem": 536870912, "maxswap": 536870912, "mem": 31830016, "name": "test2", "netin": 21498, "netout": 1268, "node": "proxmox", "pid": 892595, "status": "running", "swap": 0, "template": false, "type": "lxc", "uptime": 200, "vmid": 101 } ] }}
PLAY RECAP ****proxmox : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
La gestion des instances
Le module proxmox
permet de gérer des conteneurs
lxc. Il permet aussi de démarrer,
arrêter et redémarrer des instances selon les besoins.
Exemples :
---- name: Test proxmox vault hosts: proxmox tasks: - name: Stop container instance community.general.proxmox: api_host: "{{ proxmox_api_host }}" node: "{{ proxmox_api_node }}" api_user: "{{ proxmox_api_user }}" api_token_id: "{{ proxmox_api_token_id }}" api_token_secret: "{{ proxmox_api_token_secret }}" onboot: true state: stopped hostname: test2
La gestion des snapshots
Le module snap
permet de gérer des snspashots.
- name: Test proxmox vault hosts: proxmox tasks: - name: Create a snapshot community.general.proxmox_snap: api_host: "{{ proxmox_api_host }}" # node: "{{ proxmox_api_node }}" api_user: "{{ proxmox_api_user }}" api_token_id: "{{ proxmox_api_token_id }}" api_token_secret: "{{ proxmox_api_token_secret }}" # node: "{{ proxmox_api_node }}" state: present snapname: snapshot retention: 2
Conclusion
Avec tous ces modules Ansible, on peut imaginer la mise au point de workflows pour gérer des environnements provisionnés avec Terraform. Si vous ne voulez pas utiliser Terraform pour le provisionnement, vous pouvez utiliser tous les autres modules pour créer vos ressources.