Integração Proxmox com switches para controlar o estado das VM/LXC

Olá malta,

Para quem estiver interessado em controlar as VMs ou LXC containers do Proxmox apartir do Home Assistant fica aqui o meu exemplo.

Para começar deve seguir os passos da Integração Oficial do Proxmox no Home Assistant.
Resumidamente são estes os passos:

  1. Criar um novo role
  2. Criar um novo utilizador
  3. Atribuir o role ao novo utilizador

Na documentação oficial apenas é indicado o VM.Audit contudo esta permissão não permite o controlo das VMs/LXC.

Depois devem colocar configuração no vosso YAML:

proxmoxve:
  - host: !secret proxmox_ip
    username: !secret proxmox_user
    password: !secret proxmox_pass
    realm: pve
    verify_ssl: false # maioria dos casos
    nodes:
      - node: NODE_NAME
        vms:
          - VM_ID_1
          - VM_ID_2
        containers:
          - LXC_ID1

Esta integração permite obter o estado das VMs/LXC através de binary_sensor. Por exemplo:

binary_sensor.NODE_NAME_VM_NAME_running
ou
binary_sensor.hydrogen_zoneminder_running

Depois disto devem fazer download do seguinte shell script e coloca-lo, por exemplo, na pasta /config/shell_scripts.
Nota: caso usem outro directório mudem o caminho quando criarem o shell_command usando o código abaixo.
O script tem as seguintes entradas (por esta ordem):

  1. IP do Proxmox;
  2. Nome do Node, hydrogen no meu caso (não acreditei que fosse preciso um secret aqui);
  3. Utilizador criado;
  4. Palavra-chave;
  5. Comando a correr (start/stop)
  6. Tipo (vm/lxc);
  7. ID do LXC/VM.

Caso usem o template switch que apresento apenas precisam de adicionar os secrets e mudar os argumentos do service call.

Depois disto podem usar o código abaixo para criarem template switch para cada uma das VMs/LXC a controlar.

sensor:
  - platform: template
    sensors:
      proxmox_ip:
        value_template: !secret proxmox_ip
      proxmox_user:
        value_template: !secret proxmox_user
      proxmox_pass:
        value_template: !secret proxmox_pass
        
shell_command:
  proxmox_control_vm: bash /config/shell_scripts/proxmox_control_vm.bash {{ states("sensor.proxmox_ip") }} hydrogen {{ states("sensor.proxmox_user") }} {{ states("sensor.proxmox_pass") }} {{ command }} {{ type }} {{ vm }} 
  
switch:
  - platform: template
    switches:
      proxmox_zoneminder_vm:
        value_template: "{{ is_state('binary_sensor.hydrogen_zoneminder_running', 'on') }}"
        turn_on:
          service: shell_command.proxmox_control_vm
          data:
            type: lxc
            vm: 112
            command: start
        turn_off:
          service: shell_command.proxmox_control_vm
          data:
            type: lxc
            vm: 112
            command: stop
            
  - platform: template
    switches:
      proxmox_francium_vm:
        value_template: "{{ is_state('binary_sensor.hydrogen_francium_running', 'on') }}"
        turn_on:
          service: shell_command.proxmox_control_vm
          data:
            type: qemu
            vm: 300
            command: start
        turn_off:
          service: shell_command.proxmox_control_vm
          data:
            type: qemu
            vm: 300
            command: stop

Este código contém um exemplo para um LXC e para uma VM. Devem mudar o type: vm/lxc e um número da VM/LXC vm: 300.

Nota: Não acredito que a forma usada seja a mais eficiente para esconder os dados de autenticação. Caso não partilhem o vosso código podem inserir os dados diretamente no shell_command.

1 Like

@Joao_Carreira bom trabalho, contudo podes editar o post sendo mais explicito com algumas imagens na parte inicial onde dizes para criar um novo user e um novo role com VM.Audit? E já na imagem mais abaixo que puseste mostrar também onde chegaste até ai? Quem não esta familiarizado com proxmox é difícil chegar até aí.
Obrigado

Se for necessário desligar o Proxmox, numa emergência, por exemplo, a UPS estar a esgotar-se, deixo aqui a minha sugestão:

/config/configuration.yaml

shell_command:
  proxmox_shutdown_host_pve: !secret proxmox_shutdown_host_pve

/config/secrets.yaml

proxmox_shutdown_host_pve: bash /config/shell_scripts/proxmox_shutdown_host_pve.bash IP_PROXMOX USER_COM_SYS.POWERMGMT PASSWORD_DO_USER NOME_NODE

/config/shell_scripts/proxmox_shutdown_host_pve.bash

#!/bin/bash 

APINODE=$1
USER=$2
PASSWORD=$3
NODE=$4

curl --silent --insecure --data "username=${USER}@pve&password=${PASSWORD}" https://$APINODE:8006/api2/json/access/ticket | jq --raw-output '.data.ticket' | sed 's/^/PVEAuthCookie=/' > cookie
curl --silent --insecure --data "username=${USER}@pve&password=${PASSWORD}" https://$APINODE:8006/api2/json/access/ticket | jq --raw-output '.data.CSRFPreventionToken' | sed 's/^/CSRFPreventionToken:/' > csrftoken
curl --silent --insecure  --cookie "$(<cookie)" --header "$(<csrftoken)" -X POST https://$APINODE:8006/api2/extjs/nodes/$NODE/status --data 'command=shutdown'
rm cookie csrftoken

Abraço.

2 Likes

Bom trabalho.

As ups não conseguem enviar os dados para o proxmox e ele desligar se sozinhos?

Como se fosse um portátil?

Consegue-se o mesmo com o NUT. Mas, pelo sim, pelo não, é melhor ter a dobrar do que ter dados corrompidos.


Copyright © 2017-2020. Todos os direitos reservados
CPHA.pt - info@cpha.pt


FAQ | Termos de Serviço/Regras | Política de Privacidade