From 78c37329b4eb1767724579d50bdeb27064e934fd Mon Sep 17 00:00:00 2001 From: Eric D Date: Mon, 25 Sep 2023 17:04:52 -0400 Subject: [PATCH 1/8] added TF code for Azure Automation runbook --- quickstart/101-vm-auto-shutdown/main.tf | 215 +++++++++++++++++++ quickstart/101-vm-auto-shutdown/outputs.tf | 64 ++++++ quickstart/101-vm-auto-shutdown/providers.tf | 3 + quickstart/101-vm-auto-shutdown/readme.md | 42 ++++ quickstart/101-vm-auto-shutdown/variables.tf | 93 ++++++++ 5 files changed, 417 insertions(+) create mode 100644 quickstart/101-vm-auto-shutdown/main.tf create mode 100644 quickstart/101-vm-auto-shutdown/outputs.tf create mode 100644 quickstart/101-vm-auto-shutdown/providers.tf create mode 100644 quickstart/101-vm-auto-shutdown/readme.md create mode 100644 quickstart/101-vm-auto-shutdown/variables.tf diff --git a/quickstart/101-vm-auto-shutdown/main.tf b/quickstart/101-vm-auto-shutdown/main.tf new file mode 100644 index 00000000..3d3e96c4 --- /dev/null +++ b/quickstart/101-vm-auto-shutdown/main.tf @@ -0,0 +1,215 @@ +# Resource Group +resource "azurerm_resource_group" "rg" { + location = var.resource_group_location + name = "${random_pet.prefix.id}-rg" +} + +# Virtual Network +resource "azurerm_virtual_network" "my_terraform_network" { + name = "${random_pet.prefix.id}-vnet" + address_space = ["10.0.0.0/16"] + location = azurerm_resource_group.rg.location + resource_group_name = azurerm_resource_group.rg.name +} + +# Subnet +resource "azurerm_subnet" "my_terraform_subnet" { + name = "${random_pet.prefix.id}-subnet" + resource_group_name = azurerm_resource_group.rg.name + virtual_network_name = azurerm_virtual_network.my_terraform_network.name + address_prefixes = ["10.0.1.0/24"] +} + +# Public IP +resource "azurerm_public_ip" "my_terraform_public_ip" { + name = "${random_pet.prefix.id}-public-ip" + location = azurerm_resource_group.rg.location + resource_group_name = azurerm_resource_group.rg.name + allocation_method = "Dynamic" +} + +# Network Security Group and rules +resource "azurerm_network_security_group" "my_terraform_nsg" { + name = "${random_pet.prefix.id}-nsg" + location = azurerm_resource_group.rg.location + resource_group_name = azurerm_resource_group.rg.name + + security_rule { + name = "RDP" + priority = 1000 + direction = "Inbound" + access = "Allow" + protocol = "*" + source_port_range = "*" + destination_port_range = "3389" + source_address_prefix = "*" + destination_address_prefix = "*" + } + + security_rule { + name = "web" + priority = 1001 + direction = "Inbound" + access = "Allow" + protocol = "Tcp" + source_port_range = "*" + destination_port_range = "80" + source_address_prefix = "*" + destination_address_prefix = "*" + } +} + +# Network Interface +resource "azurerm_network_interface" "my_terraform_nic" { + name = "${random_pet.prefix.id}-nic" + location = azurerm_resource_group.rg.location + resource_group_name = azurerm_resource_group.rg.name + + ip_configuration { + name = "my_nic_configuration" + subnet_id = azurerm_subnet.my_terraform_subnet.id + private_ip_address_allocation = "Dynamic" + public_ip_address_id = azurerm_public_ip.my_terraform_public_ip.id + } +} + +# Connect the security group to the network interface +resource "azurerm_network_interface_security_group_association" "example" { + network_interface_id = azurerm_network_interface.my_terraform_nic.id + network_security_group_id = azurerm_network_security_group.my_terraform_nsg.id +} + +# Storage account for boot diagnostics +resource "azurerm_storage_account" "my_storage_account" { + name = "diag${random_id.random_id.hex}" + location = azurerm_resource_group.rg.location + resource_group_name = azurerm_resource_group.rg.name + account_tier = "Standard" + account_replication_type = "LRS" +} + +# Virtual Machine +resource "azurerm_windows_virtual_machine" "main" { + name = "${var.prefix}-vm" + admin_username = "azureuser" + admin_password = random_password.password.result + location = azurerm_resource_group.rg.location + resource_group_name = azurerm_resource_group.rg.name + network_interface_ids = [azurerm_network_interface.my_terraform_nic.id] + size = "Standard_DS1_v2" + + os_disk { + name = "myOsDisk" + caching = "ReadWrite" + storage_account_type = "Premium_LRS" + } + + source_image_reference { + publisher = "MicrosoftWindowsServer" + offer = "WindowsServer" + sku = "2022-datacenter-azure-edition" + version = "latest" + } + + boot_diagnostics { + storage_account_uri = azurerm_storage_account.my_storage_account.primary_blob_endpoint + } +} + +# # Install IIS web server to the virtual machine +# resource "azurerm_virtual_machine_extension" "web_server_install" { +# name = "${random_pet.prefix.id}-wsi" +# virtual_machine_id = azurerm_windows_virtual_machine.main.id +# publisher = "Microsoft.Compute" +# type = "CustomScriptExtension" +# type_handler_version = "1.8" +# auto_upgrade_minor_version = true + +# settings = < Date: Mon, 25 Sep 2023 17:12:51 -0400 Subject: [PATCH 2/8] readme changes for variables --- quickstart/101-vm-auto-shutdown/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quickstart/101-vm-auto-shutdown/readme.md b/quickstart/101-vm-auto-shutdown/readme.md index 5ca3197a..06fed949 100644 --- a/quickstart/101-vm-auto-shutdown/readme.md +++ b/quickstart/101-vm-auto-shutdown/readme.md @@ -37,6 +37,6 @@ This repository contains Terraform code to create resources in Azure, including | `storage_account_replication_type` | Replication type for the storage account. | LRS | | `automation_account_sku_name` | SKU name for the Azure Automation Account. | Basic | | `runbook_type` | Type of the runbook. | PowerShell | -| `runbook_uri` | URI for the runbook content. | "https://example.com/script.ps1" | +| `runbook_uri` | URI for the runbook content. | https://raw.githubusercontent.com/azureautomation/runbooks/master/Utility/ASM/Set-AzureScheduleWithRunbook.ps1 | | `one_time_schedule_start_time` | Start time for the one-time runbook schedule. | "2023-09-23T00:00:00Z" | | `hourly_schedule_start_time` | Start time for the hourly runbook schedule. | "2023-09-23T01:00:00Z" | From f82db3eb77f246a4729dc22a1108d4134d2ceca0 Mon Sep 17 00:00:00 2001 From: Eric D Date: Tue, 26 Sep 2023 09:56:46 -0400 Subject: [PATCH 3/8] removed commented code --- quickstart/101-vm-auto-shutdown/main.tf | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/quickstart/101-vm-auto-shutdown/main.tf b/quickstart/101-vm-auto-shutdown/main.tf index 3d3e96c4..249814bf 100644 --- a/quickstart/101-vm-auto-shutdown/main.tf +++ b/quickstart/101-vm-auto-shutdown/main.tf @@ -116,21 +116,6 @@ resource "azurerm_windows_virtual_machine" "main" { } } -# # Install IIS web server to the virtual machine -# resource "azurerm_virtual_machine_extension" "web_server_install" { -# name = "${random_pet.prefix.id}-wsi" -# virtual_machine_id = azurerm_windows_virtual_machine.main.id -# publisher = "Microsoft.Compute" -# type = "CustomScriptExtension" -# type_handler_version = "1.8" -# auto_upgrade_minor_version = true - -# settings = < Date: Tue, 26 Sep 2023 10:00:13 -0400 Subject: [PATCH 4/8] updated providers.tf --- quickstart/101-vm-auto-shutdown/providers.tf | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/quickstart/101-vm-auto-shutdown/providers.tf b/quickstart/101-vm-auto-shutdown/providers.tf index ab91b248..cbe3e719 100644 --- a/quickstart/101-vm-auto-shutdown/providers.tf +++ b/quickstart/101-vm-auto-shutdown/providers.tf @@ -1,3 +1,14 @@ +terraform { + required_version = ">=1.0" + + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "~>3.0" + } + } +} + provider "azurerm" { features {} } From f46699d1f220ccf21bb974cb7faecb545fd08206 Mon Sep 17 00:00:00 2001 From: Eric D Date: Tue, 26 Sep 2023 10:16:31 -0400 Subject: [PATCH 5/8] updated variables.tf with formatting and validation blocks where needed --- quickstart/101-vm-auto-shutdown/variables.tf | 50 ++++++++++++++------ 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/quickstart/101-vm-auto-shutdown/variables.tf b/quickstart/101-vm-auto-shutdown/variables.tf index 368195ad..93015e07 100644 --- a/quickstart/101-vm-auto-shutdown/variables.tf +++ b/quickstart/101-vm-auto-shutdown/variables.tf @@ -1,41 +1,48 @@ variable "resource_group_location" { - description = "The location where the resource group should be created." type = string default = "East US" + description = "The location where the resource group should be created." } variable "prefix" { - description = "A prefix for naming resources." type = string default = "demo" + description = "A prefix for naming resources." } variable "vnet_address_space" { - description = "Address space for the virtual network." type = list(string) default = ["10.0.0.0/16"] + description = "Address space for the virtual network." } variable "subnet_address_prefixes" { - description = "Address prefixes for the subnet." type = list(string) default = ["10.0.1.0/24"] + description = "Address prefixes for the subnet." } variable "public_ip_allocation_method" { - description = "Allocation method for the public IP." type = string default = "Dynamic" + description = "Allocation method for the public IP." + validation { + condition = contains(["Static", "Dynamic"], var.public_ip_allocation_method) + error_message = "The public IP allocation method must be either 'Static' or 'Dynamic'." + } } variable "vm_size" { - description = "Size of the virtual machine." type = string default = "Standard_DS1_v2" + description = "Size of the virtual machine." + validation { + condition = contains(["Standard_DS1_v2", "Standard_DS2_v2", "Standard_DS3_v2", "Standard_DS4_v2", "Standard_DS5_v2"], var.vm_size) + error_message = "The VM size must be one of the following: Standard_DS1_v2, Standard_DS2_v2, Standard_DS3_v2, Standard_DS4_v2, Standard_DS5_v2." + } } variable "vm_image" { - description = "Source image reference for the virtual machine." type = object({ publisher = string offer = string @@ -48,46 +55,59 @@ variable "vm_image" { sku = "2022-datacenter-azure-edition" version = "latest" } + description = "Source image reference for the virtual machine." } variable "storage_account_tier" { - description = "Performance tier of the storage account." type = string default = "Standard" + description = "Performance tier of the storage account." + validation { + condition = contains(["Standard", "Premium", "Standard_GRS", "Standard_RAGRS", "Premium_LRS", "Premium_ZRS"], var.storage_account_tier) + error_message = "The storage account tier must be one of the following: Standard, Premium, Standard_GRS, Standard_RAGRS, Premium_LRS, Premium_ZRS." + } } variable "storage_account_replication_type" { - description = "Replication type for the storage account." type = string default = "LRS" + description = "Replication type for the storage account." + validation { + condition = contains(["LRS", "GRS", "RAGRS", "ZRS"], var.storage_account_replication_type) + error_message = "The storage account replication type must be one of the following: LRS, GRS, RAGRS, ZRS." + } } variable "automation_account_sku_name" { - description = "SKU name for the Azure Automation Account." type = string default = "Basic" + description = "SKU name for the Azure Automation Account." + validation { + condition = contains(["Free", "Basic", "Standard"], var.automation_account_sku_name) + error_message = "The automation account SKU name must be one of the following: Free, Basic, Standard." + } } variable "runbook_type" { - description = "Type of the runbook." type = string default = "PowerShell" + description = "Type of the runbook." } variable "runbook_uri" { - description = "URI for the runbook content." type = string default = "https://example.com/script.ps1" + description = "URI for the runbook content." } variable "one_time_schedule_start_time" { - description = "Start time for the one-time runbook schedule." type = string default = "2023-09-23T00:00:00Z" + description = "Start time for the one-time runbook schedule." } variable "hourly_schedule_start_time" { - description = "Start time for the hourly runbook schedule." type = string default = "2023-09-23T01:00:00Z" -} + description = "Start time for the hourly runbook schedule." +} \ No newline at end of file From 51abcf64bfc1b3480c18885ac0ba87fd998a2bd4 Mon Sep 17 00:00:00 2001 From: Eric D Date: Tue, 26 Sep 2023 10:28:13 -0400 Subject: [PATCH 6/8] readme updates for variables markdown table --- quickstart/101-vm-auto-shutdown/readme.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/quickstart/101-vm-auto-shutdown/readme.md b/quickstart/101-vm-auto-shutdown/readme.md index 06fed949..82c08f31 100644 --- a/quickstart/101-vm-auto-shutdown/readme.md +++ b/quickstart/101-vm-auto-shutdown/readme.md @@ -1,4 +1,4 @@ -# Terraform Azure VM Automation Example +# Azure VM Automation This repository contains Terraform code to create resources in Azure, including an Automation account, a PowerShell runbook, and schedules for the runbook. @@ -30,12 +30,12 @@ This repository contains Terraform code to create resources in Azure, including | `prefix` | A prefix for naming resources. | demo | | `vnet_address_space` | Address space for the virtual network. | ["10.0.0.0/16"] | | `subnet_address_prefixes` | Address prefixes for the subnet. | ["10.0.1.0/24"] | -| `public_ip_allocation_method` | Allocation method for the public IP. | Dynamic | -| `vm_size` | Size of the virtual machine. | Standard_DS1_v2 | +| `public_ip_allocation_method` | Allocation method for the public IP. | Dynamic (Must be either 'Static' or 'Dynamic'.) | +| `vm_size` | Size of the virtual machine. | Standard_DS1_v2 (Must be one of the following: Standard_DS1_v2, Standard_DS2_v2, Standard_DS3_v2, Standard_DS4_v2, Standard_DS5_v2.) | | `vm_image` | Source image reference for the virtual machine. | Windows Server 2022 | -| `storage_account_tier` | Performance tier of the storage account. | Standard | -| `storage_account_replication_type` | Replication type for the storage account. | LRS | -| `automation_account_sku_name` | SKU name for the Azure Automation Account. | Basic | +| `storage_account_tier` | Performance tier of the storage account. | Standard (Must be one of the following: Standard, Premium, Standard_GRS, Standard_RAGRS, Premium_LRS, Premium_ZRS.) | +| `storage_account_replication_type` | Replication type for the storage account. | LRS (Must be one of the following: LRS, GRS, RAGRS, ZRS.) | +| `automation_account_sku_name` | SKU name for the Azure Automation Account. | Basic (Must be one of the following: Free, Basic, Standard.) | | `runbook_type` | Type of the runbook. | PowerShell | | `runbook_uri` | URI for the runbook content. | https://raw.githubusercontent.com/azureautomation/runbooks/master/Utility/ASM/Set-AzureScheduleWithRunbook.ps1 | | `one_time_schedule_start_time` | Start time for the one-time runbook schedule. | "2023-09-23T00:00:00Z" | From acabdbdb34c96a8eabb228a2126d285d4f8da3e6 Mon Sep 17 00:00:00 2001 From: Eric D Date: Tue, 26 Sep 2023 10:33:39 -0400 Subject: [PATCH 7/8] formatting updates for variables markdown table --- quickstart/101-vm-auto-shutdown/readme.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/quickstart/101-vm-auto-shutdown/readme.md b/quickstart/101-vm-auto-shutdown/readme.md index 82c08f31..1938178c 100644 --- a/quickstart/101-vm-auto-shutdown/readme.md +++ b/quickstart/101-vm-auto-shutdown/readme.md @@ -24,18 +24,18 @@ This repository contains Terraform code to create resources in Azure, including ## Variables -| Name | Description | Default | +| Name | Description | Default value | |-|-|-| | `resource_group_location` | The location where the resource group should be created. | East US | | `prefix` | A prefix for naming resources. | demo | | `vnet_address_space` | Address space for the virtual network. | ["10.0.0.0/16"] | | `subnet_address_prefixes` | Address prefixes for the subnet. | ["10.0.1.0/24"] | | `public_ip_allocation_method` | Allocation method for the public IP. | Dynamic (Must be either 'Static' or 'Dynamic'.) | -| `vm_size` | Size of the virtual machine. | Standard_DS1_v2 (Must be one of the following: Standard_DS1_v2, Standard_DS2_v2, Standard_DS3_v2, Standard_DS4_v2, Standard_DS5_v2.) | +| `vm_size` | Size of the virtual machine. | Standard_DS1_v2. Possible values include: Standard_DS1_v2, Standard_DS2_v2, Standard_DS3_v2, Standard_DS4_v2, Standard_DS5_v2. | | `vm_image` | Source image reference for the virtual machine. | Windows Server 2022 | -| `storage_account_tier` | Performance tier of the storage account. | Standard (Must be one of the following: Standard, Premium, Standard_GRS, Standard_RAGRS, Premium_LRS, Premium_ZRS.) | -| `storage_account_replication_type` | Replication type for the storage account. | LRS (Must be one of the following: LRS, GRS, RAGRS, ZRS.) | -| `automation_account_sku_name` | SKU name for the Azure Automation Account. | Basic (Must be one of the following: Free, Basic, Standard.) | +| `storage_account_tier` | Performance tier of the storage account. | Standard. Possible values include: Standard, Premium, Standard_GRS, Standard_RAGRS, Premium_LRS, Premium_ZRS. | +| `storage_account_replication_type` | Replication type for the storage account. | LRS. Possible values include: LRS, GRS, RAGRS, ZRS. | +| `automation_account_sku_name` | SKU name for the Azure Automation Account. | Basic. Possible values include: Free, Basic, Standard. | | `runbook_type` | Type of the runbook. | PowerShell | | `runbook_uri` | URI for the runbook content. | https://raw.githubusercontent.com/azureautomation/runbooks/master/Utility/ASM/Set-AzureScheduleWithRunbook.ps1 | | `one_time_schedule_start_time` | Start time for the one-time runbook schedule. | "2023-09-23T00:00:00Z" | From e13fcdbffaaae9092854ae80a9088659d05a6e73 Mon Sep 17 00:00:00 2001 From: Eric D Date: Tue, 26 Sep 2023 10:57:49 -0400 Subject: [PATCH 8/8] modified outputs.tf based on feedback --- quickstart/101-vm-auto-shutdown/outputs.tf | 27 +--------------------- 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/quickstart/101-vm-auto-shutdown/outputs.tf b/quickstart/101-vm-auto-shutdown/outputs.tf index c88ee984..3a7daff5 100644 --- a/quickstart/101-vm-auto-shutdown/outputs.tf +++ b/quickstart/101-vm-auto-shutdown/outputs.tf @@ -3,36 +3,11 @@ output "resource_group_name" { value = azurerm_resource_group.rg.name } -output "virtual_network_name" { - description = "The name of the created virtual network." - value = azurerm_virtual_network.my_terraform_network.name -} - -output "subnet_name" { - description = "The name of the created subnet." - value = azurerm_subnet.my_terraform_subnet.name -} - -output "public_ip_name" { - description = "The name of the created public IP." - value = azurerm_public_ip.my_terraform_public_ip.name -} - output "public_ip_address" { description = "The address of the created public IP." value = azurerm_public_ip.my_terraform_public_ip.ip_address } -output "network_security_group_name" { - description = "The name of the created network security group." - value = azurerm_network_security_group.my_terraform_nsg.name -} - -output "network_interface_name" { - description = "The name of the created network interface." - value = azurerm_network_interface.my_terraform_nic.name -} - output "storage_account_name" { description = "The name of the created storage account." value = azurerm_storage_account.my_storage_account.name @@ -61,4 +36,4 @@ output "one_time_schedule_name" { output "hourly_schedule_name" { description = "The name of the created hourly schedule for the runbook." value = azurerm_automation_schedule.hourly.name -} +} \ No newline at end of file