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.
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!
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.
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/
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.
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/
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
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
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!