Automatisierung der Container-Erstellung mit Ansible und Proxmox
Wenn du regelmäßig mit Proxmox arbeitest, kann es schnell mühsam werden, Container manuell zu erstellen. Besonders in der Entwicklung, wenn oft mehrere Container pro Tag benötigt werden, sorgt Automatisierung für deutliche Effizienzsteigerungen. In diesem Blog-Artikel stelle ich ein Ansible-Skript vor, das den Prozess der Container-Erstellung auf Proxmox automatisiert und erkläre die Voraussetzungen sowie mögliche Anpassungen.
Link zum Script auf Github (hier werden die Variablen durch Semaphore gesetzt)
Voraussetzungen
Bevor du mit dem Skript arbeiten kannst, müssen einige Dinge vorbereitet werden:
-
Proxmox-Installation: Proxmox muss auf dem Zielhost installiert und konfiguriert sein. Stelle sicher, dass du Zugang zum Proxmox Web UI hast und die entsprechenden Zugangsdaten für die API (Benutzername, Passwort, IP-Adresse des Hosts) kennst.
-
Ansible: Ansible muss auf deinem lokalen Rechner oder Server installiert sein. Es wird genutzt, um Prozesse zu automatisieren und mit Proxmox zu interagieren.
-
python3-proxmoxer: Auf dem Proxmox-Server muss das Python-Modul
python3-proxmoxer
installiert sein. Dieses Modul ermöglicht es Ansible, über die Proxmox API zu kommunizieren und Container automatisch zu erstellen. Du kannst es mit folgendem Befehl installieren:apt-get install python3-proxmoxer
Ohne dieses Modul kann Ansible keine Container auf Proxmox erstellen. - Netzwerkkonfiguration: Eine stabile Verbindung zwischen deinem Ansible-Host und Proxmox ist essenziell, da du per API-Befehl auf den Proxmox-Host zugreifst.
Das Skript im Detail
Das untenstehende Ansible-Skript automatisiert den Prozess der Container-Erstellung. Es lädt zunächst einen öffentlichen Schlüssel herunter, speichert ihn und nutzt ihn dann für die Authentifizierung im neuen Container.
Verwendung von Prompt-Variablen
In diesem Skript können Variablen wie IP-Adresse, Container-Name (CN), VMID und Passwort direkt im Code definiert oder als Prompt-Variablen eingebunden werden, um bei der Ausführung dynamische Werte anzugeben. Dies bietet Flexibilität, da bei der Erstellung mehrerer Container pro Tag die Werte einfach angepasst werden können.
---
- name: Clone template
hosts: pvem
gather_facts: no
vars_prompt:
- name: "IP"
prompt: "Bitte die IP-Adresse des Containers eingeben"
private: no
- name: "PW"
prompt: "Bitte das Passwort für den Proxmox-Host eingeben"
private: yes
- name: "CN"
prompt: "Bitte den Container-Namen eingeben"
private: no
- name: "PWC"
prompt: "Bitte das Passwort für den Container eingeben"
private: yes
- name: "VMID"
prompt: "Bitte die VMID des Containers eingeben"
private: no
tasks:
- name: Herunterladen des öffentlichen Schlüssels
uri:
url: "http://192.168.0.77:81/download/id_rsa.pub"
method: GET
return_content: yes
register: pubkey_response
- name: Debugge den Inhalt des heruntergeladenen Schlüssels
debug:
msg: "{{ pubkey_response.content }}"
- name: Speichern des öffentlichen Schlüssels in einer Datei
copy:
content: "{{ pubkey_response.content }}"
dest: "/root/id_rsa.pub"
- name: Copy Script to Proxmox Host
copy:
src: /root/id_rsa.pub
dest: /root/ansiblescript/id_rsa.pub
mode: 0666
remote_src: yes
force: yes
- name: Dateiinhalt lesen
shell: cat /root/ansiblescript/id_rsa.pub
register: pub_content
- name: Inhalt in eine Variable setzen
set_fact:
pub_content_variable: "{{ pub_content.stdout }}"
- debug:
var: pub_content_variable
- name: Create new container with minimal options
community.general.proxmox:
vmid: "{{ VMID }}"
node: pvem
api_user: root@pam
api_password: "{{ PW }}"
api_host: 192.168.0.185
password: "{{ PWC }}"
storage: local-lvm
hostname: "{{ CN }}"
ostemplate: 'local:vztmpl/ubuntu-20.04-standard_20.04-1_amd64.tar.gz'
pubkey: "{{ pub_content_variable }}"
disk: '25'
memory: '512'
unprivileged: true
nameserver: '192.168.0.35'
netif: '{"net0":"name=eth0,ip={{ IP }}/24,gw=192.168.0.1,bridge=vmbr0"}'
In diesem Skript werden die folgenden Werte als Eingabe vom Nutzer abgefragt:
- IP: Die IP-Adresse des Containers.
- PW: Das Passwort für den Proxmox-Host.
- CN: Der Name des Containers.
- PWC: Das Passwort für den Container.
- VMID: Die VMID des Containers.
Mit diesen dynamischen Eingabewerten kannst du die Containererstellung effizient und flexibel anpassen.
Der öffentliche SSH-Schlüssel wird also auf einem lokalen Fileserver (unter der Adresse http:/ip oder lokale Domain/download/id_rsa.pub
) bereitgestellt und für die Containererstellung verwendet.
Vorteile der Automatisierung
-
Zeiteinsparung: Du sparst enorm viel Zeit, da du nicht jeden Container manuell konfigurieren musst. Die API-Befehle übernehmen diesen Prozess für dich.
-
Konsistenz: Durch Automatisierung stellst du sicher, dass alle Container identisch eingerichtet werden, was Konsistenz und Fehlerminimierung bedeutet.
-
Flexibilität: Du kannst jederzeit Parameter anpassen, z. B. Arbeitsspeicher, Festplattengröße oder das Betriebssystem, und hast volle Kontrolle über die Container-Konfiguration.
Nachteile / Mögliche Probleme
-
Fehlende Flexibilität bei Sonderfällen: Wenn du spezifische Anpassungen an einem Container vornehmen musst, ist die Automatisierung möglicherweise nicht die optimale Lösung. Einige Sonderfälle können manuell schneller gelöst werden.
-
Fehlertoleranz: Fehler in den API-Calls oder in der Ansible-Konfiguration können zu fehlerhaften Container-Deployments führen. Eine robuste Fehlerbehandlung im Skript ist daher entscheidend.
Fazit
Das vorgestellte Skript bietet dir eine einfache Möglichkeit, die Erstellung von Proxmox-Containern zu automatisieren und so den Entwicklungsprozess zu beschleunigen. Durch den Einsatz von Prompt-Variablen kannst du die Container-Konfiguration dynamisch anpassen und mehrere Container in kürzester Zeit erstellen.