Proxmox VE IoT ‐ 4 - itnett/FTD02H-N GitHub Wiki

Her er en fullstendig Ansible-pakke som logger seg på din Proxmox-server, utfører en inventering av alle relevante parametere, og bygger grunnlaget for videre automatisering. Denne pakken vil også inkludere en Ansible Vault for sikker håndtering av passord og autentiseringsdetaljer.

Prosjektstruktur

proxmox-automation/
│
├── inventory/
│   └── hosts.ini
│
├── playbooks/
│   ├── inventory_proxmox.yml
│   ├── manage_vms_cts.yml
│   ├── configure_vault.yml
│   └── deploy_monitoring.yml
│
├── roles/
│   ├── proxmox_inventory/
│   │   ├── tasks/
│   │   │   └── main.yml
│   │   └── files/
│   │       └── vault_password_file
│   ├── vm_ct_management/
│   │   └── tasks/
│   │       └── main.yml
│   └── monitoring_setup/
│       └── tasks/
│           └── main.yml
│
├── vault/
│   └── vault.yml
│
├── scripts/
│   └── proxmox_inventory.py
│
└── README.md

Filbeskrivelser

  1. inventory/hosts.ini: Definerer målserverne (Proxmox-host) for Ansible å operere på.
  2. playbooks/inventory_proxmox.yml: Utfører inventar av Proxmox-serverens konfigurasjon.
  3. playbooks/manage_vms_cts.yml: Administrerer opprettelse, oppstart, stopp og fjerning av VM-er og CT-er.
  4. playbooks/configure_vault.yml: Konfigurerer og oppretter Ansible Vault for å lagre sensitiv informasjon.
  5. playbooks/deploy_monitoring.yml: Installerer overvåkingsverktøy som Prometheus og Grafana.
  6. roles/proxmox_inventory: Rolle for å hente inventardata fra Proxmox-serveren.
  7. roles/vm_ct_management: Rolle for å administrere VMs og CTs på Proxmox.
  8. roles/monitoring_setup: Rolle for å sette opp overvåkingstjenester.
  9. vault/vault.yml: Ansible Vault-fil for å lagre sensitiv informasjon.
  10. scripts/proxmox_inventory.py: Python-skript for å hente inventardata fra Proxmox API.
  11. README.md: Instruksjoner for hvordan du bruker prosjektet.

inventory/hosts.ini

[proxmox]
192.168.1.10 ansible_user=root ansible_password=!vault_ansible_proxmox_password

vault/vault.yml

Lag en Ansible Vault-fil for å lagre alle passordene og tokenene sikkert.

---
ansible_proxmox_password: "proxmox_password"
ansible_api_token: "your_api_token"
vault_password: "super_secret_vault_password"

Kommandolinje for å opprette Ansible Vault

Du må først opprette en Ansible Vault og kryptere filen:

ansible-vault create vault/vault.yml

playbooks/inventory_proxmox.yml

Denne playbooken bruker et Python-skript for å hente inventardata fra Proxmox-serveren.

---
- name: Gather Proxmox inventory
  hosts: proxmox
  gather_facts: no
  tasks:
    - name: Install necessary Python libraries
      pip:
        name: proxmoxer
        state: present

    - name: Run Proxmox inventory script
      script: scripts/proxmox_inventory.py
      register: inventory_output

    - name: Save inventory output
      copy:
        content: "{{ inventory_output.stdout }}"
        dest: "inventory/proxmox_inventory_{{ ansible_date_time.iso8601 }}.json"

scripts/proxmox_inventory.py

Python-skriptet for å hente inventardata fra Proxmox.

#!/usr/bin/env python3
from proxmoxer import ProxmoxAPI
import json

proxmox = ProxmoxAPI('192.168.1.10', user='root@pam', password='proxmox_password', verify_ssl=False)

# Samle alle noder, VM-er og containere
inventory = {}

# Få tak i alle noder
nodes = proxmox.nodes.get()
inventory['nodes'] = nodes

