Cloud init es un paquete que se utiliza para inicializar una instancia en la nube. Ampliamente utilizado para personalizar máquinas virtuales Linux, donde ejecuta configuraciones personalizadas que desea para una VM en su primer inicio. Se puede utilizar para configurar usuarios, instalar paquetes, generar y configurar claves SSH.
Cloud-init es un recurso muy utilizado cuando hablamos de servidores virtuales proporcionados por los grandes “players” de clouds.
Es interesante para clouds y VMs porque su kernel personalizado no admite nada que una máquina virtual no necesite para funcionar. Es decir, no soportará tarjeta de sonido soundblaster =).
Fue creado por Canonical, que es la misma empresa que creó Ubuntu y que tiene una participación abrumadora de sistemas operativos en el mercado de la nube.
Google y AWS (entre otros) son ejemplos de empresas que utilizan cloud-init para que las máquinas virtuales estén disponibles para sus clientes.
Cuando usamos kubernetes o máquinas virtuales en Google, por ejemplo, es posible visualizar el cloud-init config utilizado por ellos, que entre nosotros, ¡es una tremenda de cloud-init config!
Como este artículo se está creando como una documentación simple del proceso, vayamos directamente al grano para que podamos validar mejor lo que hace este cloud-init.
Lo primero, lee la documentación oficial de Proxmox + cloud-init:
https://pve.proxmox.com/wiki/Cloud-Init_Support
En segundo lugar, lea al menos la introducción a la https://cloudinit.readthedocs.io/en/latest/
La documentación oficial de proxmox comienza con un tema: Preparación de plantillas Cloud-Init y esto confunde a la multitud.
Las imágenes de cloud-init están listas y podemos usarlas sin tener que preparar nada. Esto es solo para personas que necesitan crear sus cloud-init templates from scratch.
Elegí la imagen de ubuntu en honor a Canonical, que puso a disposición el proyecto, por lo que el crédito es para ellos: https://cloud-images.ubuntu.com/groovy/current/
Tenga en cuenta que tanto el formato “img” como la arquitectura “amd64” son compatibles con Proxmox. Ahora elija cualquier node de su clúster proxmox para hospedar el template y acceda a el a través de ssh:
# wget https://cloud-images.ubuntu.com/groovy/current/groovy-server-cloudimg-amd64.img
# qm create 9002 --memory 2048 --net0 virtio,bridge=vmbr1
Ahora vea en /etc/pve/storage.cfg en qué storage desea almacenar esta imagen. En este caso usaré el 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
Ya casi hemos terminado. Ahora tenemos que agregar e discos que es donde almacenaremos las configs personalizadas (en términos generales).
# 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
Arreglando el orden de boot:
# qm set 9002 --boot c --bootdisk scsi0
Algunas imágenes amd64 cloud-init se crean teniendo en cuenta la compatibilidad con openstack. Entonces tenemos que agregar serial0 para que comience. En caso de que tenga curiosidad, elimine serial0 e intente reiniciar, si no arranca, agréguelo nuevamente y todo funcionará:
# qm set 9002 --serial0 socket --vga serial0 update VM 9002: -serial0 socket -vga serial0
Copie su clave ssh pública en el servidor proxmox, para que podamos agregar esta clave al template del cloud-init:
[user_machine ~$] scp ~/.ssh/id_rsa.pub root@PROXMOX_NODE:/tmp
Volviendo al servidor proxmox:
# 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
Establezca el usuario que tendrá permiso sudo:
# qm set 9002 --ciuser gole
update VM 9002: -ciuser gole
Configure el tipo de máquina. Valioso consejo de Tomas 2w-consultoria.
# qm set 9002 --machine q35
update VM 9002: -machine q35
Finalmente, conviértelo en un template:
# qm template 9002
Finalmente, clone el template en una nueva máquina:
# qm clone 9002 139 --name VMNAME --full
Configure la ip que usará:
# qm set 139 --ipconfig0 ip=172..xxx.xxx.5/24,gw=172.xxx.xxx.1
Cambie el tamaño del disco a un tamaño que ocupará en esta máquina virtual:
# qm resize 139 scsi0 +45G
Image resized.
Encienda la VM:
# qm start 139
Espere a que se inicie y ejecute ssh desde la máquina que tenía la clave pública:
$ ssh -l gole 172.xxx.xxx.5
¡Bingo! ¡Dentro del servidor sin hacer ninguna instalación!
Puede configurar vlans, DNS y todo lo que su nueva VM necesita para funcionar. También puede personalizar cloud-init con cicustom. Echa un vistazo a la documentación oficial.
Cuando cloud-init sube por primera vez, instalará algunos paquetes, por lo que el primer arranque tarda un poco más en liberar apt.
¡Éxito!