{"id":295,"date":"2022-11-25T17:11:35","date_gmt":"2022-11-25T15:11:35","guid":{"rendered":"https:\/\/jochem.jochemenbianca.nl\/?p=295"},"modified":"2022-11-25T17:11:35","modified_gmt":"2022-11-25T15:11:35","slug":"azure-vms-uitrollen-met-terraform","status":"publish","type":"post","link":"https:\/\/jochem.jochemenbianca.nl\/?p=295","title":{"rendered":"Azure VM&#8217;s uitrollen met Terraform"},"content":{"rendered":"<p>Het is alweer te lang geleden dat ik iets gepost heb. In die tijd regelmatig bezig geweest met het uitrollen van VM&#8217;s met behulp van Terraform. Dit o.a. op hypervisors als VMWare en Proxmox. Aangezien er een steeds verdere migratie bezig is van On-Premise naar cloud, ben ik ook maar in de magische wereld van Azure gedoken.<br \/>\nDe volgende stap is dus het uitrollen van VM&#8217;s in Azure.<\/p>\n<p>Waar je bij de on-prem omgevingen meestal gewoon een resource aanmaakt met disk, netwerk en compute zijn dat bij Azure allemaal losse resources. Om een uitrol te doen moet je dus het volgende plaatje in de gaten houden.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-299\" src=\"https:\/\/jochem-test.jochemenbianca.nl\/wp-content\/uploads\/2022\/11\/terraform-Azure-roll-out.png\" alt=\"\" width=\"572\" height=\"795\" srcset=\"https:\/\/jochem.jochemenbianca.nl\/wp-content\/uploads\/2022\/11\/terraform-Azure-roll-out.png 572w, https:\/\/jochem.jochemenbianca.nl\/wp-content\/uploads\/2022\/11\/terraform-Azure-roll-out-216x300.png 216w\" sizes=\"auto, (max-width: 572px) 100vw, 572px\" \/><\/p>\n<p>Kortom, de resources die we nodig hebben zijn:<\/p>\n<ul>\n<li>Virtueel netwerk<\/li>\n<li>Subnet<\/li>\n<li>Netwerk interface<\/li>\n<li>Publiek IP adres<\/li>\n<li>De virtuele machine zelf, met daarin een os disk. Deze wordt aangemaakt bij het aanmaken van de VM.<\/li>\n<\/ul>\n<p>Verder hebben we ook een image nodig, welke niet een aparte resource is en natuurlijk de terraform azurerm provider. Om gebruik te kunnen maken van de Azure omgeving moeten we in Azure een subscription hebben en een resource group. Eventueel kun je de resource group ook met behulp van Terraform maken, mara in dit voorbeeld is die er al. Om 1 en ander wat flexibeler te maken gebruik ik altijd een var.tf file om wat variabelen te defini\u00ebren.<\/p>\n<p>De inhoud van deze var.tf file is als volgt:<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>variable \"subscription_id\" {\r\ndefault = \"4xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"\r\ndescription = \"Azure Subscription ID\"\r\n}\r\n\r\nvariable \"resourcegroupname\" {\r\ndefault = \"myresourcegroup\"\r\ndescription = \"Location\"\r\n}\r\n\r\nvariable \"location\" {\r\ndefault = \"South Central US\"\r\ndescription = \"Location\"\r\n}\r\n\r\nvariable \"vmsize\" {\r\ndefault = \"standard_d2s_v3\"\r\ndescription = \"Size of vm\"\r\n}\r\n\r\nvariable \"offer\" {\r\ndefault = \"0001-com-ubuntu-server-focal\"\r\ndescription = \"Offer For Ubuntu =&lt; 18.04 default should be UbuntuServer\"\r\n}\r\n\r\nvariable \"sku\" {\r\ndefault = \"20_04-lts\"\r\ndescription = \"SKU\"\r\n}\r\n\r\nvariable \"admin_username\" {\r\ndefault = \"ubuntu\"\r\ndescription = \"Username\"\r\n}\r\n\r\nvariable \"admin_password\" {\r\ndefault = \"Super-Secret2022\"\r\ndescription = \"Password\"\r\n}\r\n\r\nvariable \"hostname\" {\r\ndefault = \"ubuntu-svr1\"\r\ndescription = \"Hostname\"\r\n}<\/code><\/pre>\n<p>De variabelen kun je naar wens aanpassen.<br \/>\nVervolgens hebben we ook nog een main.tf. De inhoud daarvan is als volgt:<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>\r\n#\r\n# first run: az login\r\n#\r\n\r\nterraform {\r\n  required_providers {\r\n    azurerm = {\r\n      source = \"hashicorp\/azurerm\"\r\n      version = \"3.32.0\"\r\n    }\r\n  }\r\n}\r\n\r\nprovider \"azurerm\" {\r\n  features {}\r\n  skip_provider_registration = true\r\n  subscription_id = var.subscription_id\r\n}\r\n\r\n## Create a resource group\r\n#resource \"azurerm_resource_group\" \"example\" {\r\n#  name     = var.resourcegroupname\r\n#  location = var.location\r\n#}\r\n\r\n# Create a virtual network within the resource group\r\nvariable \"prefix\" {\r\n  default = \"myazurespace\"\r\n}\r\n\r\ndata \"azurerm_resource_group\" \"example\" {\r\n  name     = var.resourcegroupname\r\n}\r\n\r\nresource \"azurerm_virtual_network\" \"main\" {\r\n  name                = \"${var.prefix}-network1\"\r\n  address_space       = [\"10.0.0.0\/16\"]\r\n  location            = data.azurerm_resource_group.example.location\r\n  resource_group_name = data.azurerm_resource_group.example.name\r\n}\r\n\r\nresource \"azurerm_subnet\" \"internal\" {\r\n  name                 = \"internal\"\r\n  resource_group_name  = data.azurerm_resource_group.example.name\r\n  virtual_network_name = azurerm_virtual_network.main.name\r\n  address_prefixes     = [\"10.0.2.0\/24\"]\r\n}\r\n\r\nresource \"azurerm_network_interface\" \"main\" {\r\n  name                = \"${var.prefix}-nic1\"\r\n  location            = data.azurerm_resource_group.example.location\r\n  resource_group_name = data.azurerm_resource_group.example.name\r\n\r\n  ip_configuration {\r\n    name                          = \"testconfiguration1\"\r\n    subnet_id                     = azurerm_subnet.internal.id\r\n    private_ip_address_allocation = \"Dynamic\"\r\n    public_ip_address_id          = azurerm_public_ip.example.id\r\n  }\r\n}\r\nresource \"azurerm_public_ip\" \"example\" {\r\n  name                = \"${var.prefix}-pip1\"\r\n  resource_group_name = data.azurerm_resource_group.example.name\r\n  location            = data.azurerm_resource_group.example.location\r\n  allocation_method   = \"Static\"\r\n\r\n  tags = {\r\n    environment = \"Production\"\r\n  }\r\n}\r\n\r\nresource \"azurerm_virtual_machine\" \"main\" {\r\n  name                  = \"${var.prefix}-vm1\"\r\n  location              = data.azurerm_resource_group.example.location\r\n  resource_group_name   = data.azurerm_resource_group.example.name\r\n  network_interface_ids = [azurerm_network_interface.main.id]\r\n  vm_size               = var.vmsize\r\n\r\n  # Uncomment this line to delete the OS disk automatically when deleting the VM\r\n  delete_os_disk_on_termination = true\r\n\r\n  # Uncomment this line to delete the data disks automatically when deleting the VM\r\n  delete_data_disks_on_termination = true\r\n\r\n  storage_image_reference {\r\n    publisher = \"Canonical\"\r\n    offer     = var.offer\r\n    sku       = var.sku\r\n    version   = \"latest\"\r\n  }\r\n  storage_os_disk {\r\n    name              = \"${var.prefix}-osdisk1\"\r\n    caching           = \"ReadWrite\"\r\n    create_option     = \"fromimage\"\r\n    managed_disk_type = \"Standard_LRS\"\r\n  }\r\n  os_profile {\r\n    computer_name  = var.hostname\r\n    admin_username = var.admin_username\r\n    admin_password = var.admin_password\r\n  }\r\n  os_profile_linux_config {\r\n    disable_password_authentication = false\r\n  }\r\n  tags = {\r\n    environment = \"staging\"\r\n  }\r\n}\r\n\r\noutput \"Public_IP_address\" {\r\n  value = \"${azurerm_public_ip.example.*.ip_address}\"\r\n}\r\noutput \"Username\" {\r\n  value = var.admin_username\r\n}\r\noutput \"Password\" {\r\n  value = var.admin_password\r\n}\r\n<\/code><\/pre>\n<p>Ook hier kun je de nodige aanpassingen maken of eventueel variabelen gebruiken welke je hebt toegevoegd in het var.tf bestand.<\/p>\n<p>Om dit hele spul nu uit te kunnen voeren installeren we eerst de azure omgeving op je Linux systeem. Hoe dat moet vind je op de website van Micro$oft:<br \/>\n<a href=\"https:\/\/learn.microsoft.com\/en-us\/cli\/azure\/install-azure-cli-linux?pivots=apt\">https:\/\/learn.microsoft.com\/en-us\/cli\/azure\/install-azure-cli-linux?pivots=apt<\/a><\/p>\n<p>Vervolgen typen we op de console:<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>az login<\/code><\/pre>\n<p>En volgen de instructies op je scherm.<br \/>\nAls je ingelogd bent kunnen we vervolgens de volgende terraform stappen doen:<\/p>\n<pre data-pm-slice=\"1 1 []\"><code>terraform init\r\nterraform plan\r\nterraform apply<\/code><\/pre>\n<p>Als alles goed gegaan is, is er nu een VM uitgerold en vind je op de console van je Linux systeem het ipadres, de inlognaam en het wachtwoord waarmee je kunt inloggen.<br \/>\nLet er op dat dit dus niet super veilig is. Beter is het om in te loggen met bijv. een certificaat, firewall regels in te stellen e.d.<br \/>\nDit gaan we misschien in een volgende post bekijken.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Het is alweer te lang geleden dat ik iets gepost heb. In die tijd regelmatig bezig geweest met het uitrollen van VM&#8217;s met behulp van Terraform. Dit o.a. op hypervisors als VMWare en Proxmox. Aangezien er een steeds verdere migratie bezig is van On-Premise naar cloud, ben ik ook maar [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,9],"tags":[],"class_list":["post-295","post","type-post","status-publish","format-standard","hentry","category-open-source","category-terraform"],"_links":{"self":[{"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/posts\/295","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=295"}],"version-history":[{"count":5,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/posts\/295\/revisions"}],"predecessor-version":[{"id":303,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=\/wp\/v2\/posts\/295\/revisions\/303"}],"wp:attachment":[{"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=295"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=295"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jochem.jochemenbianca.nl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=295"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}