# Få tak i all informasjon om hver node
for node in nodes:
    node_name = node['node']
    inventory[node_name] = {}
    
    # Samle VM-er
    vms = proxmox.nodes(node_name).qemu.get()
    inventory[node_name]['vms'] = vms

    # Samle containere (CT-er)
    containers = proxmox.nodes(node_name).lxc.get()
    inventory[node_name]['cts'] = containers

    # Samle lagring
    storages = proxmox.nodes(node_name).storage.get()
    inventory[node_name]['storages'] = storages

    # Samle nettverkskonfigurasjon
    network = proxmox.nodes(node_name).network.get()
    inventory[node_name]['network'] = network

# Skriv ut inventar som JSON
print(json.dumps(inventory, indent=4))

playbooks/manage_vms_cts.yml

Denne playbooken håndterer opprettelse, oppstart, stopp og fjerning av VM-er og CT-er.

---
- name: Manage VMs and CTs on Proxmox
  hosts: proxmox
  gather_facts: no
  tasks:
    - name: Create or update VMs and CTs
      include_role:
        name: vm_ct_management

roles/vm_ct_management/tasks/main.yml

Oppgaver for å administrere VM-er og CT-er.

---
- name: Create or update VM
  community.general.proxmox_kvm:
    api_host: "{{ proxmox_api_url }}"
    api_user: "{{ proxmox_api_user }}"
    api_password: "{{ proxmox_api_password }}"
    api_validate_certs: no
    node: "{{ node }}"
    vmid: "{{ item.vmid }}"
    name: "{{ item.name }}"
    memory: "{{ item.memory }}"
    cores: "{{ item.cores }}"
    net0: "{{ item.net0 }}"
    disk: 10
    storage: "{{ storage }}"
    ostype: l26
    iso: "{{ item.iso | default('') }}"
    state: "{{ item.state }}"
  with_items: "{{ vm_list }}"

README.md

Instruksjoner for bruk av prosjektet.

# Proxmox Automation with Ansible

Dette Ansible-prosjektet automatiserer administrasjonen av en Proxmox-server, inkludert inventar, administrasjon av virtuelle maskiner og containere, og sikker lagring av autentiseringsinformasjon med Ansible Vault.

## Forutsetninger

- Ansible og Python installert på kontrollmaskinen.
- `proxmoxer` Python-bibliotek installert (`pip install proxmoxer`).
- Tilgang til Proxmox-serverens API med brukernavn og passord eller API-token.
- Ansible Vault opprettet for å lagre sensitive data.

## Bruk

1. Klon dette prosjektet:
    ```bash
    git clone https://github.com/dittbrukernavn/proxmox-automation.git
    cd proxmox-automation
    ```

2. Rediger `inventory/hosts.ini` for å inkludere din Proxmox-server.

3. Opprett og rediger Ansible Vault:
    ```bash
    ansible-vault create vault/vault.yml
    ```

4. Kjør inventar-playbooken for å samle informasjon om din Proxmox-server:
    ```bash
    ansible-playbook playbooks/inventory_proxmox.yml --ask-vault-pass
    ```

5. Kjør administrasjons-playbooken for å administrere VM-er og CT-er:
    ```bash
    ansible-playbook playbooks/manage_vms_cts.yml --ask-vault-pass
    ```

## Feilsøking

- Kontroller at `ansible.cfg` er riktig konfigurert.
- Bruk `-vvv` med `ansible-playbook` for mer detaljert output ved feilsøking.

Oppsummering

Dette prosjektet gir en omfattende løsning for administrasjon av Proxmox-servere ved hjelp av Ansible og Proxmox API. Det inkluderer automatisering av inventar, administrasjon av VM-er og containere, sikker håndtering av passord med Ansible Vault, og støtte for overvåking og logging. Du kan enkelt tilpasse og utvide prosjektet etter dine spesifikke behov og krav.

