preloader
  • Cloud-init no Proxmox Virtual Environment 6

blog-thumb

Cloud init é um pacote utilizado para inicializar uma instância de nuvem. Muito utilizado para personalizar máquinas virtuais Linux, onde executa configurações personalizadas que se deseja para a uma VM na sua primeira inicialização. Pode ser utilizado para a configuração de usuários, instalação de pacotes, geração e configuração de chaves SSH.

Quer criar VMs, setando o nome do servidor, IP, vlan, usuario, etc… sem nem se quer ter que Liga-las? cloud-init é para você!

Cloud-init é um recurso altamente utilizado quando falamos de servidores virtuais fornecido pelos grandes “players” das clouds.

Ele é interessante para clouds e VMs porque seu kernel personalizado não traz suporte a nada que uma VM não precisa para trabalhar. Ou seja, ele não vai trazer suporte a placa de som soundblaster =).

Foi criado pela Canonical que é a mesma empresa criadora do Ubuntu, e que tem uma gigante esmagadora parte dos Sistemas Operacionais no mercado de clouds.

Google e AWS (entre outros) são exemplos de empresas que utilizam cloud-init para disponibilizar as VMs para seus clientes.

Quando utilizamos kubernetes ou VMs na Google, por exemplo, é possível visualizar o cloud-init config utilizado por eles, que cá entre nós, é um tremendo de um cloud-init config!

cloud-init-google

Alguns exemplos de porque utilizar cloud-init no Proxmox?

  • Velocidade em criação de novas VMs
  • Controle dos IPs das VMs como se fossem um container LXC
  • Possibilidades de automatização
  • Compatibilidades com Ansible e outras ferramentas de automações

Como este artigo está sendo criado como uma simples documentação do processo, vamos direto ao assunto e assim podemos validar melhor o que esse tal cloud-init faz.

Deployando cloud-init em proxmox! Mãos a obra!

O primeiro, leia a documentação oficial Proxmox + cloud-init:

https://pve.proxmox.com/wiki/Cloud-Init_Support

O segundo, leia pelo menos a introdução do https://cloudinit.readthedocs.io/en/latest/

Atenção!! Atenção!!

A documentação oficial do proxmox parte com um tópico: Preparing Cloud-Init Templates e isso confunde a galera!

As imagens de cloud-init já estão prontas e podemos utilizar sem ter que preparar nada. Isso é somente para as pessoas que necessitam criar seu cloud-init templates from scratch.

Download da imagem

Eu escolhi a imagem do ubuntu em homenagem a Canonical que disponibilizou o projeto, logo o mérito é deles: https://cloud-images.ubuntu.com/groovy/current/

proxmox-cloud-init2

Perceba que tanto o formato “img” como a arquitetura “amd64” são compatíveis com Proxmox. Agora escolha algum node do seu cluster proxmox para hospedar o template e acesse ele por ssh:

# wget https://cloud-images.ubuntu.com/groovy/current/groovy-server-cloudimg-amd64.img
# qm create 9002 --memory 2048 --net0 virtio,bridge=vmbr1

Agora veja em /etc/pve/storage.cfg qual é a storage que você deseja guardar essa imagem. Neste caso vou utilizar a storage local:

# qm importdisk 9002 groovy-server-cloudimg-amd64.img local
Successfully imported disk as ‘unused0:local:9002/vm-9002-disk-0.raw’

# qm set 9002 --scsihw virtio-scsi-pci --scsi0 local:9002/vm-9002-disk-0.raw
update VM 9002: -scsi0 local:9002/vm-9002-disk-0.raw -scsihw virtio-scsi-pci

Estamos quase prontos. Temos que adicionar agora um 2 discos que é onde vamos armazenar as configs personalizadas (a grosso modo falando).

