Aller au contenu
Virtualisation medium

Gestion des Instances Proxmox avec Ansible

12 min de lecture

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.

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.local
proxmox_api_node: proxmox
proxmox_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 :

Fenêtre de terminal
ansible-vault encrypt inventory.proxmox.yml

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 :

Fenêtre de terminal
ansible-playbook install.yml -i inventory.proxmox.yml -e @proxmox_auth.yml --vault-password-file=~/vault_password_file

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 :

Fenêtre de terminal
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

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 :

Fenêtre de terminal
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

Section intitulée « 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 :

Fenêtre de terminal
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": [
""
]
}
]
}
}

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 :

Fenêtre de terminal
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"
},
...

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 :

Fenêtre de terminal
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)

Section intitulée « 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 :

Fenêtre de terminal
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

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

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

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.