Desafio que surgiu durante umas das aulas de #terraform da #linuxtips
Deu um trabalhinho para fazer rodar no #virtualbox mas missão dada é missão cumprida, né!
Obs.: Como o virtualbox não é um dos providers oficialmente mantidos pela #hashicorp mas sim pela comunidade, esses passos devem sofrer constantes evoluções no decorrer do tempo.
O código completo e outros você pode encontrar no meu GitHub: https://github.com/carolinux07
Terraform_virtualbox_provider
Código que estou utilizando para provisionar máquinas CentOS e Debian no VirtualBox, através do Terraform.
É importante ressaltar que o VirtualBox não é um dos vários providers mantidos pela HashiCorp, por isso, utilizei um trabalho experimental desenvolvido pela comunidade.
Configuração do ambiente:
Obs.: Minha estação de trabalho é openSUSE.
zypper install go mkdir ~/.terraform.d/plugins cp go/bin/terraform-provider-virtualbox ~/.terraform.d/plugins
Iniciando um projeto:
mkdir virtualbox-example cd virtualbox-example touch main.tf && vi main.tf
Código para geração de 3 Vms (Ubuntu, CentOS e Debian):
https://github.com/carolinux07/terraform_virtualbox_provider/blob/master/main.tf
Execução dos comandos do terraform:
Obs.: Utilizei o recurso de Debug pois muitos erros foram ocorrendo e precisava entender em que camada estava o problema (terraform / plugin / vagrant / virtualbox / SO)
terraform init TF_LOG=DEBUG terraform plan -out plano TF_LOG=DEBUG terraform apply "plano"
Problemas encontrados:
Erro 1:
Tentei duas versões diferentes de Ubuntu e em todas o VM não sobe. Mesmo trocando a ordem dos discos no VirtualBox (esse foi o único dos 3 que gerou dois discos), não funciona. Se alguém descobri me fala. hehehe
Erro 2:
Ao realizar o comando terraform destroy, as máquinas virtuais são removidas mas as mídias virtuais não são, isso causará problemas em novas execuções do terraform apply.
Error: exit status 1 on main.tf line 1, in resource "virtualbox_vm" "ubuntu": 1: resource "virtualbox_vm" "ubuntu" {
Descobri essa através do Debug do terraform e verificando o arquivo virtiualbox.xml.
grep "HardDisk uuid" /home/carol/.config/VirtualBox/VirtualBox.xml <HardDisk uuid="{87990bd0-c225-4c86-89ef-73d6017b06ec}" location="/home/carol/.terraform/virtualbox/gold/centos/centos-7-1-1.x86_64.vmdk" format="VMDK" type="Normal"/> <HardDisk uuid="{2904da25-8b8b-46b2-af45-dfd75877d755}" location="/home/carol/.terraform/virtualbox/gold/ubuntu/ubuntu-bionic-18.04-cloudimg-configdrive.vmdk" format="VMDK" type="Normal"/> <HardDisk uuid="{dd863f3b-fbc3-467c-a8f9-4d57974e3435}" location="/home/carol/.terraform/virtualbox/gold/ubuntu/ubuntu-bionic-18.04-cloudimg.vmdk" format="VMDK" type="Normal"/> <HardDisk uuid="{ca5c746f-9b3f-4107-aef9-4fd17814da20}" location="/home/carol/.terraform/virtualbox/gold/debian/buster.vmdk" format="VMDK" type="Normal"/>
Para que esse tipo de erro não ocorra é preciso apagar os discos virtuais em: File > Virtual Media Manager… ou editar o xml citado removendo essas entradas de HardDisk.
Erro 3:
A cada novo erro e correção do código, o terraform apresentava o seguinte erro:
Error: machine already exists on main.tf line 1, in resource "virtualbox_vm" "ubuntu": 1: resource "virtualbox_vm" "ubuntu" {
Isso acontace porque uma das primeiras validações que ocorrem é a execução do VBoxManage list vms e VBoxManage showvminfo, como a última execução com erro chegou a gerar, pelo menos, a referência no VirtualBox será necessário apagar manualmente esse “lixinho”.
Erro 4:
Bem, esse não é exatamente um erro, mas é importante ter atenção as Boxes do Vangrant, nem todas possuem o VirtualBox como provider. E me tomou um tempo entender a lógica deles.
Para utilizar uma box, escolha o SO, o CentOS por exemplo:
Escolha uma versão que tenha o VirtualBox como provider, essa por exemplo tem 4 providers (virtualbox, vmware_desktop, libvirt, hyperv):
Para definir o provider utilize ao final da url “providers/virtualbox.box”, assim:
Materiais utilizados como guia de referência para configuração da minha estação de trabalho:
- https://gitter.im/terra-farm/terraform-provider-virtualbox?at=5d31a5c65ea6e644ece06abb
- https://github.com/terra-farm/terraform-provider-virtualbox
- https://terra-farm.github.io/main/installation.html
- https://blog.opennix.ru/posts/use-terraform-with-virtualbox/
- https://github.com/pyToshka/terraform-provider-virtualbox
IMPORTANTE: Mérito total a todos que desenvolveram esses materiais, apenas fui adequando as minhas necessidades e corrigindo o que não funcionava no meu ambiente, tendo em vista de que é um projeto que está em constante evolução e possui alguns bugs.