For å periodisk kjøre inventar av Proxmox-serveren din og automatisk håndtere SSH-nøkler for enkel interaksjon med VMs og CTs, samt administrere gratis SSL-sertifikater for webservere på disse enhetene, kan vi utvide Ansible-prosjektet ditt med cron-jobber, SSH-nøkkelhåndtering, og integrering med en gratis sertifikattjeneste som Let's Encrypt.

Tilpasninger for Periodisk Inventar, SSH-nøkler, og SSL-sertifikater

1. Periodisk Inventar

For å kjøre inventar-innsamling periodisk, kan vi bruke Ansible til å sette opp en cron-jobb på kontrollmaskinen (den som kjører Ansible) eller på en server som vil utføre inventar-innsamlingen regelmessig.

2. Automatisk SSH-nøkkelhåndtering

For å sikre at Ansible kan interagere med VMs og CTs uten brukernavn/passord, vil vi automatisk opprette SSH-nøkler og distribuere dem til alle VMs og CTs etter at de er opprettet eller når inventaret oppdateres.

3. Automatisk SSL-sertifikatshåndtering

For å automatisere opprettelse og oppdatering av SSL-sertifikater, vil vi bruke certbot (Let's Encrypt-klienten) til å hente og fornye sertifikater automatisk.

Oppdatert Prosjektstruktur

proxmox-automation/
│
├── inventory/
│   └── hosts.ini
│
├── playbooks/
│   ├── inventory_proxmox.yml
│   ├── manage_vms_cts.yml
│   ├── configure_vault.yml
│   ├── deploy_monitoring.yml
│   ├── distribute_ssh_keys.yml
│   └── manage_ssl_certificates.yml
│
├── roles/
│   ├── proxmox_inventory/
│   │   ├── tasks/
│   │   │   └── main.yml
│   ├── vm_ct_management/
│   │   └── tasks/
│   │       └── main.yml
│   ├── monitoring_setup/
│   │   └── tasks/
│   │       └── main.yml
│   ├── ssh_key_management/
│   │   └── tasks/
│   │       └── main.yml
│   └── ssl_cert_management/
│       └── tasks/
│           └── main.yml
│
├── vault/
│   └── vault.yml
│
├── scripts/
│   ├── proxmox_inventory.py
│   └── manage_certbot.sh
│
└── README.md

playbooks/inventory_proxmox.yml

Oppdater denne playbooken for å inkludere periodisk inventar ved hjelp av cron-modulen i Ansible.

---
- name: Gather Proxmox inventory
  hosts: proxmox
  gather_facts: no
  tasks:
    - name: Install necessary Python libraries
      pip:
        name: proxmoxer
        state: present

    - name: Run Proxmox inventory script
      script: scripts/proxmox_inventory.py
      register: inventory_output

    - name: Save inventory output
      copy:
        content: "{{ inventory_output.stdout }}"
        dest: "inventory/proxmox_inventory_{{ ansible_date_time.iso8601 }}.json"

    - name: Schedule inventory job
      cron:
        name: "Run Proxmox inventory every day"
        minute: "0"
        hour: "2"
        job: "ansible-playbook /path/to/proxmox-automation/playbooks/inventory_proxmox.yml --ask-vault-pass"

playbooks/distribute_ssh_keys.yml

Playbook for å generere SSH-nøkkelpar og distribuere de til alle VMs og CTs.

---
- name: Distribute SSH keys to VMs and CTs
  hosts: all
  gather_facts: no
  tasks:
    - name: Generate SSH key pair
      user:
        name: ansible
        generate_ssh_key: yes
        ssh_key_bits: 2048
        ssh_key_file: /home/ansible/.ssh/id_rsa

    - name: Copy public SSH key to VMs and CTs
      authorized_key:
        user: "{{ ansible_user }}"
        state: present
        key: "{{ lookup('file', '/home/ansible/.ssh/id_rsa.pub') }}"
      when: inventory_hostname in groups['all']

playbooks/manage_ssl_certificates.yml

Playbook for å installere og administrere Let's Encrypt-sertifikater.

---
- name: Manage SSL certificates for web servers
  hosts: all
  gather_facts: no
  tasks:
    - name: Install Certbot
      apt:
        name: certbot
        state: present
        update_cache: yes

    - name: Obtain SSL certificate using Certbot
      command: "certbot certonly --standalone -d {{ inventory_hostname }} --email [email protected] --agree-tos --non-interactive"
      register: certbot_output

    - name: Schedule renewal of SSL certificates
      cron:
        name: "Renew Let's Encrypt certificates"
        minute: "0"
        hour: "3"
        day: "*/30"
        job: "certbot renew --quiet --renew-hook 'systemctl reload nginx'"

scripts/manage_certbot.sh

Et skript for å automatisk fornye sertifikater.

#!/bin/bash

certbot renew --quiet --renew-hook "systemctl reload nginx"

roles/ssh_key_management/tasks/main.yml

Oppgaver for SSH-nøkkeladministrasjon.

---
- name: Ensure SSH key is generated
  user:
    name: ansible
    generate_ssh_key: yes
    ssh_key_bits: 2048
    ssh_key_file: /home/ansible/.ssh/id_rsa

- name: Distribute SSH key to all hosts
  authorized_key:
    user: "{{ ansible_user }}"
    state: present
    key: "{{ lookup('file', '/home/ansible/.ssh/id_rsa.pub') }}"

roles/ssl_cert_management/tasks/main.yml

Oppgaver for å administrere SSL-sertifikater.

---
- name: Install Certbot
  apt:
    name: certbot
    state: present
    update_cache: yes

- name: Obtain SSL certificate
  command: "certbot certonly --standalone -d {{ inventory_hostname }} --email [email protected] --agree-tos --non-interactive"
  register: certbot_output

- name: Schedule certificate renewal
  cron:
    name: "Renew Let's Encrypt certificates"
    minute: "0"
    hour: "3"
    day: "*/30"
    job: "certbot renew --quiet --renew-hook 'systemctl reload nginx'"

Oppdatering av README.md

Oppdater dokumentasjonen for å forklare hvordan du konfigurerer og bruker de nye funksjonene:

## Oppsett og Kjøring av Periodisk Inventar og Automatisert SSH-nøkkel og SSL-sertifikathåndtering

### Periodisk Inventar

For å sette opp periodisk inventar av Proxmox-serveren, kan du bruke cron-jobben som er inkludert i `inventory_proxmox.yml`. Playbooken vil automatisk kjøre inventarinnsamling hver dag kl. 02:00.

### Distribusjon av SSH-nøkler

Playbooken `distribute_ssh_keys.yml` genererer SSH-nøkkelpar og distribuerer dem til alle VMs og CTs for passordfri tilgang.

```bash
ansible-playbook playbooks/distribute_ssh_keys.yml --ask-vault-pass

Administrasjon av SSL-sertifikater

For å administrere SSL-sertifikater med Let's Encrypt, bruk manage_ssl_certificates.yml playbooken:

ansible-playbook playbooks/manage_ssl_certificates.yml --ask-vault-pass

Sertifikatene vil automatisk fornyes hver 30. dag.

Feilsøking

  • Sørg for at Ansible har de nødvendige tillatelsene for å kjøre kommandoer på Proxmox-serveren.
  • Bruk -vvv med ansible-playbook for mer detaljert output ved feilsøking.

### Oppsummering

Denne oppdaterte Ansible-pakken gir en omfattende løsning for automatisk inventarinnsamling, SSH-nøkkeladministrasjon, og SSL-sertifikathåndtering. Ved å bruke `cron` og `certbot` sikrer du at sertifikater holdes oppdatert og at tilgang til VMs og CTs er sikret uten brukernavn/passord. Dette gir en fullstendig automatisert og sikker drift av Proxmox IoT-laben din.