# qm set 9002 --ide2 local:cloudinit
update VM 9002: -ide2 local:cloudinit
Formatting ‘/var/lib/vz/images/9002/vm-9002-cloudinit.qcow2’, fmt=qcow2 cluster_size=65536 preallocation=metadata compression_type=zlib size=4194304 lazy_refcounts=off refcount_bits=16

Arrumando a ordem de boot:

# qm set 9002 --boot c --bootdisk scsi0

Algumas imagens de amd64 cloud-init são feitas pensadas em compatibilidades com openstack. Por isso temos que adicionar a serial0 para que ela inicie. Caso tenha curiosidade, remova a serial0 e tente o reinício, se não bootar adicione novamente e tudo vai funcionar:

# qm set 9002 --serial0 socket --vga serial0 update VM 9002: -serial0 socket -vga serial0

Copie a sua chave ssh publica para o servidor do proxmox, para que possamos adicionar esta chave no template do cloud-init:

[user_machine ~$] scp ~/.ssh/id_rsa.pub root@PROXMOX_NODE:/tmp

Voltando ao proxmox server:

# qm set 9002 --sshkey /tmp/id_rsa.pub
update VM 9002: -sshkeys ssh-rsa%20AAAAB3NzaC1yc2EAAAADAQABAAABgQC4LX1HAmPWW4qzmqUBsIvgbdlfDS5MKEVK5cpXRxmUErezgVfvodbGlqqnO0T61Dry3KRg1owq62wpH1z8d%2Bh6vZCsJKoyoklC55xlbJgGDSxEB0%2FbUMiwqWkFdjRwQ1V2HOYNJKttoBUFIQvG8V3XSDtw%2Fw3W0aNOAfnheZX10zMJ%2BCuisMkvGGCBRDwnxxi%2BJoeTGrx85yLYfdD6Ca6yba6KeTMcu5PoI1BH5%2Bvt2Ta90BGjyHpLUOZpoqV0AurTEJIO3n5J0z2OH9WhC77Kwz6mG3MSNueA1BcgRUVvaXvJB65ce2azSVcKbXNkTbeBFlc7FhocEAhXrycRR0L6xgo3acvoCBOx4EijtF0itjzqfvNhH9tN9oLj8Qxiz6ttGivzucfWBsc30pUDopWGaJ0syNFE0Wyvs03cDMHb%2F5Vmb8ixE%2BK2nDJe3OXyn%2Bp4GzkWNyVZjYxutg%2FLAFP6bwe6Oe1jSob4I0bA4xT7guHLp93zEqWHRjDFGhXewhk%3D%20USER%40MACHINE%0

Defina o usuário que vai ter permissão de sudo:

# qm set 9002 --ciuser gole
update VM 9002: -ciuser gole

Defina o tipo de máquina. Dica valiosa do Tomas 2w-consultoria.

# qm set 9002 --machine q35
update VM 9002: -machine q35

Por fim, transforme ela em um template:

# qm template 9002

Realizando um clone e utilizando a nova VM

Por fim clone o template para uma nova máquina:

# qm clone 9002 139 --name VMNAME --full

Configure o ip que ela vai utilizar:

# qm set 139 --ipconfig0 ip=172..xxx.xxx.5/24,gw=172.xxx.xxx.1

Redimensione o disco para um tamanho que vai ocupar nesta VM:

# qm resize 139 scsi0 +45G
Image resized.

Ligue a VM:

# qm start 139

Espere ela iniciar e execute o ssh desde a máquina que tinha a chave publica:

$ ssh -l gole 172.xxx.xxx.5

proxmox-cloud-init3

Bingo! Dentro do servidor sem fazer nenhuma instalação!

Você pode definir vlans, DNSs e tudo o que sua nova VM precisa para funcionar. Pode também personalizar o cloud-init com os cicustom. De uma olhada na documentação oficial.

Quando o cloud-init sobe pela primeira vez, ele vai instalar alguns pacotes, por isso o 1o boot é um pouco mais demorado para liberar o apt.

Sucesso!