{"id":274,"date":"2021-04-16T20:10:57","date_gmt":"2021-04-16T18:10:57","guid":{"rendered":"https:\/\/jochem.jochemenbianca.nl\/?p=274"},"modified":"2021-04-26T10:39:50","modified_gmt":"2021-04-26T08:39:50","slug":"virtuele-machines-deployen-op-proxmox-met-terraform-en-ansible","status":"publish","type":"post","link":"https:\/\/jochem.jochemenbianca.nl\/?p=274","title":{"rendered":"Virtuele machines deployen op ProxMox met Terraform en Ansible"},"content":{"rendered":"<p>Nadat ik afgelopen weekend de cursus &#8220;Deploying Resources to GCP with Terraform&#8221; te hebben voltooid, was het wel eens tijd om te kijken of dat ook werkt op mijn eigen proxmox testomgeving. Hoe kun je servers deployen via Terraform op ProxMox ? Hierbij de stappen die ik gezet heb.<\/p>\n<p><strong>CloudInit<\/strong><\/p>\n<p>Als eerste hebben we nodig een ProxMox server. Maar dat heb je al als het goed is.<br \/>\nVervolgens hebben we een CloudInit image nodig. deze zorgt ervoor dat na de installatie er al een aantal dingen worden ingesteld zoals DNS, username en bijv. de ssh keys.<br \/>\nAls eerste maken we even een public key aan welke we kunnen gebruiken.<\/p>\n<pre>ssh-keygen -f cloudinit<\/pre>\n<p>We gaan er vanuit dat we een Ubuntu 20.04 LTS server willen gaan installeren. We voeren daarvoor de volgende commando&#8217;s uit op de proxmox server:<\/p>\n<pre>wget http:\/\/cloud-images.ubuntu.com\/focal\/current\/focal-server-cloudimg-amd64.img\r\nexport VM_ID=\"5000\" # Gebruik een hoog ID zodat we niet in conflict komen met VM ID's die we gaan uitrollen\r\nqm create $VM_ID --memory 2048 --net0 virtio,bridge=vmbr0 --sockets 1 --cores 2 --vcpu 2 -hotplug network,disk,cpu,memory --agent 1 --name cloud-init-ubuntu20 --ostype l26\r\nqm importdisk $VM_ID focal-server-cloudimg-amd64.img local-lvm # Waarbij local-lvm een storage locatie is\r\nqm set $VM_ID --scsihw virtio-scsi-pci --virtio0 local-lvm:vm-$VM_ID-disk-0 # Waarbij local-lvm wederom de storage locatie is\r\nqm set $VM_ID --ide2 local-lvm:cloudinit # Wederom local-lvm is de storage locatie\r\nqm set $VM_ID --boot c --bootdisk virtio0\r\nqm set $VM_ID --serial0 socket\r\nqm template $VM_ID\r\nrm focal-server-cloudimg-amd64.img<\/pre>\n<p>Als je nu naar de web interface van proxmox gaat zie je dat er een template aangemaakt is met nummer $VM_ID (5000) in ons geval.<br \/>\nKlik op deze template en klik daarna op Cloud-Init<br \/>\nHierin kun je een aantal dingen instellen welke meegenomen worden bij het installeren van de server.<br \/>\nJe kunt bijv. de username opgeven. Als je daarbij ook de ssh public key opgeeft kun je connecten met de server nadat deze klaar is.<br \/>\nDeze installingen kunnen eventueel ook nog in Terraform geregeld worden.<br \/>\nNu hebben we de cloudinit geregeld en kunnen we verder met het Terraform gedeelte.<\/p>\n<p><strong>Terraform<\/strong><\/p>\n<p>We installeren terraform op een device. Voor Ubuntu zetten we de volgende stappen<\/p>\n<pre>curl -fsSL https:\/\/apt.releases.hashicorp.com\/gpg | sudo apt-key add -\r\nsudo apt-add-repository \"deb [arch=amd64] https:\/\/apt.releases.hashicorp.com $(lsb_release -cs) main\"\r\nsudo apt-get update &amp;&amp; sudo apt-get install terraform\r\n<\/pre>\n<p>Voor CentOS\/RHEL\/AlmaLinux gebruiken we deze stappen<\/p>\n<pre>sudo yum install yum-utils\r\nsudo yum-config-manager --add-repo https:\/\/rpm.releases.hashicorp.com\/RHEL\/hashicorp.repo\r\nsudo yum -y install terraform\r\n<\/pre>\n<p>We maken een directory aan waarbij we alle terraform dingetjes gaan doen<\/p>\n<pre>mkdir terraform\r\ncd terraform<\/pre>\n<p>Om proxmox te kunnen gebruiken met Terraform hebben we de provider plugin nodig. Hiervoor maken we een bestand aan genaamd version.tf<\/p>\n<pre>vim version.tf<\/pre>\n<p>hierin kopieren we de volgende tekst<\/p>\n<pre>terraform {\r\nrequired_providers {\r\nproxmox = {\r\nsource = \"Telmate\/proxmox\"\r\nversion = \"2.6.8\"\r\n}\r\n}\r\nrequired_version = \"&gt;= 0.14\"\r\n}\r\n<\/pre>\n<p>Hiermee zorgen we dat terraform de Telmate proxmox plugin installeert.<\/p>\n<p>vervolgens maken we een bestand aan var.tf<\/p>\n<pre>vim var.tf<\/pre>\n<p>en daarin plaatsen we de volgende tekst<\/p>\n<pre>variable \"proxmox_host\" {\r\ntype = map\r\ndefault = {\r\npm_api_url = \"https:\/\/pve_host:8006\/api2\/json\"\r\npm_user = \"root@pam\"\r\ntarget_node = \"pve1\"\r\n}\r\n}\r\n\r\nvariable \"vmid\" {\r\ndefault = 400\r\ndescription = \"Starting ID for the CTs\"\r\n}\r\n\r\nvariable \"hostnames\" {\r\ndescription = \"VMs to be created\"\r\ntype = list(string)\r\ndefault = [\"terra-test1\", \"terra-test2\"]\r\n}\r\n\r\nvariable \"rootfs_size\" {\r\ndefault = \"2G\"\r\n}\r\n\r\nvariable \"ips\" {\r\ndescription = \"IPs of the VMs, respective to the hostname order\"\r\ntype = list(string)\r\ndefault = [\"10.10.10.100\", \"10.10.10.101\"]\r\n}\r\n\r\nvariable \"ssh_keys\" {\r\ntype = map\r\ndefault = {\r\npub = \".\/terraform\/cloudinit.pub\"\r\npriv = \".\/terraform\/cloudinit\"\r\n}\r\n}\r\n\r\n#variable \"ssh_password\" {}\r\n\r\nvariable \"user\" {\r\ndefault = \"terrauser\"\r\n}<\/pre>\n<p>Hierin staan een aantal variabelen welke terraform en cloudinit kunnen gebruiken. Een aantal werkte er niet in mijn test, dus heb ik die in de main.tf geplaatst.<br \/>\nDat bestand gaan we nu aanmaken.<\/p>\n<pre>vim main.tf<\/pre>\n<p>En daarin zetten we de volgende configuratie<\/p>\n<pre>provider \"proxmox\" {\r\npm_api_url = \"https:\/\/pve_host:8006\/api2\/json\"\r\npm_user = \"root@pam\"\r\npm_password = \"secretpassword\"\r\npm_tls_insecure = true\r\n}\r\n\r\nresource \"proxmox_vm_qemu\" \"prox-vm\" {\r\ncount = length(var.hostnames)\r\nname = var.hostnames[count.index]\r\ntarget_node = var.proxmox_host[\"target_node\"]\r\nvmid = var.vmid + count.index\r\nfull_clone = true\r\nclone = \"cloud-init-focal\"\r\n\r\ncores = 2\r\nsockets = 1\r\nvcpus = 2\r\nmemory = 2048\r\nballoon = 2048\r\nboot = \"c\"\r\nbootdisk = \"virtio0\"\r\n\r\nscsihw = \"virtio-scsi-pci\"\r\n\r\nonboot = false\r\nagent = 1\r\ncpu = \"kvm64\"\r\nnuma = true\r\nhotplug = \"network,disk,cpu,memory\"\r\n\r\nnetwork {\r\nbridge = \"vmbr0\"\r\nmodel = \"virtio\"\r\n}\r\n\r\nipconfig0 = \"ip=${var.ips[count.index]}\/24,gw=${cidrhost(format(\"%s\/24\", var.ips[count.index]), 1)}\"\r\n\r\ndisk {\r\n#id = 0\r\ntype = \"virtio\"\r\nstorage = \"local-zfs\"\r\nsize = \"5G\"\r\n}\r\n\r\nos_type = \"cloud-init-ubuntu20\"\r\n\r\n#creates ssh connection to check when the CT is ready for ansible provisioning\r\nconnection {\r\nhost = var.ips[count.index]\r\nuser = var.user\r\nprivate_key = file(var.ssh_keys[\"priv\"])\r\nagent = false\r\ntimeout = \"3m\"\r\n}\r\n<\/pre>\n<p>Dit zijn vooral de instellingen voor het creeeren van de VM&#8217;s. Welke proxmox server je moet gebruiken, hoeveel geheugen, disc size, cpu, netwerk config.<br \/>\nDit staat allemaal in deze file.<\/p>\n<p>Wanneer alles ingesteld is gaan we terraform zijn werk laten doen.<\/p>\n<pre>terraform init\r\nterraform plan\r\nterraform apply<\/pre>\n<p>(of terraform apply -auto-approve om niet yes in te hoeven typen)<\/p>\n<p>Vervolgens gaat terraform 2 nieuwe VM&#8217;s aanmaken, terra-test1 en terra-test2.<br \/>\nWanneer het allemaal gelukt is kun je connecten via<\/p>\n<pre>ssh -i cloudinit terrauser@10.10.10.100 # -i is de variabele voor de key file\r\n<\/pre>\n<p>Als alles goed is gegaan kunnen we ook de net gecreeerde servers weer verwijderen.<br \/>\nDit doe je dmv het commando<\/p>\n<pre>terraform destroy<\/pre>\n<p>Alles is nu weer verwijdert.<\/p>\n<p><strong>Ansible<\/strong><\/p>\n<p>Om ook Anisble te gebruiken maken we de volgende aanpassingen in main.tf<\/p>\n<pre>provisioner \"remote-exec\" {\r\n# Leave this here so we know when to start with Ansible local-exec\r\ninline = [ \"echo 'Cool, we are ready for provisioning'\"]\r\n}\r\n\r\nprovisioner \"local-exec\" {\r\nworking_dir = \"..\/..\/ansible\/\"\r\ncommand = \"ansible-playbook -u ${var.user} --key-file ${var.ssh_keys[\"priv\"]} -i ${var.ips[count.index]}, provision.yaml\"\r\n}\r\n\r\nprovisioner \"local-exec\" {\r\nworking_dir = \"..\/..\/ansible\/\"\r\ncommand = \"ansible-playbook -u ${var.user} --key-file ${var.ssh_keys[\"priv\"]} -i ${var.ips[count.index]}, install-qemu-guest-agent.yaml\"\r\n}\r\n}\r\n<\/pre>\n<p>Dit ga ik nog nader specificeren<\/p>\n<p>Met dank aan <a href=\"https:\/\/vanmieghem.io\/\">https:\/\/vanmieghem.io\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nadat ik afgelopen weekend de cursus &#8220;Deploying Resources to GCP with Terraform&#8221; te hebben voltooid, was het wel eens tijd om te kijken of dat ook werkt op mijn eigen proxmox testomgeving. Hoe kun je servers deployen via Terraform op ProxMox ? Hierbij de stappen die ik gezet heb. CloudInit [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,3,10,9],"tags":[],"class_list":["post-274","post","type-post","status-publish","format-standard","hentry","category-ansible","category-open-source","category-proxmox","category-terraform"],"_links":{"self":[{"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/posts\/274","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=274"}],"version-history":[{"count":4,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/posts\/274\/revisions"}],"predecessor-version":[{"id":279,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/posts\/274\/revisions\/279"}],"wp:attachment":[{"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=274"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=274"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=274"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}