Aller au contenu principal

Gestion des Instances Proxmox avec Ansible

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.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 :

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.