From 9f0d99091f030656a48bebcdfcb2565f9ae109cf Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Mon, 17 Apr 2017 19:07:53 -0500 Subject: [PATCH 01/77] initial commit - 101-vm-from-user-image --- examples/101-vm-from-user-image/.gitignore | 3 +++ examples/101-vm-from-user-image/README.md | 7 +++++++ examples/101-vm-from-user-image/main.tf | 0 examples/101-vm-from-user-image/variables.tf | 0 4 files changed, 10 insertions(+) create mode 100644 examples/101-vm-from-user-image/.gitignore create mode 100644 examples/101-vm-from-user-image/README.md create mode 100644 examples/101-vm-from-user-image/main.tf create mode 100644 examples/101-vm-from-user-image/variables.tf diff --git a/examples/101-vm-from-user-image/.gitignore b/examples/101-vm-from-user-image/.gitignore new file mode 100644 index 000000000000..352c8a2b9b6e --- /dev/null +++ b/examples/101-vm-from-user-image/.gitignore @@ -0,0 +1,3 @@ +terraform.tfstate* +terraform.tfvars* +creds.tf* diff --git a/examples/101-vm-from-user-image/README.md b/examples/101-vm-from-user-image/README.md new file mode 100644 index 000000000000..08f105832396 --- /dev/null +++ b/examples/101-vm-from-user-image/README.md @@ -0,0 +1,7 @@ +# Create a Virtual Machine from a User Image +**Prerequisite - The Storage Account with the User Image VHD should already exist** + +This template allows you to create a Virtual Machines from a User image. This template also deploys a Virtual Network, Public IP addresses and a Network Interface. + +Azure requires that an application is added to Azure Active Directory to generate the client_id, client_secret, and tenant_id needed by Terraform (subscription_id can be recovered from your Azure account details). Please go [here](https://www.terraform.io/docs/providers/azurerm/) for full instructions on how to create this. + diff --git a/examples/101-vm-from-user-image/main.tf b/examples/101-vm-from-user-image/main.tf new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/examples/101-vm-from-user-image/variables.tf b/examples/101-vm-from-user-image/variables.tf new file mode 100644 index 000000000000..e69de29bb2d1 From 6f577a8cad0be9293e47c2670391604db895fa10 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Wed, 19 Apr 2017 17:56:43 -0500 Subject: [PATCH 02/77] changed branch name --- examples/101-vm-from-user-image/.gitignore | 2 +- examples/101-vm-from-user-image/README.md | 2 + examples/101-vm-from-user-image/main.tf | 94 ++++++++++++++++++++ examples/101-vm-from-user-image/variables.tf | 90 +++++++++++++++++++ examples/101-vm-simple-linux/.gitignore | 2 +- 5 files changed, 188 insertions(+), 2 deletions(-) diff --git a/examples/101-vm-from-user-image/.gitignore b/examples/101-vm-from-user-image/.gitignore index 352c8a2b9b6e..a4f6eebd0a98 100644 --- a/examples/101-vm-from-user-image/.gitignore +++ b/examples/101-vm-from-user-image/.gitignore @@ -1,3 +1,3 @@ terraform.tfstate* terraform.tfvars* -creds.tf* +provider.tf* diff --git a/examples/101-vm-from-user-image/README.md b/examples/101-vm-from-user-image/README.md index 08f105832396..c1c5423e5103 100644 --- a/examples/101-vm-from-user-image/README.md +++ b/examples/101-vm-from-user-image/README.md @@ -5,3 +5,5 @@ This template allows you to create a Virtual Machines from a User image. This te Azure requires that an application is added to Azure Active Directory to generate the client_id, client_secret, and tenant_id needed by Terraform (subscription_id can be recovered from your Azure account details). Please go [here](https://www.terraform.io/docs/providers/azurerm/) for full instructions on how to create this. +`image_uri` - Specifies the `image_uri` in the form publisherName:offer:skus:version. `image_uri` can also specify the VHD uri of a custom VM image to clone. +`os_type` - When cloning a custom disk image the `os_type` documented below becomes required. Specifies the operating system Type, valid values are windows, linux. \ No newline at end of file diff --git a/examples/101-vm-from-user-image/main.tf b/examples/101-vm-from-user-image/main.tf index e69de29bb2d1..ce85956cb3e2 100644 --- a/examples/101-vm-from-user-image/main.tf +++ b/examples/101-vm-from-user-image/main.tf @@ -0,0 +1,94 @@ +resource "azurerm_resource_group" "rg" { + name = "${var.resource_group}" + location = "${var.location}" +} + +resource "azurerm_virtual_network" "vnet" { + name = "${var.virtual_network_name}" + location = "${var.location}" + address_space = ["${var.address_space}"] + resource_group_name = "${azurerm_resource_group.rg.name}" +} + +resource "azurerm_subnet" "subnet" { + name = "${var.rg_prefix}subnet" + virtual_network_name = "${azurerm_virtual_network.vnet.name}" + resource_group_name = "${azurerm_resource_group.rg.name}" + address_prefix = "${var.subnet_prefix}" +} + +resource "azurerm_network_interface" "nic" { + name = "${var.rg_prefix}nic" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + + ip_configuration { + name = "${var.rg_prefix}ipconfig" + subnet_id = "${azurerm_subnet.subnet.id}" + private_ip_address_allocation = "Dynamic" + public_ip_address_id = "${azurerm_public_ip.pip.id}" + } +} + +resource "azurerm_public_ip" "pip" { + name = "${var.rg_prefix}-ip" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + public_ip_address_allocation = "dynamic" + domain_name_label = "${var.dns_name}" +} + +resource "azurerm_storage_account" "stor" { + name = "${var.hostname}stor" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + account_type = "${var.storage_account_type}" +} + +resource "azurerm_storage_container" "storc" { + name = "${var.hostname}-vhds" + resource_group_name = "${azurerm_resource_group.rg.name}" + storage_account_name = "${azurerm_storage_account.stor.name}" + container_access_type = "private" +} + +resource "azurerm_virtual_machine" "vm" { + name = "${var.rg_prefix}vm" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + vm_size = "${var.vm_size}" + network_interface_ids = ["${azurerm_network_interface.nic.id}"] + + storage_image_reference { + publisher = "${var.image_publisher}" + offer = "${var.image_offer}" + sku = "${var.image_sku}" + version = "${var.image_version}" + } + + storage_os_disk { + name = "${var.hostname}-osdisk1" + image_uri = "${var.image_uri}" + caching = "ReadWrite" + create_option = "FromImage" + } + + os_profile { + computer_name = "${var.hostname}" + admin_username = "${var.admin_username}" + admin_password = "${var.admin_password}" + } + + boot_diagnostics { + enabled = "true" + storage_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}" + } +} + +output "hostname" { + value = "${var.hostname}" +} + +output "vm_fqdn" { + value = "${azurerm_public_ip.pip.fqdn}" +} \ No newline at end of file diff --git a/examples/101-vm-from-user-image/variables.tf b/examples/101-vm-from-user-image/variables.tf index e69de29bb2d1..f15b77ff0d89 100644 --- a/examples/101-vm-from-user-image/variables.tf +++ b/examples/101-vm-from-user-image/variables.tf @@ -0,0 +1,90 @@ +variable "resource_group" { + description = "The name of the resource group in which to create the virtual network." + default = "myresourcegroup" +} + +variable "image_uri" { + description = "Specifies the image_uri in the form publisherName:offer:skus:version. image_uri can also specify the VHD uri of a custom VM image to clone." + default = "" +} + +variable "os_type" { + description = "Specifies the operating system Type, valid values are windows, linux." + default = "linux" +} + +variable "rg_prefix" { + description = "The shortened abbreviation to represent your resource group that will go on the front of some resources." + default = "rg" +} + +variable "location" { + description = "The location/region where the virtual network is created. Changing this forces a new resource to be created." + default = "southcentralus" +} + +variable "virtual_network_name" { + description = "The name for the virtual network." + default = "vnet" +} + +# UNCERTAIN OF THIS VARIABLE +variable "address_space" { + description = "The address space that is used by the virtual network. You can supply more than one address space. Changing this forces a new resource to be created." + default = "10.0.0.0/16" +} + +# UNCERTAIN OF THIS VARIABLE +variable "subnet_prefix" { + description = "The address prefix to use for the subnet." + default = "10.1.0.0/24" +} + +variable "storage_account_type" { + description = "Specifies the name of the storage account. Changing this forces a new resource to be created. This must be unique across the entire Azure service, not just within the resource group." + default = "Premium_LRS" +} + +variable "vm_size" { + description = "Specifies the name of the virtual machine resource. Changing this forces a new resource to be created." + default = "Standard_DS1_v2" +} + +variable "image_publisher" { + description = "name of the publisher of the image (az vm image list)" + default = "Canonical" +} + +variable "image_offer" { + description = "the name of the offer (az vm image list)" + default = "UbuntuServer" +} + +variable "image_sku" { + description = "image sku to apply (az vm image list)" + default = "12.04.5-LTS" +} + +variable "image_version" { + description = "version of the image to apply (az vm image list)" + default = "latest" +} + +variable "hostname" { + description = "VM name referenced also in storage-related names." + default = "myvm" +} + +variable "dns_name" { + description = " Label for the Domain Name. Will be used to make up the FQDN. If a domain name label is specified, an A DNS record is created for the public IP in the Microsoft Azure DNS system." +} + +variable "admin_username" { + description = "administrator user name" + default = "vmadmin" +} + +variable "admin_password" { + description = "administrator password (recommended to disable password auth)" + default = "T3rr@f0rmP@ssword" +} diff --git a/examples/101-vm-simple-linux/.gitignore b/examples/101-vm-simple-linux/.gitignore index 352c8a2b9b6e..a4f6eebd0a98 100644 --- a/examples/101-vm-simple-linux/.gitignore +++ b/examples/101-vm-simple-linux/.gitignore @@ -1,3 +1,3 @@ terraform.tfstate* terraform.tfvars* -creds.tf* +provider.tf* From 611d70affe9f89df717c524fbd97d698e74a6cc7 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Fri, 21 Apr 2017 09:03:15 -0500 Subject: [PATCH 03/77] not deploying - storage problems --- examples/101-vm-from-user-image/variables.tf | 90 ------------------- .../.gitignore | 0 .../README.md | 5 +- examples/azure-vm-from-user-image/deploy.sh | 43 +++++++++ .../main.tf | 46 +++------- examples/azure-vm-from-user-image/outputs.tf | 11 +++ .../azure-vm-from-user-image/variables.tf | 54 +++++++++++ 7 files changed, 123 insertions(+), 126 deletions(-) delete mode 100644 examples/101-vm-from-user-image/variables.tf rename examples/{101-vm-from-user-image => azure-vm-from-user-image}/.gitignore (100%) rename examples/{101-vm-from-user-image => azure-vm-from-user-image}/README.md (75%) create mode 100644 examples/azure-vm-from-user-image/deploy.sh rename examples/{101-vm-from-user-image => azure-vm-from-user-image}/main.tf (61%) create mode 100644 examples/azure-vm-from-user-image/outputs.tf create mode 100644 examples/azure-vm-from-user-image/variables.tf diff --git a/examples/101-vm-from-user-image/variables.tf b/examples/101-vm-from-user-image/variables.tf deleted file mode 100644 index f15b77ff0d89..000000000000 --- a/examples/101-vm-from-user-image/variables.tf +++ /dev/null @@ -1,90 +0,0 @@ -variable "resource_group" { - description = "The name of the resource group in which to create the virtual network." - default = "myresourcegroup" -} - -variable "image_uri" { - description = "Specifies the image_uri in the form publisherName:offer:skus:version. image_uri can also specify the VHD uri of a custom VM image to clone." - default = "" -} - -variable "os_type" { - description = "Specifies the operating system Type, valid values are windows, linux." - default = "linux" -} - -variable "rg_prefix" { - description = "The shortened abbreviation to represent your resource group that will go on the front of some resources." - default = "rg" -} - -variable "location" { - description = "The location/region where the virtual network is created. Changing this forces a new resource to be created." - default = "southcentralus" -} - -variable "virtual_network_name" { - description = "The name for the virtual network." - default = "vnet" -} - -# UNCERTAIN OF THIS VARIABLE -variable "address_space" { - description = "The address space that is used by the virtual network. You can supply more than one address space. Changing this forces a new resource to be created." - default = "10.0.0.0/16" -} - -# UNCERTAIN OF THIS VARIABLE -variable "subnet_prefix" { - description = "The address prefix to use for the subnet." - default = "10.1.0.0/24" -} - -variable "storage_account_type" { - description = "Specifies the name of the storage account. Changing this forces a new resource to be created. This must be unique across the entire Azure service, not just within the resource group." - default = "Premium_LRS" -} - -variable "vm_size" { - description = "Specifies the name of the virtual machine resource. Changing this forces a new resource to be created." - default = "Standard_DS1_v2" -} - -variable "image_publisher" { - description = "name of the publisher of the image (az vm image list)" - default = "Canonical" -} - -variable "image_offer" { - description = "the name of the offer (az vm image list)" - default = "UbuntuServer" -} - -variable "image_sku" { - description = "image sku to apply (az vm image list)" - default = "12.04.5-LTS" -} - -variable "image_version" { - description = "version of the image to apply (az vm image list)" - default = "latest" -} - -variable "hostname" { - description = "VM name referenced also in storage-related names." - default = "myvm" -} - -variable "dns_name" { - description = " Label for the Domain Name. Will be used to make up the FQDN. If a domain name label is specified, an A DNS record is created for the public IP in the Microsoft Azure DNS system." -} - -variable "admin_username" { - description = "administrator user name" - default = "vmadmin" -} - -variable "admin_password" { - description = "administrator password (recommended to disable password auth)" - default = "T3rr@f0rmP@ssword" -} diff --git a/examples/101-vm-from-user-image/.gitignore b/examples/azure-vm-from-user-image/.gitignore similarity index 100% rename from examples/101-vm-from-user-image/.gitignore rename to examples/azure-vm-from-user-image/.gitignore diff --git a/examples/101-vm-from-user-image/README.md b/examples/azure-vm-from-user-image/README.md similarity index 75% rename from examples/101-vm-from-user-image/README.md rename to examples/azure-vm-from-user-image/README.md index c1c5423e5103..b115f2451032 100644 --- a/examples/101-vm-from-user-image/README.md +++ b/examples/azure-vm-from-user-image/README.md @@ -6,4 +6,7 @@ This template allows you to create a Virtual Machines from a User image. This te Azure requires that an application is added to Azure Active Directory to generate the client_id, client_secret, and tenant_id needed by Terraform (subscription_id can be recovered from your Azure account details). Please go [here](https://www.terraform.io/docs/providers/azurerm/) for full instructions on how to create this. `image_uri` - Specifies the `image_uri` in the form publisherName:offer:skus:version. `image_uri` can also specify the VHD uri of a custom VM image to clone. -`os_type` - When cloning a custom disk image the `os_type` documented below becomes required. Specifies the operating system Type, valid values are windows, linux. \ No newline at end of file +`os_type` - When cloning a custom disk image the `os_type` documented below becomes required. Specifies the operating system Type, valid values are windows, linux. + +**Storage Accounts can be imported using the resource id, e.g.** +`terraform import azurerm_storage_account.storageAcc1 /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myresourcegroup/providers/Microsoft.Storage/storageAccounts/myaccount` \ No newline at end of file diff --git a/examples/azure-vm-from-user-image/deploy.sh b/examples/azure-vm-from-user-image/deploy.sh new file mode 100644 index 000000000000..3160ca88ed43 --- /dev/null +++ b/examples/azure-vm-from-user-image/deploy.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +set -o errexit -o nounset + +# generate a unique string for CI deployment +KEY=$(cat /dev/urandom | tr -cd 'a-z' | head -c 12) +PASSWORD=KEY +PASSWORD+=$(cat /dev/urandom | tr -cd 'A-Z' | head -c 2) +PASSWORD+=$(cat /dev/urandom | tr -cd '0-9' | head -c 2) + +terraform get + +terraform plan \ + -var 'dns_name='$KEY \ + -var 'admin_password='$PASSWORD \ + -var 'admin_username='$KEY \ + -var 'resource_group='$KEY \ + -out=out.tfplan + +terraform apply out.tfplan + + +# TODO: determine external validation, possibly Azure CLI + +# echo "Setting git user name" +# git config user.name $GH_USER_NAME +# +# echo "Setting git user email" +# git config user.email $GH_USER_EMAIL +# +# echo "Adding git upstream remote" +# git remote add upstream "https://$GH_TOKEN@github.com/$GH_REPO.git" +# +# git checkout master + + +# +# NOW=$(TZ=America/Chicago date) +# +# git commit -m "tfstate: $NOW [ci skip]" +# +# echo "Pushing changes to upstream master" +# git push upstream master \ No newline at end of file diff --git a/examples/101-vm-from-user-image/main.tf b/examples/azure-vm-from-user-image/main.tf similarity index 61% rename from examples/101-vm-from-user-image/main.tf rename to examples/azure-vm-from-user-image/main.tf index ce85956cb3e2..44464b5cd55b 100644 --- a/examples/101-vm-from-user-image/main.tf +++ b/examples/azure-vm-from-user-image/main.tf @@ -4,26 +4,26 @@ resource "azurerm_resource_group" "rg" { } resource "azurerm_virtual_network" "vnet" { - name = "${var.virtual_network_name}" + name = "${var.hostname}vnet" location = "${var.location}" address_space = ["${var.address_space}"] resource_group_name = "${azurerm_resource_group.rg.name}" } resource "azurerm_subnet" "subnet" { - name = "${var.rg_prefix}subnet" + name = "${var.hostname}subnet" virtual_network_name = "${azurerm_virtual_network.vnet.name}" resource_group_name = "${azurerm_resource_group.rg.name}" address_prefix = "${var.subnet_prefix}" } resource "azurerm_network_interface" "nic" { - name = "${var.rg_prefix}nic" + name = "${var.hostname}nic" location = "${var.location}" resource_group_name = "${azurerm_resource_group.rg.name}" ip_configuration { - name = "${var.rg_prefix}ipconfig" + name = "${var.hostname}ipconfig" subnet_id = "${azurerm_subnet.subnet.id}" private_ip_address_allocation = "Dynamic" public_ip_address_id = "${azurerm_public_ip.pip.id}" @@ -31,44 +31,32 @@ resource "azurerm_network_interface" "nic" { } resource "azurerm_public_ip" "pip" { - name = "${var.rg_prefix}-ip" + name = "${var.hostname}-ip" location = "${var.location}" resource_group_name = "${azurerm_resource_group.rg.name}" public_ip_address_allocation = "dynamic" - domain_name_label = "${var.dns_name}" + domain_name_label = "${var.hostname}" } resource "azurerm_storage_account" "stor" { - name = "${var.hostname}stor" + name = "${var.storage_account_name}" location = "${var.location}" resource_group_name = "${azurerm_resource_group.rg.name}" account_type = "${var.storage_account_type}" } -resource "azurerm_storage_container" "storc" { - name = "${var.hostname}-vhds" - resource_group_name = "${azurerm_resource_group.rg.name}" - storage_account_name = "${azurerm_storage_account.stor.name}" - container_access_type = "private" -} - resource "azurerm_virtual_machine" "vm" { - name = "${var.rg_prefix}vm" + name = "${var.hostname}" location = "${var.location}" resource_group_name = "${azurerm_resource_group.rg.name}" vm_size = "${var.vm_size}" network_interface_ids = ["${azurerm_network_interface.nic.id}"] - storage_image_reference { - publisher = "${var.image_publisher}" - offer = "${var.image_offer}" - sku = "${var.image_sku}" - version = "${var.image_version}" - } - storage_os_disk { name = "${var.hostname}-osdisk1" - image_uri = "${var.image_uri}" + image_uri = "${var.image_uri}" + vhd_uri = "" + os_type = "${var.os_type}" caching = "ReadWrite" create_option = "FromImage" } @@ -79,16 +67,4 @@ resource "azurerm_virtual_machine" "vm" { admin_password = "${var.admin_password}" } - boot_diagnostics { - enabled = "true" - storage_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}" - } -} - -output "hostname" { - value = "${var.hostname}" } - -output "vm_fqdn" { - value = "${azurerm_public_ip.pip.fqdn}" -} \ No newline at end of file diff --git a/examples/azure-vm-from-user-image/outputs.tf b/examples/azure-vm-from-user-image/outputs.tf new file mode 100644 index 000000000000..125017a6f3f1 --- /dev/null +++ b/examples/azure-vm-from-user-image/outputs.tf @@ -0,0 +1,11 @@ +output "hostname" { + value = "${var.hostname}" +} + +output "vm_fqdn" { + value = "${azurerm_public_ip.pip.fqdn}" +} + +output "sshCommand" { + value = "${concat("ssh ", var.admin_username, "@", azurerm_public_ip.pip.fqdn)}" +} \ No newline at end of file diff --git a/examples/azure-vm-from-user-image/variables.tf b/examples/azure-vm-from-user-image/variables.tf new file mode 100644 index 000000000000..2c10c9401875 --- /dev/null +++ b/examples/azure-vm-from-user-image/variables.tf @@ -0,0 +1,54 @@ +variable "resource_group" { + description = "The name of the resource group in which the image to clone resides." +} + +variable "image_uri" { + description = "Specifies the image_uri in the form publisherName:offer:skus:version. image_uri can also specify the VHD uri of a custom VM image to clone." +} + +variable "os_type" { + description = "Specifies the operating system Type, valid values are windows, linux." + default = "linux" +} + +variable "location" { + description = "The location/region where the virtual network is created. Changing this forces a new resource to be created." + default = "southcentralus" +} + +variable "address_space" { + description = "The address space that is used by the virtual network. You can supply more than one address space. Changing this forces a new resource to be created." + default = "10.0.0.0/16" +} + +variable "subnet_prefix" { + description = "The address prefix to use for the subnet." + default = "10.0.0.0/24" +} + +variable "storage_account_name" { + description = "The name of the storage account in which the image from which you are cloning resides." +} + +variable "storage_account_type" { + description = "Defines the type of storage account to be created. Valid options are Standard_LRS, Standard_ZRS, Standard_GRS, Standard_RAGRS, Premium_LRS. Changing this is sometimes valid - see the Azure documentation for more information on which types of accounts can be converted into other types." + default = "Standard_LRS" +} + +variable "vm_size" { + description = "Specifies the size of the virtual machine. This must be the same as the vm image from which you are copying." +} + +variable "hostname" { + description = "VM name referenced also in storage-related names. This is also used as the label for the Domain Name and to make up the FQDN. If a domain name label is specified, an A DNS record is created for the public IP in the Microsoft Azure DNS system." +} + +variable "admin_username" { + description = "administrator user name" + default = "vmadmin" +} + +variable "admin_password" { + description = "administrator password (recommended to disable password auth)" + default = "T3rr@f0rmP@ssword" +} From fdff23aeec4aa94ff3481f05ef49430cddcca300 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Fri, 21 Apr 2017 10:34:07 -0500 Subject: [PATCH 04/77] provisions vm but image not properly prepared --- examples/azure-vm-from-user-image/main.tf | 2 +- examples/azure-vm-from-user-image/variables.tf | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/azure-vm-from-user-image/main.tf b/examples/azure-vm-from-user-image/main.tf index 44464b5cd55b..686ea83bac85 100644 --- a/examples/azure-vm-from-user-image/main.tf +++ b/examples/azure-vm-from-user-image/main.tf @@ -55,7 +55,7 @@ resource "azurerm_virtual_machine" "vm" { storage_os_disk { name = "${var.hostname}-osdisk1" image_uri = "${var.image_uri}" - vhd_uri = "" + vhd_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}vhds/myosdisk1.vhd" os_type = "${var.os_type}" caching = "ReadWrite" create_option = "FromImage" diff --git a/examples/azure-vm-from-user-image/variables.tf b/examples/azure-vm-from-user-image/variables.tf index 2c10c9401875..f25a42c66d6e 100644 --- a/examples/azure-vm-from-user-image/variables.tf +++ b/examples/azure-vm-from-user-image/variables.tf @@ -4,6 +4,7 @@ variable "resource_group" { variable "image_uri" { description = "Specifies the image_uri in the form publisherName:offer:skus:version. image_uri can also specify the VHD uri of a custom VM image to clone." + default = "https://myvmstor.blob.core.windows.net/vhds/armvm5yt3s3judzp66osDisk.vhd" } variable "os_type" { From 0dac5ecfa1864844390e1c0418407ce761a10fd4 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Fri, 21 Apr 2017 18:32:12 -0500 Subject: [PATCH 05/77] storage not correct --- examples/azure-vm-from-user-image/README.md | 2 +- examples/azure-vm-from-user-image/main.tf | 2 +- examples/azure-vm-from-user-image/variables.tf | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/examples/azure-vm-from-user-image/README.md b/examples/azure-vm-from-user-image/README.md index b115f2451032..e64165a0455f 100644 --- a/examples/azure-vm-from-user-image/README.md +++ b/examples/azure-vm-from-user-image/README.md @@ -1,4 +1,4 @@ -# Create a Virtual Machine from a User Image +# [Create a Virtual Machine from a User Image](https://docs.microsoft.com/en-us/azure/virtual-machines/linux/cli-deploy-templates#create-a-custom-vm-image) **Prerequisite - The Storage Account with the User Image VHD should already exist** This template allows you to create a Virtual Machines from a User image. This template also deploys a Virtual Network, Public IP addresses and a Network Interface. diff --git a/examples/azure-vm-from-user-image/main.tf b/examples/azure-vm-from-user-image/main.tf index 686ea83bac85..184873130a5f 100644 --- a/examples/azure-vm-from-user-image/main.tf +++ b/examples/azure-vm-from-user-image/main.tf @@ -55,7 +55,7 @@ resource "azurerm_virtual_machine" "vm" { storage_os_disk { name = "${var.hostname}-osdisk1" image_uri = "${var.image_uri}" - vhd_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}vhds/myosdisk1.vhd" + vhd_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}vhds/${var.hostname}osdisk.vhd" os_type = "${var.os_type}" caching = "ReadWrite" create_option = "FromImage" diff --git a/examples/azure-vm-from-user-image/variables.tf b/examples/azure-vm-from-user-image/variables.tf index f25a42c66d6e..57fc4f6fefba 100644 --- a/examples/azure-vm-from-user-image/variables.tf +++ b/examples/azure-vm-from-user-image/variables.tf @@ -4,7 +4,7 @@ variable "resource_group" { variable "image_uri" { description = "Specifies the image_uri in the form publisherName:offer:skus:version. image_uri can also specify the VHD uri of a custom VM image to clone." - default = "https://myvmstor.blob.core.windows.net/vhds/armvm5yt3s3judzp66osDisk.vhd" + default = "https://myrgdisks276.blob.core.windows.net/vhds/originalvm20170421170101.vhd" } variable "os_type" { @@ -29,6 +29,7 @@ variable "subnet_prefix" { variable "storage_account_name" { description = "The name of the storage account in which the image from which you are cloning resides." + default = "myrgsisks276" } variable "storage_account_type" { @@ -38,6 +39,7 @@ variable "storage_account_type" { variable "vm_size" { description = "Specifies the size of the virtual machine. This must be the same as the vm image from which you are copying." + default = "Standard_DS1_v2" } variable "hostname" { From 81e2559ead58b1153ca3253474907db91ec3a0c4 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Sat, 22 Apr 2017 10:26:28 -0500 Subject: [PATCH 06/77] provisions properly --- examples/azure-vm-from-user-image/main.tf | 9 +-------- examples/azure-vm-from-user-image/variables.tf | 5 +++++ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/examples/azure-vm-from-user-image/main.tf b/examples/azure-vm-from-user-image/main.tf index 184873130a5f..6bae761c1774 100644 --- a/examples/azure-vm-from-user-image/main.tf +++ b/examples/azure-vm-from-user-image/main.tf @@ -38,13 +38,6 @@ resource "azurerm_public_ip" "pip" { domain_name_label = "${var.hostname}" } -resource "azurerm_storage_account" "stor" { - name = "${var.storage_account_name}" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - account_type = "${var.storage_account_type}" -} - resource "azurerm_virtual_machine" "vm" { name = "${var.hostname}" location = "${var.location}" @@ -55,7 +48,7 @@ resource "azurerm_virtual_machine" "vm" { storage_os_disk { name = "${var.hostname}-osdisk1" image_uri = "${var.image_uri}" - vhd_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}vhds/${var.hostname}osdisk.vhd" + vhd_uri = "${var.primary_blob_endpoint}vhds/${var.hostname}osdisk.vhd" os_type = "${var.os_type}" caching = "ReadWrite" create_option = "FromImage" diff --git a/examples/azure-vm-from-user-image/variables.tf b/examples/azure-vm-from-user-image/variables.tf index 57fc4f6fefba..c09ad5ec15d0 100644 --- a/examples/azure-vm-from-user-image/variables.tf +++ b/examples/azure-vm-from-user-image/variables.tf @@ -7,6 +7,11 @@ variable "image_uri" { default = "https://myrgdisks276.blob.core.windows.net/vhds/originalvm20170421170101.vhd" } +variable "primary_blob_endpoint" { + description = "" + default = "https://myrgdisks276.blob.core.windows.net/" +} + variable "os_type" { description = "Specifies the operating system Type, valid values are windows, linux." default = "linux" From 7dc8150043b6c0c67a3976c6a22222eb44ea9009 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Sat, 22 Apr 2017 11:11:25 -0500 Subject: [PATCH 07/77] changed main.tf to azuredeploy.tf --- examples/azure-vm-from-user-image/README.md | 3 --- examples/azure-vm-from-user-image/{main.tf => azuredeploy.tf} | 0 2 files changed, 3 deletions(-) rename examples/azure-vm-from-user-image/{main.tf => azuredeploy.tf} (100%) diff --git a/examples/azure-vm-from-user-image/README.md b/examples/azure-vm-from-user-image/README.md index e64165a0455f..41d5164c6cbe 100644 --- a/examples/azure-vm-from-user-image/README.md +++ b/examples/azure-vm-from-user-image/README.md @@ -7,6 +7,3 @@ Azure requires that an application is added to Azure Active Directory to generat `image_uri` - Specifies the `image_uri` in the form publisherName:offer:skus:version. `image_uri` can also specify the VHD uri of a custom VM image to clone. `os_type` - When cloning a custom disk image the `os_type` documented below becomes required. Specifies the operating system Type, valid values are windows, linux. - -**Storage Accounts can be imported using the resource id, e.g.** -`terraform import azurerm_storage_account.storageAcc1 /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myresourcegroup/providers/Microsoft.Storage/storageAccounts/myaccount` \ No newline at end of file diff --git a/examples/azure-vm-from-user-image/main.tf b/examples/azure-vm-from-user-image/azuredeploy.tf similarity index 100% rename from examples/azure-vm-from-user-image/main.tf rename to examples/azure-vm-from-user-image/azuredeploy.tf From 5c079fa1d3e73c7c3c830d795c5b6c63e48023a8 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Sat, 22 Apr 2017 12:37:05 -0500 Subject: [PATCH 08/77] added tfvars and info for README --- examples/azure-vm-from-user-image/.gitignore | 4 +- examples/azure-vm-from-user-image/README.md | 93 ++++++++++++++++++- .../azure-vm-from-user-image/azuredeploy.tf | 9 +- examples/azure-vm-from-user-image/outputs.tf | 2 +- .../provider.tf.example | 6 ++ .../terraform.tfvars.example | 13 +++ .../azure-vm-from-user-image/terraform.tvars | 0 .../azure-vm-from-user-image/variables.tf | 15 --- 8 files changed, 114 insertions(+), 28 deletions(-) create mode 100644 examples/azure-vm-from-user-image/provider.tf.example create mode 100644 examples/azure-vm-from-user-image/terraform.tfvars.example create mode 100644 examples/azure-vm-from-user-image/terraform.tvars diff --git a/examples/azure-vm-from-user-image/.gitignore b/examples/azure-vm-from-user-image/.gitignore index a4f6eebd0a98..7773fa9ecc5d 100644 --- a/examples/azure-vm-from-user-image/.gitignore +++ b/examples/azure-vm-from-user-image/.gitignore @@ -1,3 +1,3 @@ terraform.tfstate* -terraform.tfvars* -provider.tf* +terraform.tfvars +provider.tf diff --git a/examples/azure-vm-from-user-image/README.md b/examples/azure-vm-from-user-image/README.md index 41d5164c6cbe..f391b0b8f40f 100644 --- a/examples/azure-vm-from-user-image/README.md +++ b/examples/azure-vm-from-user-image/README.md @@ -1,9 +1,92 @@ # [Create a Virtual Machine from a User Image](https://docs.microsoft.com/en-us/azure/virtual-machines/linux/cli-deploy-templates#create-a-custom-vm-image) -**Prerequisite - The Storage Account with the User Image VHD should already exist** -This template allows you to create a Virtual Machines from a User image. This template also deploys a Virtual Network, Public IP addresses and a Network Interface. + + + + + + -Azure requires that an application is added to Azure Active Directory to generate the client_id, client_secret, and tenant_id needed by Terraform (subscription_id can be recovered from your Azure account details). Please go [here](https://www.terraform.io/docs/providers/azurerm/) for full instructions on how to create this. +> Prerequisite - The generalized image VHD should exist, as well as a Storage Account for boot diagnostics -`image_uri` - Specifies the `image_uri` in the form publisherName:offer:skus:version. `image_uri` can also specify the VHD uri of a custom VM image to clone. -`os_type` - When cloning a custom disk image the `os_type` documented below becomes required. Specifies the operating system Type, valid values are windows, linux. +This template allows you to create a Virtual Machine from an unmanaged User image vhd. This template also deploys a Virtual Network, Public IP addresses and a Network Interface. + +If you are looking to accomplish the above scenario through PowerShell instead of a template, you can use a PowerShell script like below + +##### Variables + ## Global + $rgName = "testrg" + $location = "westus" + + ## Storage + $storageName = "teststore" + $storageType = "Standard_GRS" + + ## Network + $nicname = "testnic" + $subnet1Name = "subnet1" + $vnetName = "testnet" + $vnetAddressPrefix = "10.0.0.0/16" + $vnetSubnetAddressPrefix = "10.0.0.0/24" + + ## Compute + $vmName = "testvm" + $computerName = "testcomputer" + $vmSize = "Standard_A2" + $osDiskName = $vmName + "osDisk" + +##### Resource Group + New-AzureRmResourceGroup -Name $rgName -Location $location + +##### Storage + $storageacc = New-AzureRmStorageAccount -ResourceGroupName $rgName -Name $storageName -Type $storageType -Location $location + +##### Network + $pip = New-AzureRmPublicIpAddress -Name $nicname -ResourceGroupName $rgName -Location $location -AllocationMethod Dynamic + $subnetconfig = New-AzureRmVirtualNetworkSubnetConfig -Name $subnet1Name -AddressPrefix $vnetSubnetAddressPrefix + $vnet = New-AzureRmVirtualNetwork -Name $vnetName -ResourceGroupName $rgName -Location $location -AddressPrefix $vnetAddressPrefix -Subnet $subnetconfig + $nic = New-AzureRmNetworkInterface -Name $nicname -ResourceGroupName $rgName -Location $location -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id + +##### Compute + ## Setup local VM object + $cred = Get-Credential + $vm = New-AzureRmVMConfig -VMName $vmName -VMSize $vmSize + $vm = Set-AzureRmVMOperatingSystem -VM $vm -Windows -ComputerName $computerName -Credential $cred -ProvisionVMAgent -EnableAutoUpdate + + $vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic.Id + + $osDiskUri = "http://test.blob.core.windows.net/vmcontainer10798c80-131-1231-a94a-f9d2a712251f/osDisk.10798c80-2919-4100-a94a-f9d2a712251f.vhd" + $imageUri = "http://test.blob.core.windows.net/system/Microsoft.Compute/Images/captured/image-osDisk.8b021d87-913c-4f94-a01a-944ad92d7388.vhd" + $vm = Set-AzureRmVMOSDisk -VM $vm -Name $osDiskName -VhdUri $osDiskUri -CreateOption fromImage -SourceImageUri $imageUri -Windows + + $dataImageUri = "http://test.blob.core.windows.net/system/Microsoft.Compute/Images/captured/image-dataDisk-0.8b021d87-913c-4f94-a01a-944ad92d7388.vhd" + $dataDiskUri = "http://test.blob.core.windows.net/vmcontainer10798c80-sa11-41sa-dsad-f9d2a712251f/dataDisk-0.10798c80-2919-4100-a94a-f9d2a712251f.vhd" + $vm = Add-AzureRmVMDataDisk -VM $vm -Name "dd1" -VhdUri $dataDiskUri -SourceImageUri $dataImageUri -Lun 0 -CreateOption fromImage + + ## Create the VM in Azure + New-AzureRmVM -ResourceGroupName $rgName -Location $location -VM $vm -Verbose + + +## azuredeploy.tf +The `azuredeploy.tf` file contains the actual resources that will be deployed. It also contains the Azure Resource Group definition and any defined variables. + +## outputs.tf +This data is outputted when `terraform apply` is called, and can be queried using the `terraform output` command. + +## provider.tf +Azure requires that an application is added to Azure Active Directory to generate the `client_id`, `client_secret`, and `tenant_id` needed by Terraform (`subscription_id` can be recovered from your Azure account details). Please go [here](https://www.terraform.io/docs/providers/azurerm/) for full instructions on how to create this to populate your `provider.tf` file. + +## terraform.tfvars +If a `terraform.tfvars` file is present in the current directory, Terraform automatically loads it to populate variables. We don't recommend saving usernames and password to version control, but you can create a local secret variables file and use `-var-file` to load it. + +## variables.tf +The `variables.tf` file contains all of the input parameters that the user can specify when deploying this Terraform template. + +## .gitignore +If you are committing this template to source control, please insure that the following files are added to your `.gitignore` file. + +``` +terraform.tfstate* +terraform.tfvars* +provider.tf* +``` diff --git a/examples/azure-vm-from-user-image/azuredeploy.tf b/examples/azure-vm-from-user-image/azuredeploy.tf index 6bae761c1774..28edf99204b5 100644 --- a/examples/azure-vm-from-user-image/azuredeploy.tf +++ b/examples/azure-vm-from-user-image/azuredeploy.tf @@ -18,9 +18,9 @@ resource "azurerm_subnet" "subnet" { } resource "azurerm_network_interface" "nic" { - name = "${var.hostname}nic" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" + name = "${var.hostname}nic" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" ip_configuration { name = "${var.hostname}ipconfig" @@ -48,7 +48,7 @@ resource "azurerm_virtual_machine" "vm" { storage_os_disk { name = "${var.hostname}-osdisk1" image_uri = "${var.image_uri}" - vhd_uri = "${var.primary_blob_endpoint}vhds/${var.hostname}osdisk.vhd" + vhd_uri = "https://${var.storage_account_name}.blob.core.windows.net/vhds/${var.hostname}osdisk.vhd" os_type = "${var.os_type}" caching = "ReadWrite" create_option = "FromImage" @@ -59,5 +59,4 @@ resource "azurerm_virtual_machine" "vm" { admin_username = "${var.admin_username}" admin_password = "${var.admin_password}" } - } diff --git a/examples/azure-vm-from-user-image/outputs.tf b/examples/azure-vm-from-user-image/outputs.tf index 125017a6f3f1..e0e255a9e01c 100644 --- a/examples/azure-vm-from-user-image/outputs.tf +++ b/examples/azure-vm-from-user-image/outputs.tf @@ -8,4 +8,4 @@ output "vm_fqdn" { output "sshCommand" { value = "${concat("ssh ", var.admin_username, "@", azurerm_public_ip.pip.fqdn)}" -} \ No newline at end of file +} diff --git a/examples/azure-vm-from-user-image/provider.tf.example b/examples/azure-vm-from-user-image/provider.tf.example new file mode 100644 index 000000000000..a0b5e46772f5 --- /dev/null +++ b/examples/azure-vm-from-user-image/provider.tf.example @@ -0,0 +1,6 @@ +provider "azurerm" { + subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" + client_id = "REPLACE-WITH-YOUR-CLIENT-ID" + client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" + tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" +} diff --git a/examples/azure-vm-from-user-image/terraform.tfvars.example b/examples/azure-vm-from-user-image/terraform.tfvars.example new file mode 100644 index 000000000000..6cc72c9218be --- /dev/null +++ b/examples/azure-vm-from-user-image/terraform.tfvars.example @@ -0,0 +1,13 @@ +resource_group = "myresourcegroup" +image_uri = "https://DISK.blob.core.windows.net/vhds/ORIGINAL-VM.vhd" +primary_blob_endpoint = "https://DISK.blob.core.windows.net/" +location = "southcentralus" +os_type = "linux" +address_space = "10.0.0.0/16" +subnet_prefix = "10.0.0.0/24" +storage_account_name = "STOR-ACCT-NAME" +storage_account_type = "Standard_LRS" +vm_size = "Standard_DS1_v2" +hostname = "HOSTNAME" +admin_username = "vmadmin" +admin_password = "T3rr@f0rmP@ssword" \ No newline at end of file diff --git a/examples/azure-vm-from-user-image/terraform.tvars b/examples/azure-vm-from-user-image/terraform.tvars new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/examples/azure-vm-from-user-image/variables.tf b/examples/azure-vm-from-user-image/variables.tf index c09ad5ec15d0..8bf04524f4fd 100644 --- a/examples/azure-vm-from-user-image/variables.tf +++ b/examples/azure-vm-from-user-image/variables.tf @@ -4,47 +4,34 @@ variable "resource_group" { variable "image_uri" { description = "Specifies the image_uri in the form publisherName:offer:skus:version. image_uri can also specify the VHD uri of a custom VM image to clone." - default = "https://myrgdisks276.blob.core.windows.net/vhds/originalvm20170421170101.vhd" -} - -variable "primary_blob_endpoint" { - description = "" - default = "https://myrgdisks276.blob.core.windows.net/" } variable "os_type" { description = "Specifies the operating system Type, valid values are windows, linux." - default = "linux" } variable "location" { description = "The location/region where the virtual network is created. Changing this forces a new resource to be created." - default = "southcentralus" } variable "address_space" { description = "The address space that is used by the virtual network. You can supply more than one address space. Changing this forces a new resource to be created." - default = "10.0.0.0/16" } variable "subnet_prefix" { description = "The address prefix to use for the subnet." - default = "10.0.0.0/24" } variable "storage_account_name" { description = "The name of the storage account in which the image from which you are cloning resides." - default = "myrgsisks276" } variable "storage_account_type" { description = "Defines the type of storage account to be created. Valid options are Standard_LRS, Standard_ZRS, Standard_GRS, Standard_RAGRS, Premium_LRS. Changing this is sometimes valid - see the Azure documentation for more information on which types of accounts can be converted into other types." - default = "Standard_LRS" } variable "vm_size" { description = "Specifies the size of the virtual machine. This must be the same as the vm image from which you are copying." - default = "Standard_DS1_v2" } variable "hostname" { @@ -53,10 +40,8 @@ variable "hostname" { variable "admin_username" { description = "administrator user name" - default = "vmadmin" } variable "admin_password" { description = "administrator password (recommended to disable password auth)" - default = "T3rr@f0rmP@ssword" } From c86ef6fce79d3dec6ad1614b5fd9c031d5950367 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Sat, 22 Apr 2017 12:43:36 -0500 Subject: [PATCH 09/77] tfvars ignored and corrected file ext --- examples/azure-vm-from-user-image/terraform.tvars | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 examples/azure-vm-from-user-image/terraform.tvars diff --git a/examples/azure-vm-from-user-image/terraform.tvars b/examples/azure-vm-from-user-image/terraform.tvars deleted file mode 100644 index e69de29bb2d1..000000000000 From 534b23634db9774837055825ca23458934f2d3b1 Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Mon, 24 Apr 2017 10:11:10 -0500 Subject: [PATCH 10/77] added CI config; added sane defaults for variables; updated deployment script, added mac specific deployment for local testing --- .travis.yml | 78 +++++++++---------- .../azure-vm-from-user-image/deploy.mac.sh | 17 ++++ examples/azure-vm-from-user-image/deploy.sh | 31 ++++---- .../azure-vm-from-user-image/variables.tf | 7 ++ 4 files changed, 76 insertions(+), 57 deletions(-) create mode 100644 examples/azure-vm-from-user-image/deploy.mac.sh diff --git a/.travis.yml b/.travis.yml index 04cc6f30960b..496f541775a2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,42 +1,42 @@ -dist: trusty -sudo: false -language: go -go: -- 1.8 - -# add TF_CONSUL_TEST=1 to run consul tests -# they were causing timouts in travis +sudo: required + +services: + - docker + +language: generic + +# on branches: ignore multiple commits that will queue build jobs, just run latest commit +git: + depth: 1 + +# establish environment variables env: - - CONSUL_VERSION=0.7.5 GOMAXPROCS=4 - -# Fetch consul for the backend and provider tests -before_install: - - curl -sLo consul.zip https://releases.hashicorp.com/consul/${CONSUL_VERSION}/consul_${CONSUL_VERSION}_linux_amd64.zip - - unzip consul.zip - - mkdir ~/bin - - mv consul ~/bin - - export PATH="~/bin:$PATH" - -install: -# This script is used by the Travis build to install a cookie for -# go.googlesource.com so rate limits are higher when using `go get` to fetch -# packages that live there. -# See: https://github.com/golang/go/issues/12933 -- bash scripts/gogetcookie.sh -- go get github.com/kardianos/govendor -script: -- make vet vendor-status test -- GOOS=windows go build + - TEST_DIR=examples/azure-vm-from-user-image + branches: only: - - master -notifications: - irc: - channels: - - irc.freenode.org#terraform-tool - skip_join: true - use_notice: true -matrix: - fast_finish: true - allow_failures: - - go: tip + - /^(?i:topic)-.*$/ + +# install terraform +before_deploy: + - export KEY=$(cat /dev/urandom | tr -cd 'a-z' | head -c 12) + - export PASSWORD=$KEY$(cat /dev/urandom | tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | tr -cd '0-9' | head -c 2) + - export IMAGE_URI='https://DISK.blob.core.windows.net/vhds/ORIGINAL-VM.vhd' + - export PRIMARY_BLOB_ENDPOINT='https://DISK.blob.core.windows.net/' + + +# terraform deploy script +deploy: + - provider: script + skip_cleanup: true + script: cd $TEST_DIR && ./deploy.sh + on: + repo: 10thmagnitude/terraform + branch: topic-101-vm-from-user-image + +# destroy resources with Azure CLI +after_deploy: + - docker run --rm -it \ + azuresdk/azure-cli-python \ + sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ + az group delete -y -n $KEY" diff --git a/examples/azure-vm-from-user-image/deploy.mac.sh b/examples/azure-vm-from-user-image/deploy.mac.sh new file mode 100644 index 000000000000..6bb89bca9249 --- /dev/null +++ b/examples/azure-vm-from-user-image/deploy.mac.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +set -o errexit -o nounset + +# generate a unique string for CI deployment +export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) +export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) +export IMAGE_URI='https://DISK.blob.core.windows.net/vhds/ORIGINAL-VM.vhd' +export PRIMARY_BLOB_ENDPOINT='https://DISK.blob.core.windows.net/' + + +/bin/sh ./deploy.sh + +# docker run --rm -it \ +# azuresdk/azure-cli-python \ +# sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ +# az group delete -y -n $KEY" diff --git a/examples/azure-vm-from-user-image/deploy.sh b/examples/azure-vm-from-user-image/deploy.sh index 3160ca88ed43..1e8c75d4d77e 100644 --- a/examples/azure-vm-from-user-image/deploy.sh +++ b/examples/azure-vm-from-user-image/deploy.sh @@ -2,23 +2,18 @@ set -o errexit -o nounset -# generate a unique string for CI deployment -KEY=$(cat /dev/urandom | tr -cd 'a-z' | head -c 12) -PASSWORD=KEY -PASSWORD+=$(cat /dev/urandom | tr -cd 'A-Z' | head -c 2) -PASSWORD+=$(cat /dev/urandom | tr -cd '0-9' | head -c 2) - -terraform get - -terraform plan \ - -var 'dns_name='$KEY \ - -var 'admin_password='$PASSWORD \ - -var 'admin_username='$KEY \ - -var 'resource_group='$KEY \ - -out=out.tfplan - -terraform apply out.tfplan - +docker run --rm -it \ + -e ARM_CLIENT_ID \ + -e ARM_CLIENT_SECRET \ + -e ARM_SUBSCRIPTION_ID \ + -e ARM_TENANT_ID \ + -v $(pwd):/data \ + --entrypoint "/bin/sh" \ + hashicorp/terraform:light \ + -c "cd /data; \ + /bin/terraform get; \ + /bin/terraform validate; \ + /bin/terraform plan -out=out.tfplan -var hostname=$KEY -var resource_group=$KEY -var admin_username=$KEY -var admin_password=$PASSWORD -var image_uri=$IMAGE_URI -var primary_blob_endpoint=$PRIMARY_BLOB_ENDPOINT -var storage_account_name=$KEY; /bin/terraform apply out.tfplan" # TODO: determine external validation, possibly Azure CLI @@ -40,4 +35,4 @@ terraform apply out.tfplan # git commit -m "tfstate: $NOW [ci skip]" # # echo "Pushing changes to upstream master" -# git push upstream master \ No newline at end of file +# git push upstream master diff --git a/examples/azure-vm-from-user-image/variables.tf b/examples/azure-vm-from-user-image/variables.tf index 8bf04524f4fd..2f5cfca0f5a7 100644 --- a/examples/azure-vm-from-user-image/variables.tf +++ b/examples/azure-vm-from-user-image/variables.tf @@ -8,18 +8,22 @@ variable "image_uri" { variable "os_type" { description = "Specifies the operating system Type, valid values are windows, linux." + default="linux" } variable "location" { description = "The location/region where the virtual network is created. Changing this forces a new resource to be created." + default="southcentralus" } variable "address_space" { description = "The address space that is used by the virtual network. You can supply more than one address space. Changing this forces a new resource to be created." + default="10.0.0.0/16" } variable "subnet_prefix" { description = "The address prefix to use for the subnet." + default="10.0.0.0/24" } variable "storage_account_name" { @@ -28,10 +32,12 @@ variable "storage_account_name" { variable "storage_account_type" { description = "Defines the type of storage account to be created. Valid options are Standard_LRS, Standard_ZRS, Standard_GRS, Standard_RAGRS, Premium_LRS. Changing this is sometimes valid - see the Azure documentation for more information on which types of accounts can be converted into other types." + default="Standard_LRS" } variable "vm_size" { description = "Specifies the size of the virtual machine. This must be the same as the vm image from which you are copying." + default="Standard_DS1_v2" } variable "hostname" { @@ -40,6 +46,7 @@ variable "hostname" { variable "admin_username" { description = "administrator user name" + default="vmadmin" } variable "admin_password" { From 0cf888b6acbd04fc5e1c599abb77ad8e0027b0b3 Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Mon, 24 Apr 2017 10:16:06 -0500 Subject: [PATCH 11/77] deploy.sh to be executable --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 496f541775a2..bb75e76235a5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,7 +29,7 @@ before_deploy: deploy: - provider: script skip_cleanup: true - script: cd $TEST_DIR && ./deploy.sh + script: cd $TEST_DIR && chmod +X ./deploy.sh && ./deploy.sh on: repo: 10thmagnitude/terraform branch: topic-101-vm-from-user-image From 68f00035c9b9e9cd42e3dcba159d09f928f4734c Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Mon, 24 Apr 2017 10:25:46 -0500 Subject: [PATCH 12/77] executable deploy files --- .travis.yml | 2 +- examples/azure-vm-from-user-image/deploy.mac.sh | 0 examples/azure-vm-from-user-image/deploy.sh | 0 3 files changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 examples/azure-vm-from-user-image/deploy.mac.sh mode change 100644 => 100755 examples/azure-vm-from-user-image/deploy.sh diff --git a/.travis.yml b/.travis.yml index bb75e76235a5..496f541775a2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,7 +29,7 @@ before_deploy: deploy: - provider: script skip_cleanup: true - script: cd $TEST_DIR && chmod +X ./deploy.sh && ./deploy.sh + script: cd $TEST_DIR && ./deploy.sh on: repo: 10thmagnitude/terraform branch: topic-101-vm-from-user-image diff --git a/examples/azure-vm-from-user-image/deploy.mac.sh b/examples/azure-vm-from-user-image/deploy.mac.sh old mode 100644 new mode 100755 diff --git a/examples/azure-vm-from-user-image/deploy.sh b/examples/azure-vm-from-user-image/deploy.sh old mode 100644 new mode 100755 From c898510f2471c59f03e4d5859bd060638455bb6c Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Mon, 24 Apr 2017 19:28:16 -0500 Subject: [PATCH 13/77] added CI files; changed vars --- .travis.yml | 6 +++--- examples/azure-vm-from-user-image/deploy.mac.sh | 6 +++--- examples/azure-vm-from-user-image/deploy.sh | 2 +- .../{azuredeploy.tf => main.tf} | 0 examples/azure-vm-from-user-image/variables.tf | 16 +++++++++------- 5 files changed, 16 insertions(+), 14 deletions(-) rename examples/azure-vm-from-user-image/{azuredeploy.tf => main.tf} (100%) diff --git a/.travis.yml b/.travis.yml index 496f541775a2..b7c7b7c23663 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,9 +21,9 @@ branches: before_deploy: - export KEY=$(cat /dev/urandom | tr -cd 'a-z' | head -c 12) - export PASSWORD=$KEY$(cat /dev/urandom | tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | tr -cd '0-9' | head -c 2) - - export IMAGE_URI='https://DISK.blob.core.windows.net/vhds/ORIGINAL-VM.vhd' - - export PRIMARY_BLOB_ENDPOINT='https://DISK.blob.core.windows.net/' - + - export IMAGE_URI=https://myrgdisks640.blob.core.windows.net/vhds/original-vm20170424164303.vhd + - export STORAGE_ACCOUNT_NAME=myrgdisks640 + - export RG=myrg # terraform deploy script deploy: diff --git a/examples/azure-vm-from-user-image/deploy.mac.sh b/examples/azure-vm-from-user-image/deploy.mac.sh index 6bb89bca9249..d66b85079b19 100755 --- a/examples/azure-vm-from-user-image/deploy.mac.sh +++ b/examples/azure-vm-from-user-image/deploy.mac.sh @@ -5,9 +5,9 @@ set -o errexit -o nounset # generate a unique string for CI deployment export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) -export IMAGE_URI='https://DISK.blob.core.windows.net/vhds/ORIGINAL-VM.vhd' -export PRIMARY_BLOB_ENDPOINT='https://DISK.blob.core.windows.net/' - +export IMAGE_URI=https://myrgdisks640.blob.core.windows.net/vhds/original-vm20170424164303.vhd +export STORAGE_ACCOUNT_NAME=myrgdisks640 +export RG=myrg /bin/sh ./deploy.sh diff --git a/examples/azure-vm-from-user-image/deploy.sh b/examples/azure-vm-from-user-image/deploy.sh index 1e8c75d4d77e..94a5d0a61aae 100755 --- a/examples/azure-vm-from-user-image/deploy.sh +++ b/examples/azure-vm-from-user-image/deploy.sh @@ -13,7 +13,7 @@ docker run --rm -it \ -c "cd /data; \ /bin/terraform get; \ /bin/terraform validate; \ - /bin/terraform plan -out=out.tfplan -var hostname=$KEY -var resource_group=$KEY -var admin_username=$KEY -var admin_password=$PASSWORD -var image_uri=$IMAGE_URI -var primary_blob_endpoint=$PRIMARY_BLOB_ENDPOINT -var storage_account_name=$KEY; /bin/terraform apply out.tfplan" + /bin/terraform plan -out=out.tfplan -var hostname=$KEY -var resource_group=$RG -var admin_username=$KEY -var admin_password=$PASSWORD -var image_uri=$IMAGE_URI -var storage_account_name=$STORAGE_ACCOUNT_NAME; /bin/terraform apply out.tfplan" # TODO: determine external validation, possibly Azure CLI diff --git a/examples/azure-vm-from-user-image/azuredeploy.tf b/examples/azure-vm-from-user-image/main.tf similarity index 100% rename from examples/azure-vm-from-user-image/azuredeploy.tf rename to examples/azure-vm-from-user-image/main.tf diff --git a/examples/azure-vm-from-user-image/variables.tf b/examples/azure-vm-from-user-image/variables.tf index 2f5cfca0f5a7..b3e94928978d 100644 --- a/examples/azure-vm-from-user-image/variables.tf +++ b/examples/azure-vm-from-user-image/variables.tf @@ -1,5 +1,6 @@ variable "resource_group" { description = "The name of the resource group in which the image to clone resides." + default = "myrg" } variable "image_uri" { @@ -8,22 +9,22 @@ variable "image_uri" { variable "os_type" { description = "Specifies the operating system Type, valid values are windows, linux." - default="linux" + default = "linux" } variable "location" { description = "The location/region where the virtual network is created. Changing this forces a new resource to be created." - default="southcentralus" + default = "southcentralus" } variable "address_space" { description = "The address space that is used by the virtual network. You can supply more than one address space. Changing this forces a new resource to be created." - default="10.0.0.0/16" + default = "10.0.0.0/24" } variable "subnet_prefix" { description = "The address prefix to use for the subnet." - default="10.0.0.0/24" + default = "10.0.0.0/24" } variable "storage_account_name" { @@ -32,12 +33,12 @@ variable "storage_account_name" { variable "storage_account_type" { description = "Defines the type of storage account to be created. Valid options are Standard_LRS, Standard_ZRS, Standard_GRS, Standard_RAGRS, Premium_LRS. Changing this is sometimes valid - see the Azure documentation for more information on which types of accounts can be converted into other types." - default="Standard_LRS" + default = "Premium_LRS" } variable "vm_size" { description = "Specifies the size of the virtual machine. This must be the same as the vm image from which you are copying." - default="Standard_DS1_v2" + default = "Standard_DS1_v2" } variable "hostname" { @@ -46,9 +47,10 @@ variable "hostname" { variable "admin_username" { description = "administrator user name" - default="vmadmin" + default = "vmadmin" } variable "admin_password" { description = "administrator password (recommended to disable password auth)" + default = "T3rr@f0rmP@ssword" } From 5c8ecd89384ec00514205e34eb45ca5de6b28f56 Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Tue, 25 Apr 2017 13:07:01 -0500 Subject: [PATCH 14/77] prep for PR --- .travis.yml | 6 +++--- examples/azure-vm-from-user-image/after_deploy.sh | 9 +++++++++ examples/azure-vm-from-user-image/deploy.sh | 3 ++- 3 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 examples/azure-vm-from-user-image/after_deploy.sh diff --git a/.travis.yml b/.travis.yml index 2300d05045ec..a669ca462c75 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,9 +21,9 @@ branches: before_deploy: - export KEY=$(cat /dev/urandom | tr -cd 'a-z' | head -c 12) - export PASSWORD=$KEY$(cat /dev/urandom | tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | tr -cd '0-9' | head -c 2) - - export IMAGE_URI=https://myrgdisks640.blob.core.windows.net/vhds/original-vm20170424164303.vhd - - export STORAGE_ACCOUNT_NAME=myrgdisks640 - - export RG=myrg + - export EXISTING_IMAGE_URI=https://myrgdisks640.blob.core.windows.net/vhds/original-vm20170424164303.vhd + - export EXISTING_STORAGE_ACCOUNT_NAME=myrgdisks640 + - export EXISTING_RESOURCE_GROUP=myrg # terraform deploy script deploy: diff --git a/examples/azure-vm-from-user-image/after_deploy.sh b/examples/azure-vm-from-user-image/after_deploy.sh new file mode 100644 index 000000000000..245aba38045e --- /dev/null +++ b/examples/azure-vm-from-user-image/after_deploy.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +set -o errexit -o nounset + +# cleanup deployed azure resources +docker run --rm -it \ + azuresdk/azure-cli-python \ + sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ + az group delete -y -n $KEY" diff --git a/examples/azure-vm-from-user-image/deploy.sh b/examples/azure-vm-from-user-image/deploy.sh index 94a5d0a61aae..3adf165f8700 100755 --- a/examples/azure-vm-from-user-image/deploy.sh +++ b/examples/azure-vm-from-user-image/deploy.sh @@ -13,7 +13,8 @@ docker run --rm -it \ -c "cd /data; \ /bin/terraform get; \ /bin/terraform validate; \ - /bin/terraform plan -out=out.tfplan -var hostname=$KEY -var resource_group=$RG -var admin_username=$KEY -var admin_password=$PASSWORD -var image_uri=$IMAGE_URI -var storage_account_name=$STORAGE_ACCOUNT_NAME; /bin/terraform apply out.tfplan" + /bin/terraform plan -out=out.tfplan -var hostname=$KEY -var resource_group=$EXISTING_RESOURCE_GROUP -var admin_username=$KEY -var admin_password=$PASSWORD -var image_uri=$EXISTING_IMAGE_URI -var storage_account_name=$EXISTING_STORAGE_ACCOUNT_NAME; \ + /bin/terraform apply out.tfplan" # TODO: determine external validation, possibly Azure CLI From 0267fcacf0f75dec5b8e2dfd06735c7e7489df8a Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Tue, 25 Apr 2017 13:42:34 -0500 Subject: [PATCH 15/77] removal of old folder --- examples/101-vm-simple-linux/.gitignore | 3 - examples/101-vm-simple-linux/README.md | 8 -- examples/101-vm-simple-linux/main.tf | 120 ---------------------- examples/101-vm-simple-linux/variables.tf | 78 -------------- 4 files changed, 209 deletions(-) delete mode 100644 examples/101-vm-simple-linux/.gitignore delete mode 100644 examples/101-vm-simple-linux/README.md delete mode 100644 examples/101-vm-simple-linux/main.tf delete mode 100644 examples/101-vm-simple-linux/variables.tf diff --git a/examples/101-vm-simple-linux/.gitignore b/examples/101-vm-simple-linux/.gitignore deleted file mode 100644 index a4f6eebd0a98..000000000000 --- a/examples/101-vm-simple-linux/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -terraform.tfstate* -terraform.tfvars* -provider.tf* diff --git a/examples/101-vm-simple-linux/README.md b/examples/101-vm-simple-linux/README.md deleted file mode 100644 index 92446ee9e970..000000000000 --- a/examples/101-vm-simple-linux/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Deploy a simple Linux VM -**ubuntu** - -This template allows you to deploy a simple Linux VM using a few different options for the Ubuntu version, using the latest patched version. This will deploy a A1 size VM in the resource group location and return the FQDN of the VM. - -This template takes a minimum amount of parameters and deploys a Linux VM, using the latest patched version. - -Azure requires that an application is added to Azure Active Directory to generate the client_id, client_secret, and tenant_id needed by Terraform (subscription_id can be recovered from your Azure account details). Please go [here](https://www.terraform.io/docs/providers/azurerm/) for full instructions on how to create this. \ No newline at end of file diff --git a/examples/101-vm-simple-linux/main.tf b/examples/101-vm-simple-linux/main.tf deleted file mode 100644 index f0ef742412d2..000000000000 --- a/examples/101-vm-simple-linux/main.tf +++ /dev/null @@ -1,120 +0,0 @@ -resource "azurerm_resource_group" "rg" { - name = "${var.resource_group}" - location = "${var.location}" -} - -resource "azurerm_virtual_network" "vnet" { - name = "${var.virtual_network_name}" - location = "${var.location}" - address_space = ["${var.address_space}"] - resource_group_name = "${azurerm_resource_group.rg.name}" -} - -resource "azurerm_subnet" "subnet" { - name = "${var.rg_prefix}subnet" - virtual_network_name = "${azurerm_virtual_network.vnet.name}" - resource_group_name = "${azurerm_resource_group.rg.name}" - address_prefix = "${var.subnet_prefix}" -} - -resource "azurerm_network_interface" "nic" { - name = "${var.rg_prefix}nic" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - - ip_configuration { - name = "${var.rg_prefix}ipconfig" - subnet_id = "${azurerm_subnet.subnet.id}" - private_ip_address_allocation = "Dynamic" - public_ip_address_id = "${azurerm_public_ip.pip.id}" - } -} - -resource "azurerm_public_ip" "pip" { - name = "${var.rg_prefix}-ip" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - public_ip_address_allocation = "dynamic" - domain_name_label = "${var.dns_name}" -} - -resource "azurerm_storage_account" "stor" { - name = "${var.hostname}stor" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - account_type = "${var.storage_account_type}" -} - -resource "azurerm_storage_container" "storc" { - name = "${var.hostname}-vhds" - resource_group_name = "${azurerm_resource_group.rg.name}" - storage_account_name = "${azurerm_storage_account.stor.name}" - container_access_type = "private" -} - -resource "azurerm_managed_disk" "disk1" { - name = "${var.hostname}-osdisk1" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - storage_account_type = "Standard_LRS" - create_option = "Empty" - disk_size_gb = "30" -} - -resource "azurerm_managed_disk" "disk2" { - name = "${var.hostname}-disk2" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - storage_account_type = "Standard_LRS" - create_option = "Empty" - disk_size_gb = "1023" -} - -resource "azurerm_virtual_machine" "vm" { - name = "${var.rg_prefix}vm" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - vm_size = "${var.vm_size}" - network_interface_ids = ["${azurerm_network_interface.nic.id}"] - - storage_image_reference { - publisher = "${var.image_publisher}" - offer = "${var.image_offer}" - sku = "${var.image_sku}" - version = "${var.image_version}" - } - - storage_os_disk { - name = "${var.hostname}-osdisk1" - vhd_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}${azurerm_storage_container.storc.name}/${var.hostname}-osdisk1.vhd" - caching = "ReadWrite" - create_option = "FromImage" - } - - storage_data_disk { - name = "${var.hostname}-disk2" - vhd_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}${azurerm_storage_container.storc.name}/${var.hostname}-disk2.vhd" - disk_size_gb = "1023" - create_option = "Empty" - lun = 0 - } - - os_profile { - computer_name = "${var.hostname}" - admin_username = "${var.admin_username}" - admin_password = "${var.admin_password}" - } - - boot_diagnostics { - enabled = "true" - storage_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}" - } -} - -output "hostname" { - value = "${var.hostname}" -} - -output "vm_fqdn" { - value = "${azurerm_public_ip.pip.fqdn}" -} \ No newline at end of file diff --git a/examples/101-vm-simple-linux/variables.tf b/examples/101-vm-simple-linux/variables.tf deleted file mode 100644 index b2ab327217fa..000000000000 --- a/examples/101-vm-simple-linux/variables.tf +++ /dev/null @@ -1,78 +0,0 @@ -variable "resource_group" { - description = "The name of the resource group in which to create the virtual network." - default = "myresourcegroup" -} - -variable "rg_prefix" { - description = "The shortened abbreviation to represent your resource group that will go on the front of some resources." - default = "rg" -} - -variable "location" { - description = "The location/region where the virtual network is created. Changing this forces a new resource to be created." - default = "southcentralus" -} - -variable "virtual_network_name" { - description = "The name for the virtual network." - default = "vnet" -} - -variable "address_space" { - description = "The address space that is used by the virtual network. You can supply more than one address space. Changing this forces a new resource to be created." - default = "10.0.0.0/16" -} - -variable "subnet_prefix" { - description = "The address prefix to use for the subnet." - default = "10.0.10.0/24" -} - -variable "storage_account_type" { - description = "Specifies the name of the storage account. Changing this forces a new resource to be created. This must be unique across the entire Azure service, not just within the resource group." - default = "Standard_LRS" -} - -variable "vm_size" { - description = "Specifies the name of the virtual machine resource. Changing this forces a new resource to be created." - default = "Standard_A0" -} - -variable "image_publisher" { - description = "name of the publisher of the image (az vm image list)" - default = "Canonical" -} - -variable "image_offer" { - description = "the name of the offer (az vm image list)" - default = "UbuntuServer" -} - -variable "image_sku" { - description = "image sku to apply (az vm image list)" - default = "16.04-LTS" -} - -variable "image_version" { - description = "version of the image to apply (az vm image list)" - default = "latest" -} - -variable "hostname" { - description = "VM name referenced also in storage-related names." - default = "myvm" -} - -variable "dns_name" { - description = " Label for the Domain Name. Will be used to make up the FQDN. If a domain name label is specified, an A DNS record is created for the public IP in the Microsoft Azure DNS system." -} - -variable "admin_username" { - description = "administrator user name" - default = "vmadmin" -} - -variable "admin_password" { - description = "administrator password (recommended to disable password auth)" - default = "T3rr@f0rmP@ssword" -} From f9bf6baaf3724acc7bbc72cc015a7c40f79db2ab Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Tue, 25 Apr 2017 18:07:09 -0500 Subject: [PATCH 16/77] prep for PR --- examples/azure-vm-from-user-image/after_deploy.sh | 6 ++++-- examples/azure-vm-from-user-image/deploy.mac.sh | 13 ++++--------- 2 files changed, 8 insertions(+), 11 deletions(-) mode change 100644 => 100755 examples/azure-vm-from-user-image/after_deploy.sh diff --git a/examples/azure-vm-from-user-image/after_deploy.sh b/examples/azure-vm-from-user-image/after_deploy.sh old mode 100644 new mode 100755 index 245aba38045e..8a5624eb7681 --- a/examples/azure-vm-from-user-image/after_deploy.sh +++ b/examples/azure-vm-from-user-image/after_deploy.sh @@ -2,8 +2,10 @@ set -o errexit -o nounset -# cleanup deployed azure resources docker run --rm -it \ azuresdk/azure-cli-python \ sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ - az group delete -y -n $KEY" + az vm delete --name $KEY --resource-group permanent -y; \ + az network nic delete --name $KEY'nic' --resource-group permanent; \ + az network vnet delete --name $KEY'vnet' --resource-group permanent; \ + az network public-ip delete --name $KEY'-ip' --resource-group permanent;" diff --git a/examples/azure-vm-from-user-image/deploy.mac.sh b/examples/azure-vm-from-user-image/deploy.mac.sh index d66b85079b19..eb2808ef5502 100755 --- a/examples/azure-vm-from-user-image/deploy.mac.sh +++ b/examples/azure-vm-from-user-image/deploy.mac.sh @@ -5,13 +5,8 @@ set -o errexit -o nounset # generate a unique string for CI deployment export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) -export IMAGE_URI=https://myrgdisks640.blob.core.windows.net/vhds/original-vm20170424164303.vhd -export STORAGE_ACCOUNT_NAME=myrgdisks640 -export RG=myrg +export EXISTING_IMAGE_URI=https://permanentstor.blob.core.windows.net/permanent-vhds/permanent-osdisk1.vhd +export EXISTING_STORAGE_ACCOUNT_NAME=permanentstor +export EXISTING_RESOURCE_GROUP=permanent -/bin/sh ./deploy.sh - -# docker run --rm -it \ -# azuresdk/azure-cli-python \ -# sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ -# az group delete -y -n $KEY" +/bin/sh ./after_deploy.sh From cec06795654b98efca06c0235d42fb481e4f0718 Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Tue, 25 Apr 2017 18:11:07 -0500 Subject: [PATCH 17/77] wrong args for travis --- .travis.yml | 6 +++--- examples/azure-vm-from-user-image/deploy.sh | 2 -- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index a669ca462c75..b559eea4327c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,9 +21,9 @@ branches: before_deploy: - export KEY=$(cat /dev/urandom | tr -cd 'a-z' | head -c 12) - export PASSWORD=$KEY$(cat /dev/urandom | tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | tr -cd '0-9' | head -c 2) - - export EXISTING_IMAGE_URI=https://myrgdisks640.blob.core.windows.net/vhds/original-vm20170424164303.vhd - - export EXISTING_STORAGE_ACCOUNT_NAME=myrgdisks640 - - export EXISTING_RESOURCE_GROUP=myrg + - export EXISTING_IMAGE_URI=https://permanentstor.blob.core.windows.net/permanent-vhds/permanent-osdisk1.vhd + - export EXISTING_STORAGE_ACCOUNT_NAME=permanentstor + - export EXISTING_RESOURCE_GROUP=permanent # terraform deploy script deploy: diff --git a/examples/azure-vm-from-user-image/deploy.sh b/examples/azure-vm-from-user-image/deploy.sh index 3adf165f8700..2558ebce5ff1 100755 --- a/examples/azure-vm-from-user-image/deploy.sh +++ b/examples/azure-vm-from-user-image/deploy.sh @@ -16,8 +16,6 @@ docker run --rm -it \ /bin/terraform plan -out=out.tfplan -var hostname=$KEY -var resource_group=$EXISTING_RESOURCE_GROUP -var admin_username=$KEY -var admin_password=$PASSWORD -var image_uri=$EXISTING_IMAGE_URI -var storage_account_name=$EXISTING_STORAGE_ACCOUNT_NAME; \ /bin/terraform apply out.tfplan" -# TODO: determine external validation, possibly Azure CLI - # echo "Setting git user name" # git config user.name $GH_USER_NAME # From d78e8bd4bdad292eff2a0dacc92299d5798e15d3 Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Wed, 26 Apr 2017 10:52:16 -0500 Subject: [PATCH 18/77] more PR prep --- examples/azure-vm-from-user-image/.gitignore | 3 --- examples/azure-vm-from-user-image/provider.tf | 6 ++++++ examples/azure-vm-from-user-image/provider.tf.example | 6 ------ .../{terraform.tfvars.example => terraform.tfvars} | 2 +- 4 files changed, 7 insertions(+), 10 deletions(-) delete mode 100644 examples/azure-vm-from-user-image/.gitignore create mode 100644 examples/azure-vm-from-user-image/provider.tf delete mode 100644 examples/azure-vm-from-user-image/provider.tf.example rename examples/azure-vm-from-user-image/{terraform.tfvars.example => terraform.tfvars} (92%) diff --git a/examples/azure-vm-from-user-image/.gitignore b/examples/azure-vm-from-user-image/.gitignore deleted file mode 100644 index 7773fa9ecc5d..000000000000 --- a/examples/azure-vm-from-user-image/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -terraform.tfstate* -terraform.tfvars -provider.tf diff --git a/examples/azure-vm-from-user-image/provider.tf b/examples/azure-vm-from-user-image/provider.tf new file mode 100644 index 000000000000..bdf0583f3259 --- /dev/null +++ b/examples/azure-vm-from-user-image/provider.tf @@ -0,0 +1,6 @@ +# provider "azurerm" { +# subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" +# client_id = "REPLACE-WITH-YOUR-CLIENT-ID" +# client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" +# tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" +# } diff --git a/examples/azure-vm-from-user-image/provider.tf.example b/examples/azure-vm-from-user-image/provider.tf.example deleted file mode 100644 index a0b5e46772f5..000000000000 --- a/examples/azure-vm-from-user-image/provider.tf.example +++ /dev/null @@ -1,6 +0,0 @@ -provider "azurerm" { - subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" - client_id = "REPLACE-WITH-YOUR-CLIENT-ID" - client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" - tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" -} diff --git a/examples/azure-vm-from-user-image/terraform.tfvars.example b/examples/azure-vm-from-user-image/terraform.tfvars similarity index 92% rename from examples/azure-vm-from-user-image/terraform.tfvars.example rename to examples/azure-vm-from-user-image/terraform.tfvars index 6cc72c9218be..d217db2f7a0a 100644 --- a/examples/azure-vm-from-user-image/terraform.tfvars.example +++ b/examples/azure-vm-from-user-image/terraform.tfvars @@ -10,4 +10,4 @@ storage_account_type = "Standard_LRS" vm_size = "Standard_DS1_v2" hostname = "HOSTNAME" admin_username = "vmadmin" -admin_password = "T3rr@f0rmP@ssword" \ No newline at end of file +admin_password = "YOURPASSWORDHERE" From 6bf2df2d6608eddf3c8707c848dab418927393f5 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Wed, 26 Apr 2017 10:54:22 -0500 Subject: [PATCH 19/77] updated README --- examples/azure-vm-from-user-image/README.md | 78 ++------------------- 1 file changed, 7 insertions(+), 71 deletions(-) diff --git a/examples/azure-vm-from-user-image/README.md b/examples/azure-vm-from-user-image/README.md index f391b0b8f40f..455b0bcb1a5f 100644 --- a/examples/azure-vm-from-user-image/README.md +++ b/examples/azure-vm-from-user-image/README.md @@ -1,8 +1,7 @@ # [Create a Virtual Machine from a User Image](https://docs.microsoft.com/en-us/azure/virtual-machines/linux/cli-deploy-templates#create-a-custom-vm-image) - - - +This Terraform template was based on [this](https://github.com/Azure/azure-quickstart-templates/tree/master/101-vm-from-user-image) Azure Quickstart Template. Changes to the ARM template may have occured since the creation of this example may not be reflected here. + @@ -11,64 +10,8 @@ This template allows you to create a Virtual Machine from an unmanaged User image vhd. This template also deploys a Virtual Network, Public IP addresses and a Network Interface. -If you are looking to accomplish the above scenario through PowerShell instead of a template, you can use a PowerShell script like below - -##### Variables - ## Global - $rgName = "testrg" - $location = "westus" - - ## Storage - $storageName = "teststore" - $storageType = "Standard_GRS" - - ## Network - $nicname = "testnic" - $subnet1Name = "subnet1" - $vnetName = "testnet" - $vnetAddressPrefix = "10.0.0.0/16" - $vnetSubnetAddressPrefix = "10.0.0.0/24" - - ## Compute - $vmName = "testvm" - $computerName = "testcomputer" - $vmSize = "Standard_A2" - $osDiskName = $vmName + "osDisk" - -##### Resource Group - New-AzureRmResourceGroup -Name $rgName -Location $location - -##### Storage - $storageacc = New-AzureRmStorageAccount -ResourceGroupName $rgName -Name $storageName -Type $storageType -Location $location - -##### Network - $pip = New-AzureRmPublicIpAddress -Name $nicname -ResourceGroupName $rgName -Location $location -AllocationMethod Dynamic - $subnetconfig = New-AzureRmVirtualNetworkSubnetConfig -Name $subnet1Name -AddressPrefix $vnetSubnetAddressPrefix - $vnet = New-AzureRmVirtualNetwork -Name $vnetName -ResourceGroupName $rgName -Location $location -AddressPrefix $vnetAddressPrefix -Subnet $subnetconfig - $nic = New-AzureRmNetworkInterface -Name $nicname -ResourceGroupName $rgName -Location $location -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id - -##### Compute - ## Setup local VM object - $cred = Get-Credential - $vm = New-AzureRmVMConfig -VMName $vmName -VMSize $vmSize - $vm = Set-AzureRmVMOperatingSystem -VM $vm -Windows -ComputerName $computerName -Credential $cred -ProvisionVMAgent -EnableAutoUpdate - - $vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic.Id - - $osDiskUri = "http://test.blob.core.windows.net/vmcontainer10798c80-131-1231-a94a-f9d2a712251f/osDisk.10798c80-2919-4100-a94a-f9d2a712251f.vhd" - $imageUri = "http://test.blob.core.windows.net/system/Microsoft.Compute/Images/captured/image-osDisk.8b021d87-913c-4f94-a01a-944ad92d7388.vhd" - $vm = Set-AzureRmVMOSDisk -VM $vm -Name $osDiskName -VhdUri $osDiskUri -CreateOption fromImage -SourceImageUri $imageUri -Windows - - $dataImageUri = "http://test.blob.core.windows.net/system/Microsoft.Compute/Images/captured/image-dataDisk-0.8b021d87-913c-4f94-a01a-944ad92d7388.vhd" - $dataDiskUri = "http://test.blob.core.windows.net/vmcontainer10798c80-sa11-41sa-dsad-f9d2a712251f/dataDisk-0.10798c80-2919-4100-a94a-f9d2a712251f.vhd" - $vm = Add-AzureRmVMDataDisk -VM $vm -Name "dd1" -VhdUri $dataDiskUri -SourceImageUri $dataImageUri -Lun 0 -CreateOption fromImage - - ## Create the VM in Azure - New-AzureRmVM -ResourceGroupName $rgName -Location $location -VM $vm -Verbose - - -## azuredeploy.tf -The `azuredeploy.tf` file contains the actual resources that will be deployed. It also contains the Azure Resource Group definition and any defined variables. +## main.tf +The `main.tf` file contains the actual resources that will be deployed. It also contains the Azure Resource Group definition and any defined variables. ## outputs.tf This data is outputted when `terraform apply` is called, and can be queried using the `terraform output` command. @@ -77,16 +20,9 @@ This data is outputted when `terraform apply` is called, and can be queried usin Azure requires that an application is added to Azure Active Directory to generate the `client_id`, `client_secret`, and `tenant_id` needed by Terraform (`subscription_id` can be recovered from your Azure account details). Please go [here](https://www.terraform.io/docs/providers/azurerm/) for full instructions on how to create this to populate your `provider.tf` file. ## terraform.tfvars -If a `terraform.tfvars` file is present in the current directory, Terraform automatically loads it to populate variables. We don't recommend saving usernames and password to version control, but you can create a local secret variables file and use `-var-file` to load it. +If a `terraform.tfvars` file is present in the current directory, Terraform automatically loads it to populate variables. We don't recommend saving usernames and password to version control, but you can create a local secret variables file and use `-var-file` to load it. + +If you are committing this template to source control, please insure that you add this file to your `.gitignore` file. ## variables.tf The `variables.tf` file contains all of the input parameters that the user can specify when deploying this Terraform template. - -## .gitignore -If you are committing this template to source control, please insure that the following files are added to your `.gitignore` file. - -``` -terraform.tfstate* -terraform.tfvars* -provider.tf* -``` From b22cff0d170f72e8f098f85d77daf1ac129f7df3 Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Wed, 26 Apr 2017 10:54:32 -0500 Subject: [PATCH 20/77] commented out variables in terraform.tfvars --- .../azure-vm-from-user-image/terraform.tfvars | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/examples/azure-vm-from-user-image/terraform.tfvars b/examples/azure-vm-from-user-image/terraform.tfvars index d217db2f7a0a..15da2a9c6ca7 100644 --- a/examples/azure-vm-from-user-image/terraform.tfvars +++ b/examples/azure-vm-from-user-image/terraform.tfvars @@ -1,13 +1,13 @@ -resource_group = "myresourcegroup" -image_uri = "https://DISK.blob.core.windows.net/vhds/ORIGINAL-VM.vhd" -primary_blob_endpoint = "https://DISK.blob.core.windows.net/" -location = "southcentralus" -os_type = "linux" -address_space = "10.0.0.0/16" -subnet_prefix = "10.0.0.0/24" -storage_account_name = "STOR-ACCT-NAME" -storage_account_type = "Standard_LRS" -vm_size = "Standard_DS1_v2" -hostname = "HOSTNAME" -admin_username = "vmadmin" -admin_password = "YOURPASSWORDHERE" +# resource_group = "myresourcegroup" +# image_uri = "https://DISK.blob.core.windows.net/vhds/ORIGINAL-VM.vhd" +# primary_blob_endpoint = "https://DISK.blob.core.windows.net/" +# location = "southcentralus" +# os_type = "linux" +# address_space = "10.0.0.0/16" +# subnet_prefix = "10.0.0.0/24" +# storage_account_name = "STOR-ACCT-NAME" +# storage_account_type = "Standard_LRS" +# vm_size = "Standard_DS1_v2" +# hostname = "HOSTNAME" +# admin_username = "vmadmin" +# admin_password = "YOURPASSWORDHERE" From 0843f451307b4c2a9740c5a9dcba0c0adda69f7c Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Wed, 26 Apr 2017 16:14:34 -0500 Subject: [PATCH 21/77] Topic 101 vm from user image (#2) * initial commit - 101-vm-from-user-image * added tfvars and info for README * added CI config; added sane defaults for variables; updated deployment script, added mac specific deployment for local testing * prep for PR --- .travis.yml | 15 +++-- examples/azure-vm-from-user-image/README.md | 28 +++++++++ .../azure-vm-from-user-image/after_deploy.sh | 11 ++++ .../azure-vm-from-user-image/deploy.mac.sh | 12 ++++ examples/azure-vm-from-user-image/deploy.sh | 37 +++++++++++ examples/azure-vm-from-user-image/main.tf | 62 +++++++++++++++++++ examples/azure-vm-from-user-image/outputs.tf | 11 ++++ examples/azure-vm-from-user-image/provider.tf | 6 ++ .../azure-vm-from-user-image/terraform.tfvars | 13 ++++ .../azure-vm-from-user-image/variables.tf | 56 +++++++++++++++++ 10 files changed, 247 insertions(+), 4 deletions(-) create mode 100644 examples/azure-vm-from-user-image/README.md create mode 100755 examples/azure-vm-from-user-image/after_deploy.sh create mode 100755 examples/azure-vm-from-user-image/deploy.mac.sh create mode 100755 examples/azure-vm-from-user-image/deploy.sh create mode 100644 examples/azure-vm-from-user-image/main.tf create mode 100644 examples/azure-vm-from-user-image/outputs.tf create mode 100644 examples/azure-vm-from-user-image/provider.tf create mode 100644 examples/azure-vm-from-user-image/terraform.tfvars create mode 100644 examples/azure-vm-from-user-image/variables.tf diff --git a/.travis.yml b/.travis.yml index 688b223f7a98..b559eea4327c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,18 +5,25 @@ services: language: generic +# on branches: ignore multiple commits that will queue build jobs, just run latest commit +git: + depth: 1 + # establish environment variables env: - - TEST_DIR=examples/azure-vm-simple-linux + - TEST_DIR=examples/azure-vm-from-user-image branches: only: - - master + - /^(?i:topic)-.*$/ # install terraform before_deploy: - export KEY=$(cat /dev/urandom | tr -cd 'a-z' | head -c 12) - export PASSWORD=$KEY$(cat /dev/urandom | tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | tr -cd '0-9' | head -c 2) + - export EXISTING_IMAGE_URI=https://permanentstor.blob.core.windows.net/permanent-vhds/permanent-osdisk1.vhd + - export EXISTING_STORAGE_ACCOUNT_NAME=permanentstor + - export EXISTING_RESOURCE_GROUP=permanent # terraform deploy script deploy: @@ -25,7 +32,7 @@ deploy: script: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./deploy.sh on: repo: 10thmagnitude/terraform - branch: master + branch: topic-101-vm-from-user-image -# destroy resources with Azure CLI +# cleanup after_deploy: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./after_deploy.sh diff --git a/examples/azure-vm-from-user-image/README.md b/examples/azure-vm-from-user-image/README.md new file mode 100644 index 000000000000..455b0bcb1a5f --- /dev/null +++ b/examples/azure-vm-from-user-image/README.md @@ -0,0 +1,28 @@ +# [Create a Virtual Machine from a User Image](https://docs.microsoft.com/en-us/azure/virtual-machines/linux/cli-deploy-templates#create-a-custom-vm-image) + +This Terraform template was based on [this](https://github.com/Azure/azure-quickstart-templates/tree/master/101-vm-from-user-image) Azure Quickstart Template. Changes to the ARM template may have occured since the creation of this example may not be reflected here. + + + + + +> Prerequisite - The generalized image VHD should exist, as well as a Storage Account for boot diagnostics + +This template allows you to create a Virtual Machine from an unmanaged User image vhd. This template also deploys a Virtual Network, Public IP addresses and a Network Interface. + +## main.tf +The `main.tf` file contains the actual resources that will be deployed. It also contains the Azure Resource Group definition and any defined variables. + +## outputs.tf +This data is outputted when `terraform apply` is called, and can be queried using the `terraform output` command. + +## provider.tf +Azure requires that an application is added to Azure Active Directory to generate the `client_id`, `client_secret`, and `tenant_id` needed by Terraform (`subscription_id` can be recovered from your Azure account details). Please go [here](https://www.terraform.io/docs/providers/azurerm/) for full instructions on how to create this to populate your `provider.tf` file. + +## terraform.tfvars +If a `terraform.tfvars` file is present in the current directory, Terraform automatically loads it to populate variables. We don't recommend saving usernames and password to version control, but you can create a local secret variables file and use `-var-file` to load it. + +If you are committing this template to source control, please insure that you add this file to your `.gitignore` file. + +## variables.tf +The `variables.tf` file contains all of the input parameters that the user can specify when deploying this Terraform template. diff --git a/examples/azure-vm-from-user-image/after_deploy.sh b/examples/azure-vm-from-user-image/after_deploy.sh new file mode 100755 index 000000000000..8a5624eb7681 --- /dev/null +++ b/examples/azure-vm-from-user-image/after_deploy.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +set -o errexit -o nounset + +docker run --rm -it \ + azuresdk/azure-cli-python \ + sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ + az vm delete --name $KEY --resource-group permanent -y; \ + az network nic delete --name $KEY'nic' --resource-group permanent; \ + az network vnet delete --name $KEY'vnet' --resource-group permanent; \ + az network public-ip delete --name $KEY'-ip' --resource-group permanent;" diff --git a/examples/azure-vm-from-user-image/deploy.mac.sh b/examples/azure-vm-from-user-image/deploy.mac.sh new file mode 100755 index 000000000000..eb2808ef5502 --- /dev/null +++ b/examples/azure-vm-from-user-image/deploy.mac.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +set -o errexit -o nounset + +# generate a unique string for CI deployment +export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) +export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) +export EXISTING_IMAGE_URI=https://permanentstor.blob.core.windows.net/permanent-vhds/permanent-osdisk1.vhd +export EXISTING_STORAGE_ACCOUNT_NAME=permanentstor +export EXISTING_RESOURCE_GROUP=permanent + +/bin/sh ./after_deploy.sh diff --git a/examples/azure-vm-from-user-image/deploy.sh b/examples/azure-vm-from-user-image/deploy.sh new file mode 100755 index 000000000000..2558ebce5ff1 --- /dev/null +++ b/examples/azure-vm-from-user-image/deploy.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +set -o errexit -o nounset + +docker run --rm -it \ + -e ARM_CLIENT_ID \ + -e ARM_CLIENT_SECRET \ + -e ARM_SUBSCRIPTION_ID \ + -e ARM_TENANT_ID \ + -v $(pwd):/data \ + --entrypoint "/bin/sh" \ + hashicorp/terraform:light \ + -c "cd /data; \ + /bin/terraform get; \ + /bin/terraform validate; \ + /bin/terraform plan -out=out.tfplan -var hostname=$KEY -var resource_group=$EXISTING_RESOURCE_GROUP -var admin_username=$KEY -var admin_password=$PASSWORD -var image_uri=$EXISTING_IMAGE_URI -var storage_account_name=$EXISTING_STORAGE_ACCOUNT_NAME; \ + /bin/terraform apply out.tfplan" + +# echo "Setting git user name" +# git config user.name $GH_USER_NAME +# +# echo "Setting git user email" +# git config user.email $GH_USER_EMAIL +# +# echo "Adding git upstream remote" +# git remote add upstream "https://$GH_TOKEN@github.com/$GH_REPO.git" +# +# git checkout master + + +# +# NOW=$(TZ=America/Chicago date) +# +# git commit -m "tfstate: $NOW [ci skip]" +# +# echo "Pushing changes to upstream master" +# git push upstream master diff --git a/examples/azure-vm-from-user-image/main.tf b/examples/azure-vm-from-user-image/main.tf new file mode 100644 index 000000000000..28edf99204b5 --- /dev/null +++ b/examples/azure-vm-from-user-image/main.tf @@ -0,0 +1,62 @@ +resource "azurerm_resource_group" "rg" { + name = "${var.resource_group}" + location = "${var.location}" +} + +resource "azurerm_virtual_network" "vnet" { + name = "${var.hostname}vnet" + location = "${var.location}" + address_space = ["${var.address_space}"] + resource_group_name = "${azurerm_resource_group.rg.name}" +} + +resource "azurerm_subnet" "subnet" { + name = "${var.hostname}subnet" + virtual_network_name = "${azurerm_virtual_network.vnet.name}" + resource_group_name = "${azurerm_resource_group.rg.name}" + address_prefix = "${var.subnet_prefix}" +} + +resource "azurerm_network_interface" "nic" { + name = "${var.hostname}nic" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + + ip_configuration { + name = "${var.hostname}ipconfig" + subnet_id = "${azurerm_subnet.subnet.id}" + private_ip_address_allocation = "Dynamic" + public_ip_address_id = "${azurerm_public_ip.pip.id}" + } +} + +resource "azurerm_public_ip" "pip" { + name = "${var.hostname}-ip" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + public_ip_address_allocation = "dynamic" + domain_name_label = "${var.hostname}" +} + +resource "azurerm_virtual_machine" "vm" { + name = "${var.hostname}" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + vm_size = "${var.vm_size}" + network_interface_ids = ["${azurerm_network_interface.nic.id}"] + + storage_os_disk { + name = "${var.hostname}-osdisk1" + image_uri = "${var.image_uri}" + vhd_uri = "https://${var.storage_account_name}.blob.core.windows.net/vhds/${var.hostname}osdisk.vhd" + os_type = "${var.os_type}" + caching = "ReadWrite" + create_option = "FromImage" + } + + os_profile { + computer_name = "${var.hostname}" + admin_username = "${var.admin_username}" + admin_password = "${var.admin_password}" + } +} diff --git a/examples/azure-vm-from-user-image/outputs.tf b/examples/azure-vm-from-user-image/outputs.tf new file mode 100644 index 000000000000..e0e255a9e01c --- /dev/null +++ b/examples/azure-vm-from-user-image/outputs.tf @@ -0,0 +1,11 @@ +output "hostname" { + value = "${var.hostname}" +} + +output "vm_fqdn" { + value = "${azurerm_public_ip.pip.fqdn}" +} + +output "sshCommand" { + value = "${concat("ssh ", var.admin_username, "@", azurerm_public_ip.pip.fqdn)}" +} diff --git a/examples/azure-vm-from-user-image/provider.tf b/examples/azure-vm-from-user-image/provider.tf new file mode 100644 index 000000000000..bdf0583f3259 --- /dev/null +++ b/examples/azure-vm-from-user-image/provider.tf @@ -0,0 +1,6 @@ +# provider "azurerm" { +# subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" +# client_id = "REPLACE-WITH-YOUR-CLIENT-ID" +# client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" +# tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" +# } diff --git a/examples/azure-vm-from-user-image/terraform.tfvars b/examples/azure-vm-from-user-image/terraform.tfvars new file mode 100644 index 000000000000..15da2a9c6ca7 --- /dev/null +++ b/examples/azure-vm-from-user-image/terraform.tfvars @@ -0,0 +1,13 @@ +# resource_group = "myresourcegroup" +# image_uri = "https://DISK.blob.core.windows.net/vhds/ORIGINAL-VM.vhd" +# primary_blob_endpoint = "https://DISK.blob.core.windows.net/" +# location = "southcentralus" +# os_type = "linux" +# address_space = "10.0.0.0/16" +# subnet_prefix = "10.0.0.0/24" +# storage_account_name = "STOR-ACCT-NAME" +# storage_account_type = "Standard_LRS" +# vm_size = "Standard_DS1_v2" +# hostname = "HOSTNAME" +# admin_username = "vmadmin" +# admin_password = "YOURPASSWORDHERE" diff --git a/examples/azure-vm-from-user-image/variables.tf b/examples/azure-vm-from-user-image/variables.tf new file mode 100644 index 000000000000..b3e94928978d --- /dev/null +++ b/examples/azure-vm-from-user-image/variables.tf @@ -0,0 +1,56 @@ +variable "resource_group" { + description = "The name of the resource group in which the image to clone resides." + default = "myrg" +} + +variable "image_uri" { + description = "Specifies the image_uri in the form publisherName:offer:skus:version. image_uri can also specify the VHD uri of a custom VM image to clone." +} + +variable "os_type" { + description = "Specifies the operating system Type, valid values are windows, linux." + default = "linux" +} + +variable "location" { + description = "The location/region where the virtual network is created. Changing this forces a new resource to be created." + default = "southcentralus" +} + +variable "address_space" { + description = "The address space that is used by the virtual network. You can supply more than one address space. Changing this forces a new resource to be created." + default = "10.0.0.0/24" +} + +variable "subnet_prefix" { + description = "The address prefix to use for the subnet." + default = "10.0.0.0/24" +} + +variable "storage_account_name" { + description = "The name of the storage account in which the image from which you are cloning resides." +} + +variable "storage_account_type" { + description = "Defines the type of storage account to be created. Valid options are Standard_LRS, Standard_ZRS, Standard_GRS, Standard_RAGRS, Premium_LRS. Changing this is sometimes valid - see the Azure documentation for more information on which types of accounts can be converted into other types." + default = "Premium_LRS" +} + +variable "vm_size" { + description = "Specifies the size of the virtual machine. This must be the same as the vm image from which you are copying." + default = "Standard_DS1_v2" +} + +variable "hostname" { + description = "VM name referenced also in storage-related names. This is also used as the label for the Domain Name and to make up the FQDN. If a domain name label is specified, an A DNS record is created for the public IP in the Microsoft Azure DNS system." +} + +variable "admin_username" { + description = "administrator user name" + default = "vmadmin" +} + +variable "admin_password" { + description = "administrator password (recommended to disable password auth)" + default = "T3rr@f0rmP@ssword" +} From 49caea553c384dc44f0d367c21bf7a2b1274df2c Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Wed, 26 Apr 2017 16:29:11 -0500 Subject: [PATCH 22/77] added new template --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b559eea4327c..9412e69721ff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,7 @@ git: # establish environment variables env: + - TEST_DIR=examples/azure-vm-simple-linux - TEST_DIR=examples/azure-vm-from-user-image branches: @@ -32,7 +33,7 @@ deploy: script: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./deploy.sh on: repo: 10thmagnitude/terraform - branch: topic-101-vm-from-user-image + branch: master # cleanup after_deploy: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./after_deploy.sh From 2236828c1f0d3231cb4d86a49213ba141f769bab Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Wed, 26 Apr 2017 16:37:46 -0500 Subject: [PATCH 23/77] oops, left off master --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 9412e69721ff..af6a783e4aa3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,6 +16,7 @@ env: branches: only: + - master - /^(?i:topic)-.*$/ # install terraform From 7f8fe25583bd941ec3ce1a0fa79eb557ed97a4bf Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Wed, 26 Apr 2017 19:09:46 -0500 Subject: [PATCH 24/77] prep for PR --- examples/azure-vm-simple-linux/.gitignore | 3 - examples/azure-vm-simple-linux/README.md | 36 ------ .../azure-vm-simple-linux/after_deploy.sh | 9 -- examples/azure-vm-simple-linux/deploy.mac.sh | 14 --- examples/azure-vm-simple-linux/deploy.sh | 17 --- examples/azure-vm-simple-linux/main.tf | 112 ------------------ examples/azure-vm-simple-linux/outputs.tf | 11 -- .../azure-vm-simple-linux/provider.tf.example | 6 - .../terraform.tfvars.example | 6 - examples/azure-vm-simple-linux/variables.tf | 75 ------------ 10 files changed, 289 deletions(-) delete mode 100644 examples/azure-vm-simple-linux/.gitignore delete mode 100644 examples/azure-vm-simple-linux/README.md delete mode 100755 examples/azure-vm-simple-linux/after_deploy.sh delete mode 100755 examples/azure-vm-simple-linux/deploy.mac.sh delete mode 100755 examples/azure-vm-simple-linux/deploy.sh delete mode 100644 examples/azure-vm-simple-linux/main.tf delete mode 100644 examples/azure-vm-simple-linux/outputs.tf delete mode 100644 examples/azure-vm-simple-linux/provider.tf.example delete mode 100644 examples/azure-vm-simple-linux/terraform.tfvars.example delete mode 100644 examples/azure-vm-simple-linux/variables.tf diff --git a/examples/azure-vm-simple-linux/.gitignore b/examples/azure-vm-simple-linux/.gitignore deleted file mode 100644 index 7773fa9ecc5d..000000000000 --- a/examples/azure-vm-simple-linux/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -terraform.tfstate* -terraform.tfvars -provider.tf diff --git a/examples/azure-vm-simple-linux/README.md b/examples/azure-vm-simple-linux/README.md deleted file mode 100644 index a0ab5f63451e..000000000000 --- a/examples/azure-vm-simple-linux/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# Very simple deployment of a Linux VM - - - - - - - - -This template allows you to deploy a simple Linux VM using a few different options for the Ubuntu version, using the latest patched version. This will deploy a A1 size VM in the resource group location and return the FQDN of the VM. - -This template takes a minimum amount of parameters and deploys a Linux VM, using the latest patched version. - -## main.tf -The `main.tf` file contains the actual resources that will be deployed. It also contains the Azure Resource Group definition and any defined variables. - -## outputs.tf -This data is outputted when `terraform apply` is called, and can be queried using the `terraform output` command. - -## provider.tf -Azure requires that an application is added to Azure Active Directory to generate the `client_id`, `client_secret`, and `tenant_id` needed by Terraform (`subscription_id` can be recovered from your Azure account details). Please go [here](https://www.terraform.io/docs/providers/azurerm/) for full instructions on how to create this to populate your `provider.tf` file. - -## terraform.tfvars -If a `terraform.tfvars` file is present in the current directory, Terraform automatically loads it to populate variables. We don't recommend saving usernames and password to version control, but you can create a local secret variables file and use `-var-file` to load it. - -## variables.tf -The `variables.tf` file contains all of the input parameters that the user can specify when deploying this Terraform template. - -## .gitignore -If you are committing this template to source control, please insure that the following files are added to your `.gitignore` file. - -``` -terraform.tfstate* -terraform.tfvars -provider.tf* -``` \ No newline at end of file diff --git a/examples/azure-vm-simple-linux/after_deploy.sh b/examples/azure-vm-simple-linux/after_deploy.sh deleted file mode 100755 index 245aba38045e..000000000000 --- a/examples/azure-vm-simple-linux/after_deploy.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -set -o errexit -o nounset - -# cleanup deployed azure resources -docker run --rm -it \ - azuresdk/azure-cli-python \ - sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ - az group delete -y -n $KEY" diff --git a/examples/azure-vm-simple-linux/deploy.mac.sh b/examples/azure-vm-simple-linux/deploy.mac.sh deleted file mode 100755 index f0bb60f8bb8b..000000000000 --- a/examples/azure-vm-simple-linux/deploy.mac.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -set -o errexit -o nounset - -# generate a unique string for CI deployment -export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) -export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) - -/bin/sh ./deploy.sh - -# docker run --rm -it \ -# azuresdk/azure-cli-python \ -# sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ -# az group delete -y -n $KEY" diff --git a/examples/azure-vm-simple-linux/deploy.sh b/examples/azure-vm-simple-linux/deploy.sh deleted file mode 100755 index 5347f3a838c6..000000000000 --- a/examples/azure-vm-simple-linux/deploy.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -set -o errexit -o nounset - -docker run --rm -it \ - -e ARM_CLIENT_ID \ - -e ARM_CLIENT_SECRET \ - -e ARM_SUBSCRIPTION_ID \ - -e ARM_TENANT_ID \ - -v $(pwd):/data \ - --entrypoint "/bin/sh" \ - hashicorp/terraform:light \ - -c "cd /data; \ - /bin/terraform get; \ - /bin/terraform validate; \ - /bin/terraform plan -out=out.tfplan -var dns_name=$KEY -var hostname=$KEY -var resource_group=$KEY -var admin_password=$PASSWORD; \ - /bin/terraform apply out.tfplan" diff --git a/examples/azure-vm-simple-linux/main.tf b/examples/azure-vm-simple-linux/main.tf deleted file mode 100644 index cf931d0f9e4e..000000000000 --- a/examples/azure-vm-simple-linux/main.tf +++ /dev/null @@ -1,112 +0,0 @@ -resource "azurerm_resource_group" "rg" { - name = "${var.resource_group}" - location = "${var.location}" -} - -resource "azurerm_virtual_network" "vnet" { - name = "${var.virtual_network_name}" - location = "${var.location}" - address_space = ["${var.address_space}"] - resource_group_name = "${azurerm_resource_group.rg.name}" -} - -resource "azurerm_subnet" "subnet" { - name = "${var.rg_prefix}subnet" - virtual_network_name = "${azurerm_virtual_network.vnet.name}" - resource_group_name = "${azurerm_resource_group.rg.name}" - address_prefix = "${var.subnet_prefix}" -} - -resource "azurerm_network_interface" "nic" { - name = "${var.rg_prefix}nic" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - - ip_configuration { - name = "${var.rg_prefix}ipconfig" - subnet_id = "${azurerm_subnet.subnet.id}" - private_ip_address_allocation = "Dynamic" - public_ip_address_id = "${azurerm_public_ip.pip.id}" - } -} - -resource "azurerm_public_ip" "pip" { - name = "${var.rg_prefix}-ip" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - public_ip_address_allocation = "dynamic" - domain_name_label = "${var.dns_name}" -} - -resource "azurerm_storage_account" "stor" { - name = "${var.dns_name}stor" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - account_type = "${var.storage_account_type}" -} - -resource "azurerm_storage_container" "storc" { - name = "${var.hostname}-vhds" - resource_group_name = "${azurerm_resource_group.rg.name}" - storage_account_name = "${azurerm_storage_account.stor.name}" - container_access_type = "private" -} - -resource "azurerm_managed_disk" "disk1" { - name = "${var.hostname}-osdisk1" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - storage_account_type = "Standard_LRS" - create_option = "Empty" - disk_size_gb = "30" -} - -resource "azurerm_managed_disk" "disk2" { - name = "${var.hostname}-disk2" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - storage_account_type = "Standard_LRS" - create_option = "Empty" - disk_size_gb = "1023" -} - -resource "azurerm_virtual_machine" "vm" { - name = "${var.rg_prefix}vm" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - vm_size = "${var.vm_size}" - network_interface_ids = ["${azurerm_network_interface.nic.id}"] - - storage_image_reference { - publisher = "${var.image_publisher}" - offer = "${var.image_offer}" - sku = "${var.image_sku}" - version = "${var.image_version}" - } - - storage_os_disk { - name = "${var.hostname}-osdisk1" - vhd_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}${azurerm_storage_container.storc.name}/${var.hostname}-osdisk1.vhd" - caching = "ReadWrite" - create_option = "FromImage" - } - - storage_data_disk { - name = "${var.hostname}-disk2" - vhd_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}${azurerm_storage_container.storc.name}/${var.hostname}-disk2.vhd" - disk_size_gb = "1023" - create_option = "Empty" - lun = 0 - } - - os_profile { - computer_name = "${var.hostname}" - admin_username = "${var.admin_username}" - admin_password = "${var.admin_password}" - } - - boot_diagnostics { - enabled = "true" - storage_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}" - } -} diff --git a/examples/azure-vm-simple-linux/outputs.tf b/examples/azure-vm-simple-linux/outputs.tf deleted file mode 100644 index 9e3c2f0712bc..000000000000 --- a/examples/azure-vm-simple-linux/outputs.tf +++ /dev/null @@ -1,11 +0,0 @@ -output "hostname" { - value = "${var.hostname}" -} - -output "vm_fqdn" { - value = "${azurerm_public_ip.pip.fqdn}" -} - -output "sshCommand" { - value = "ssh ${var.admin_username}@${azurerm_public_ip.pip.fqdn}" -} diff --git a/examples/azure-vm-simple-linux/provider.tf.example b/examples/azure-vm-simple-linux/provider.tf.example deleted file mode 100644 index 327ceb55eefa..000000000000 --- a/examples/azure-vm-simple-linux/provider.tf.example +++ /dev/null @@ -1,6 +0,0 @@ -provider "azurerm" { - subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" - client_id = "REPLACE-WITH-YOUR-CLIENT-ID" - client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" - tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" -} \ No newline at end of file diff --git a/examples/azure-vm-simple-linux/terraform.tfvars.example b/examples/azure-vm-simple-linux/terraform.tfvars.example deleted file mode 100644 index 262093ba52f9..000000000000 --- a/examples/azure-vm-simple-linux/terraform.tfvars.example +++ /dev/null @@ -1,6 +0,0 @@ -resource_group = "myresourcegroup" -rg_prefix = "rg" -hostname = "myvm" -dns_name = "mydnsname" -location = "southcentralus" -admin_password = "T3rr@f0rmP@ssword" diff --git a/examples/azure-vm-simple-linux/variables.tf b/examples/azure-vm-simple-linux/variables.tf deleted file mode 100644 index 6d65a0277060..000000000000 --- a/examples/azure-vm-simple-linux/variables.tf +++ /dev/null @@ -1,75 +0,0 @@ -variable "resource_group" { - description = "The name of the resource group in which to create the virtual network." -} - -variable "rg_prefix" { - description = "The shortened abbreviation to represent your resource group that will go on the front of some resources." - default = "rg" -} - -variable "hostname" { - description = "VM name referenced also in storage-related names." -} - -variable "dns_name" { - description = " Label for the Domain Name. Will be used to make up the FQDN. If a domain name label is specified, an A DNS record is created for the public IP in the Microsoft Azure DNS system." -} - -variable "location" { - description = "The location/region where the virtual network is created. Changing this forces a new resource to be created." - default = "southcentralus" -} - -variable "virtual_network_name" { - description = "The name for the virtual network." - default = "vnet" -} - -variable "address_space" { - description = "The address space that is used by the virtual network. You can supply more than one address space. Changing this forces a new resource to be created." - default = "10.0.0.0/16" -} - -variable "subnet_prefix" { - description = "The address prefix to use for the subnet." - default = "10.0.10.0/24" -} - -variable "storage_account_type" { - description = "Specifies the name of the storage account. Changing this forces a new resource to be created. This must be unique across the entire Azure service, not just within the resource group." - default = "Standard_LRS" -} - -variable "vm_size" { - description = "Specifies the name of the virtual machine resource. Changing this forces a new resource to be created." - default = "Standard_A0" -} - -variable "image_publisher" { - description = "name of the publisher of the image (az vm image list)" - default = "Canonical" -} - -variable "image_offer" { - description = "the name of the offer (az vm image list)" - default = "UbuntuServer" -} - -variable "image_sku" { - description = "image sku to apply (az vm image list)" - default = "16.04-LTS" -} - -variable "image_version" { - description = "version of the image to apply (az vm image list)" - default = "latest" -} - -variable "admin_username" { - description = "administrator user name" - default = "vmadmin" -} - -variable "admin_password" { - description = "administrator password (recommended to disable password auth)" -} From eecb2d2bd2ccd793fecfac7b4628388febf7e035 Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Wed, 26 Apr 2017 20:50:48 -0500 Subject: [PATCH 25/77] correct repository for destination --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 875765d83b66..544b49bb33f5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,7 +33,7 @@ deploy: skip_cleanup: true script: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./deploy.sh on: - repo: 10thmagnitude/terraform + repo: harijayms/terraform branch: master # cleanup From 92e341d38bca428ada134091b262ad6937ff4d2f Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Wed, 26 Apr 2017 21:38:23 -0500 Subject: [PATCH 26/77] renamed scripts to be more intuitive; added check for docker --- .travis.yml | 4 ++-- .../{after_deploy.sh => after_deploy.ci.sh} | 0 .../{deploy.sh => deploy.ci.sh} | 4 ++-- .../azure-vm-from-user-image/deploy.mac.sh | 22 ++++++++++++------- 4 files changed, 18 insertions(+), 12 deletions(-) rename examples/azure-vm-from-user-image/{after_deploy.sh => after_deploy.ci.sh} (100%) rename examples/azure-vm-from-user-image/{deploy.sh => deploy.ci.sh} (95%) diff --git a/.travis.yml b/.travis.yml index 544b49bb33f5..2e9151fa24c4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,10 +31,10 @@ before_deploy: deploy: - provider: script skip_cleanup: true - script: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./deploy.sh + script: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./deploy.ci.sh on: repo: harijayms/terraform branch: master # cleanup -after_deploy: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./after_deploy.sh +after_deploy: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./after_deploy.ci.sh diff --git a/examples/azure-vm-from-user-image/after_deploy.sh b/examples/azure-vm-from-user-image/after_deploy.ci.sh similarity index 100% rename from examples/azure-vm-from-user-image/after_deploy.sh rename to examples/azure-vm-from-user-image/after_deploy.ci.sh diff --git a/examples/azure-vm-from-user-image/deploy.sh b/examples/azure-vm-from-user-image/deploy.ci.sh similarity index 95% rename from examples/azure-vm-from-user-image/deploy.sh rename to examples/azure-vm-from-user-image/deploy.ci.sh index 2558ebce5ff1..f45c5bb2a6cd 100755 --- a/examples/azure-vm-from-user-image/deploy.sh +++ b/examples/azure-vm-from-user-image/deploy.ci.sh @@ -8,10 +8,10 @@ docker run --rm -it \ -e ARM_SUBSCRIPTION_ID \ -e ARM_TENANT_ID \ -v $(pwd):/data \ + --workdir=/data \ --entrypoint "/bin/sh" \ hashicorp/terraform:light \ - -c "cd /data; \ - /bin/terraform get; \ + -c "/bin/terraform get; \ /bin/terraform validate; \ /bin/terraform plan -out=out.tfplan -var hostname=$KEY -var resource_group=$EXISTING_RESOURCE_GROUP -var admin_username=$KEY -var admin_password=$PASSWORD -var image_uri=$EXISTING_IMAGE_URI -var storage_account_name=$EXISTING_STORAGE_ACCOUNT_NAME; \ /bin/terraform apply out.tfplan" diff --git a/examples/azure-vm-from-user-image/deploy.mac.sh b/examples/azure-vm-from-user-image/deploy.mac.sh index eb2808ef5502..acd4ca7028fc 100755 --- a/examples/azure-vm-from-user-image/deploy.mac.sh +++ b/examples/azure-vm-from-user-image/deploy.mac.sh @@ -2,11 +2,17 @@ set -o errexit -o nounset -# generate a unique string for CI deployment -export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) -export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) -export EXISTING_IMAGE_URI=https://permanentstor.blob.core.windows.net/permanent-vhds/permanent-osdisk1.vhd -export EXISTING_STORAGE_ACCOUNT_NAME=permanentstor -export EXISTING_RESOURCE_GROUP=permanent - -/bin/sh ./after_deploy.sh +if docker -v; then + + # generate a unique string for CI deployment + export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) + export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) + export EXISTING_IMAGE_URI=https://permanentstor.blob.core.windows.net/permanent-vhds/permanent-osdisk1.vhd + export EXISTING_STORAGE_ACCOUNT_NAME=permanentstor + export EXISTING_RESOURCE_GROUP=permanent + + /bin/sh ./deploy.ci.sh + +else + echo "Docker is used to run terraform commands, please install before run: https://docs.docker.com/docker-for-mac/install/" +fi From 23627c80a8acab7b32ec66a3267f00edf08972f4 Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Wed, 26 Apr 2017 22:15:44 -0500 Subject: [PATCH 27/77] merge vm simple; vm from image --- .travis.yml | 2 +- .../README.md | 24 ++++ .../after_deploy.ci.sh | 9 ++ .../deploy.ci.sh | 17 +++ .../deploy.mac.sh | 15 +++ .../main.tf | 104 ++++++++++++++++++ .../outputs.tf | 11 ++ .../provider.tf | 7 ++ .../terraform.tfvars | 8 ++ .../variables.tf | 75 +++++++++++++ 10 files changed, 271 insertions(+), 1 deletion(-) create mode 100644 examples/azure-vm-simple-linux-managed-disk/README.md create mode 100755 examples/azure-vm-simple-linux-managed-disk/after_deploy.ci.sh create mode 100755 examples/azure-vm-simple-linux-managed-disk/deploy.ci.sh create mode 100755 examples/azure-vm-simple-linux-managed-disk/deploy.mac.sh create mode 100644 examples/azure-vm-simple-linux-managed-disk/main.tf create mode 100644 examples/azure-vm-simple-linux-managed-disk/outputs.tf create mode 100644 examples/azure-vm-simple-linux-managed-disk/provider.tf create mode 100644 examples/azure-vm-simple-linux-managed-disk/terraform.tfvars create mode 100644 examples/azure-vm-simple-linux-managed-disk/variables.tf diff --git a/.travis.yml b/.travis.yml index 2e9151fa24c4..d54a0592b1e7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,7 +33,7 @@ deploy: skip_cleanup: true script: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./deploy.ci.sh on: - repo: harijayms/terraform + repo: 10thmagnitude/terraform branch: master # cleanup diff --git a/examples/azure-vm-simple-linux-managed-disk/README.md b/examples/azure-vm-simple-linux-managed-disk/README.md new file mode 100644 index 000000000000..0492e3edccb9 --- /dev/null +++ b/examples/azure-vm-simple-linux-managed-disk/README.md @@ -0,0 +1,24 @@ +# Very simple deployment of a Linux VM + + + + + +This template allows you to deploy a simple Linux VM using a few different options for the Ubuntu version, using the latest patched version. This will deploy a A1 size VM in the resource group location and return the FQDN of the VM. + +This template takes a minimum amount of parameters and deploys a Linux VM, using the latest patched version. + +## main.tf +The `main.tf` file contains the actual resources that will be deployed. It also contains the Azure Resource Group definition and any defined variables. + +## outputs.tf +This data is outputted when `terraform apply` is called, and can be queried using the `terraform output` command. + +## provider.tf +Azure requires that an application is added to Azure Active Directory to generate the `client_id`, `client_secret`, and `tenant_id` needed by Terraform (`subscription_id` can be recovered from your Azure account details). Please go [here](https://www.terraform.io/docs/providers/azurerm/) for full instructions on how to create this to populate your `provider.tf` file. + +## terraform.tfvars +If a `terraform.tfvars` file is present in the current directory, Terraform automatically loads it to populate variables. We don't recommend saving usernames and password to version control, but you can create a local secret variables file and use `-var-file` to load it. + +## variables.tf +The `variables.tf` file contains all of the input parameters that the user can specify when deploying this Terraform template. diff --git a/examples/azure-vm-simple-linux-managed-disk/after_deploy.ci.sh b/examples/azure-vm-simple-linux-managed-disk/after_deploy.ci.sh new file mode 100755 index 000000000000..245aba38045e --- /dev/null +++ b/examples/azure-vm-simple-linux-managed-disk/after_deploy.ci.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +set -o errexit -o nounset + +# cleanup deployed azure resources +docker run --rm -it \ + azuresdk/azure-cli-python \ + sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ + az group delete -y -n $KEY" diff --git a/examples/azure-vm-simple-linux-managed-disk/deploy.ci.sh b/examples/azure-vm-simple-linux-managed-disk/deploy.ci.sh new file mode 100755 index 000000000000..8fa08573faad --- /dev/null +++ b/examples/azure-vm-simple-linux-managed-disk/deploy.ci.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +set -o errexit -o nounset + +docker run --rm -it \ + -e ARM_CLIENT_ID \ + -e ARM_CLIENT_SECRET \ + -e ARM_SUBSCRIPTION_ID \ + -e ARM_TENANT_ID \ + -v $(pwd):/data \ + --workdir=/data \ + --entrypoint "/bin/sh" \ + hashicorp/terraform:light \ + -c "/bin/terraform get; \ + /bin/terraform validate; \ + /bin/terraform plan -out=out.tfplan -var dns_name=$KEY -var hostname=$KEY -var resource_group=$KEY -var admin_password=$PASSWORD; \ + /bin/terraform apply out.tfplan" diff --git a/examples/azure-vm-simple-linux-managed-disk/deploy.mac.sh b/examples/azure-vm-simple-linux-managed-disk/deploy.mac.sh new file mode 100755 index 000000000000..9c6563f07d71 --- /dev/null +++ b/examples/azure-vm-simple-linux-managed-disk/deploy.mac.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +set -o errexit -o nounset + +if docker -v; then + + # generate a unique string for CI deployment + export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) + export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) + + /bin/sh ./deploy.ci.sh + +else + echo "Docker is used to run terraform commands, please install before run: https://docs.docker.com/docker-for-mac/install/" +fi diff --git a/examples/azure-vm-simple-linux-managed-disk/main.tf b/examples/azure-vm-simple-linux-managed-disk/main.tf new file mode 100644 index 000000000000..e9c0877d5a39 --- /dev/null +++ b/examples/azure-vm-simple-linux-managed-disk/main.tf @@ -0,0 +1,104 @@ +resource "azurerm_resource_group" "rg" { + name = "${var.resource_group}" + location = "${var.location}" +} + +resource "azurerm_virtual_network" "vnet" { + name = "${var.virtual_network_name}" + location = "${var.location}" + address_space = ["${var.address_space}"] + resource_group_name = "${azurerm_resource_group.rg.name}" +} + +resource "azurerm_subnet" "subnet" { + name = "${var.rg_prefix}subnet" + virtual_network_name = "${azurerm_virtual_network.vnet.name}" + resource_group_name = "${azurerm_resource_group.rg.name}" + address_prefix = "${var.subnet_prefix}" +} + +resource "azurerm_network_interface" "nic" { + name = "${var.rg_prefix}nic" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + + ip_configuration { + name = "${var.rg_prefix}ipconfig" + subnet_id = "${azurerm_subnet.subnet.id}" + private_ip_address_allocation = "Dynamic" + public_ip_address_id = "${azurerm_public_ip.pip.id}" + } +} + +resource "azurerm_public_ip" "pip" { + name = "${var.rg_prefix}-ip" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + public_ip_address_allocation = "dynamic" + domain_name_label = "${var.dns_name}" +} + +resource "azurerm_storage_account" "stor" { + name = "${var.dns_name}stor" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + account_type = "${var.storage_account_type}" +} + +resource "azurerm_storage_container" "storc" { + name = "${var.hostname}-vhds" + resource_group_name = "${azurerm_resource_group.rg.name}" + storage_account_name = "${azurerm_storage_account.stor.name}" + container_access_type = "private" +} + +resource "azurerm_managed_disk" "datadisk" { + name = "${var.hostname}-datadisk" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + storage_account_type = "Standard_LRS" + create_option = "Empty" + disk_size_gb = "1023" +} + +resource "azurerm_virtual_machine" "vm" { + name = "${var.rg_prefix}vm" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + vm_size = "${var.vm_size}" + network_interface_ids = ["${azurerm_network_interface.nic.id}"] + + storage_image_reference { + publisher = "${var.image_publisher}" + offer = "${var.image_offer}" + sku = "${var.image_sku}" + version = "${var.image_version}" + } + + storage_os_disk { + name = "${var.hostname}-osdisk" + managed_disk_type = "Standard_LRS" + caching = "ReadWrite" + create_option = "FromImage" + } + + storage_data_disk { + name = "${var.hostname}-datadisk" + managed_disk_id = "${azurerm_managed_disk.datadisk.id}" + managed_disk_type = "Standard_LRS" + disk_size_gb = "1023" + create_option = "Attach" + lun = 0 + } + + os_profile { + computer_name = "${var.hostname}" + admin_username = "${var.admin_username}" + admin_password = "${var.admin_password}" + } + + boot_diagnostics { + enabled = "true" + storage_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}" + } +} diff --git a/examples/azure-vm-simple-linux-managed-disk/outputs.tf b/examples/azure-vm-simple-linux-managed-disk/outputs.tf new file mode 100644 index 000000000000..9e3c2f0712bc --- /dev/null +++ b/examples/azure-vm-simple-linux-managed-disk/outputs.tf @@ -0,0 +1,11 @@ +output "hostname" { + value = "${var.hostname}" +} + +output "vm_fqdn" { + value = "${azurerm_public_ip.pip.fqdn}" +} + +output "sshCommand" { + value = "ssh ${var.admin_username}@${azurerm_public_ip.pip.fqdn}" +} diff --git a/examples/azure-vm-simple-linux-managed-disk/provider.tf b/examples/azure-vm-simple-linux-managed-disk/provider.tf new file mode 100644 index 000000000000..79291f7ca895 --- /dev/null +++ b/examples/azure-vm-simple-linux-managed-disk/provider.tf @@ -0,0 +1,7 @@ +# provider "azurerm" { +# subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" +# client_id = "REPLACE-WITH-YOUR-CLIENT-ID" +# client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" +# tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" +# } + diff --git a/examples/azure-vm-simple-linux-managed-disk/terraform.tfvars b/examples/azure-vm-simple-linux-managed-disk/terraform.tfvars new file mode 100644 index 000000000000..bee98e4e11bc --- /dev/null +++ b/examples/azure-vm-simple-linux-managed-disk/terraform.tfvars @@ -0,0 +1,8 @@ +# Replace with relevant values + +# resource_group = "myresourcegroup" +# rg_prefix = "rg" +# hostname = "myvm" +# dns_name = "mydnsname" +# location = "southcentralus" +# admin_password = "T3rr@f0rmP@ssword" diff --git a/examples/azure-vm-simple-linux-managed-disk/variables.tf b/examples/azure-vm-simple-linux-managed-disk/variables.tf new file mode 100644 index 000000000000..6d65a0277060 --- /dev/null +++ b/examples/azure-vm-simple-linux-managed-disk/variables.tf @@ -0,0 +1,75 @@ +variable "resource_group" { + description = "The name of the resource group in which to create the virtual network." +} + +variable "rg_prefix" { + description = "The shortened abbreviation to represent your resource group that will go on the front of some resources." + default = "rg" +} + +variable "hostname" { + description = "VM name referenced also in storage-related names." +} + +variable "dns_name" { + description = " Label for the Domain Name. Will be used to make up the FQDN. If a domain name label is specified, an A DNS record is created for the public IP in the Microsoft Azure DNS system." +} + +variable "location" { + description = "The location/region where the virtual network is created. Changing this forces a new resource to be created." + default = "southcentralus" +} + +variable "virtual_network_name" { + description = "The name for the virtual network." + default = "vnet" +} + +variable "address_space" { + description = "The address space that is used by the virtual network. You can supply more than one address space. Changing this forces a new resource to be created." + default = "10.0.0.0/16" +} + +variable "subnet_prefix" { + description = "The address prefix to use for the subnet." + default = "10.0.10.0/24" +} + +variable "storage_account_type" { + description = "Specifies the name of the storage account. Changing this forces a new resource to be created. This must be unique across the entire Azure service, not just within the resource group." + default = "Standard_LRS" +} + +variable "vm_size" { + description = "Specifies the name of the virtual machine resource. Changing this forces a new resource to be created." + default = "Standard_A0" +} + +variable "image_publisher" { + description = "name of the publisher of the image (az vm image list)" + default = "Canonical" +} + +variable "image_offer" { + description = "the name of the offer (az vm image list)" + default = "UbuntuServer" +} + +variable "image_sku" { + description = "image sku to apply (az vm image list)" + default = "16.04-LTS" +} + +variable "image_version" { + description = "version of the image to apply (az vm image list)" + default = "latest" +} + +variable "admin_username" { + description = "administrator user name" + default = "vmadmin" +} + +variable "admin_password" { + description = "administrator password (recommended to disable password auth)" +} From ac2e5c25debc793e3c4affda1c624819ef83fd95 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Thu, 27 Apr 2017 14:28:16 -0500 Subject: [PATCH 28/77] initial commit --- .../azure-cdn-with-storage-account/README.md | 32 +++++++++++++++++ .../after_deploy.ci.sh | 9 +++++ .../deploy.ci.sh | 17 ++++++++++ .../deploy.mac.sh | 15 ++++++++ .../azure-cdn-with-storage-account/main.tf | 34 +++++++++++++++++++ .../provider.tf.example | 7 ++++ .../terraform.tfvars | 8 +++++ .../variables.tf | 27 +++++++++++++++ 8 files changed, 149 insertions(+) create mode 100644 examples/azure-cdn-with-storage-account/README.md create mode 100755 examples/azure-cdn-with-storage-account/after_deploy.ci.sh create mode 100755 examples/azure-cdn-with-storage-account/deploy.ci.sh create mode 100755 examples/azure-cdn-with-storage-account/deploy.mac.sh create mode 100644 examples/azure-cdn-with-storage-account/main.tf create mode 100644 examples/azure-cdn-with-storage-account/provider.tf.example create mode 100644 examples/azure-cdn-with-storage-account/terraform.tfvars create mode 100644 examples/azure-cdn-with-storage-account/variables.tf diff --git a/examples/azure-cdn-with-storage-account/README.md b/examples/azure-cdn-with-storage-account/README.md new file mode 100644 index 000000000000..287a09b4e7ea --- /dev/null +++ b/examples/azure-cdn-with-storage-account/README.md @@ -0,0 +1,32 @@ +# Create a CDN Profile, a CDN Endpoint with a Storage Account as origin + +This Terraform template was based on [this](https://github.com/Azure/azure-quickstart-templates/tree/master/201-cdn-with-storage-account) Azure Quickstart Template. Changes to the ARM template may have occurred since the creation of this example may not be reflected here. + + + + + +This template creates a [CDN Profile](https://docs.microsoft.com/en-us/azure/cdn/cdn-overview) and a CDN Endpoint with origin as a Storage Account. Note that user needs to create a public container in the Storage Account in order for CDN Endpoint to serve content from the Storage Account. + +# Important + +The endpoint will not immediately be available for use, as it takes time for the registration to propagate through the CDN. For Azure CDN from Akamai profiles, propagation will usually complete within one minute. For Azure CDN from Verizon profiles, propagation will usually complete within 90 minutes, but in some cases can take longer. + +Users who try to use the CDN domain name before the endpoint configuration has propagated to the POPs will receive HTTP 404 response codes. If it's been several hours since you created your endpoint and you're still receiving 404 responses, please see [Troubleshooting CDN endpoints returning 404 statuses](https://docs.microsoft.com/en-us/azure/cdn/cdn-troubleshoot-endpoint). + +## main.tf +The `main.tf` file contains the actual resources that will be deployed. It also contains the Azure Resource Group definition and any defined variables. + +## outputs.tf +This data is outputted when `terraform apply` is called, and can be queried using the `terraform output` command. + +## provider.tf +Azure requires that an application is added to Azure Active Directory to generate the `client_id`, `client_secret`, and `tenant_id` needed by Terraform (`subscription_id` can be recovered from your Azure account details). Please go [here](https://www.terraform.io/docs/providers/azurerm/) for full instructions on how to create this to populate your `provider.tf` file. + +## terraform.tfvars +If a `terraform.tfvars` file is present in the current directory, Terraform automatically loads it to populate variables. We don't recommend saving usernames and password to version control, but you can create a local secret variables file and use `-var-file` to load it. + +If you are committing this template to source control, please insure that you add this file to your `.gitignore` file. + +## variables.tf +The `variables.tf` file contains all of the input parameters that the user can specify when deploying this Terraform template. diff --git a/examples/azure-cdn-with-storage-account/after_deploy.ci.sh b/examples/azure-cdn-with-storage-account/after_deploy.ci.sh new file mode 100755 index 000000000000..245aba38045e --- /dev/null +++ b/examples/azure-cdn-with-storage-account/after_deploy.ci.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +set -o errexit -o nounset + +# cleanup deployed azure resources +docker run --rm -it \ + azuresdk/azure-cli-python \ + sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ + az group delete -y -n $KEY" diff --git a/examples/azure-cdn-with-storage-account/deploy.ci.sh b/examples/azure-cdn-with-storage-account/deploy.ci.sh new file mode 100755 index 000000000000..8fa08573faad --- /dev/null +++ b/examples/azure-cdn-with-storage-account/deploy.ci.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +set -o errexit -o nounset + +docker run --rm -it \ + -e ARM_CLIENT_ID \ + -e ARM_CLIENT_SECRET \ + -e ARM_SUBSCRIPTION_ID \ + -e ARM_TENANT_ID \ + -v $(pwd):/data \ + --workdir=/data \ + --entrypoint "/bin/sh" \ + hashicorp/terraform:light \ + -c "/bin/terraform get; \ + /bin/terraform validate; \ + /bin/terraform plan -out=out.tfplan -var dns_name=$KEY -var hostname=$KEY -var resource_group=$KEY -var admin_password=$PASSWORD; \ + /bin/terraform apply out.tfplan" diff --git a/examples/azure-cdn-with-storage-account/deploy.mac.sh b/examples/azure-cdn-with-storage-account/deploy.mac.sh new file mode 100755 index 000000000000..9c6563f07d71 --- /dev/null +++ b/examples/azure-cdn-with-storage-account/deploy.mac.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +set -o errexit -o nounset + +if docker -v; then + + # generate a unique string for CI deployment + export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) + export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) + + /bin/sh ./deploy.ci.sh + +else + echo "Docker is used to run terraform commands, please install before run: https://docs.docker.com/docker-for-mac/install/" +fi diff --git a/examples/azure-cdn-with-storage-account/main.tf b/examples/azure-cdn-with-storage-account/main.tf new file mode 100644 index 000000000000..6073b2710690 --- /dev/null +++ b/examples/azure-cdn-with-storage-account/main.tf @@ -0,0 +1,34 @@ +resource "azurerm_resource_group" "rg" { + name = "${var.resource_group}" + location = "${var.location}" +} + +resource "azurerm_storage_account" "stor" { + name = "${var.hostname}stor" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + account_type = "${var.storage_account_type}" +} + +resource "azurerm_cdn_profile" "cdn" { + name = "${var.hostname}CdnProfile1" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + sku = "Standard_Akamai" +} + +resource "azurerm_cdn_endpoint" "cdnendpt" { + name = "${var.hostname}CdnEndpoint1" + profile_name = "${azurerm_cdn_profile.cdn.name}" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + # content_types_to_compress = ["text/plain", "text/html", "text/css", "application/x-javascript", "text/javascript"] + # is_compression_enabled = true + # is_https_allowed = false + + origin { + name = "${var.hostname}Origin1" + host_name = "vmforcdn.southcentralus.cloudapp.azure.com" + http_port = 80 + } +} diff --git a/examples/azure-cdn-with-storage-account/provider.tf.example b/examples/azure-cdn-with-storage-account/provider.tf.example new file mode 100644 index 000000000000..79291f7ca895 --- /dev/null +++ b/examples/azure-cdn-with-storage-account/provider.tf.example @@ -0,0 +1,7 @@ +# provider "azurerm" { +# subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" +# client_id = "REPLACE-WITH-YOUR-CLIENT-ID" +# client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" +# tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" +# } + diff --git a/examples/azure-cdn-with-storage-account/terraform.tfvars b/examples/azure-cdn-with-storage-account/terraform.tfvars new file mode 100644 index 000000000000..bee98e4e11bc --- /dev/null +++ b/examples/azure-cdn-with-storage-account/terraform.tfvars @@ -0,0 +1,8 @@ +# Replace with relevant values + +# resource_group = "myresourcegroup" +# rg_prefix = "rg" +# hostname = "myvm" +# dns_name = "mydnsname" +# location = "southcentralus" +# admin_password = "T3rr@f0rmP@ssword" diff --git a/examples/azure-cdn-with-storage-account/variables.tf b/examples/azure-cdn-with-storage-account/variables.tf new file mode 100644 index 000000000000..1793b6b24654 --- /dev/null +++ b/examples/azure-cdn-with-storage-account/variables.tf @@ -0,0 +1,27 @@ +variable "resource_group" { + description = "The name of the resource group in which to create the virtual network." +} + +variable "hostname" { + description = "VM name referenced also in storage-related names." +} + +variable "location" { + description = "The location/region where the virtual network is created. Changing this forces a new resource to be created." + default = "southcentralus" +} + +variable "storage_account_type" { + description = "Specifies the name of the storage account. Changing this forces a new resource to be created. This must be unique across the entire Azure service, not just within the resource group." + default = "Standard_LRS" +} + +variable "admin_username" { + description = "administrator user name" + default = "vmadmin" +} + +variable "admin_password" { + description = "administrator password (recommended to disable password auth)" + default = "T3rraform!!!" +} From 935c19a25904d7ca3ff79f7e9c803698765c778a Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Thu, 27 Apr 2017 16:16:23 -0500 Subject: [PATCH 29/77] deploys locally --- .travis.yml | 8 ++------ .../azure-cdn-with-storage-account/deploy.ci.sh | 2 +- examples/azure-cdn-with-storage-account/main.tf | 15 +++++++-------- .../azure-cdn-with-storage-account/variables.tf | 17 ++++------------- 4 files changed, 14 insertions(+), 28 deletions(-) diff --git a/.travis.yml b/.travis.yml index d54a0592b1e7..5f63df3aebad 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,8 +11,7 @@ git: # establish environment variables env: - - TEST_DIR=examples/azure-vm-simple-linux-managed-disk - - TEST_DIR=examples/azure-vm-from-user-image + - TEST_DIR=examples/azure-cdn-with-storage-account branches: only: @@ -23,9 +22,6 @@ branches: before_deploy: - export KEY=$(cat /dev/urandom | tr -cd 'a-z' | head -c 12) - export PASSWORD=$KEY$(cat /dev/urandom | tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | tr -cd '0-9' | head -c 2) - - export EXISTING_IMAGE_URI=https://permanentstor.blob.core.windows.net/permanent-vhds/permanent-osdisk1.vhd - - export EXISTING_STORAGE_ACCOUNT_NAME=permanentstor - - export EXISTING_RESOURCE_GROUP=permanent # terraform deploy script deploy: @@ -34,7 +30,7 @@ deploy: script: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./deploy.ci.sh on: repo: 10thmagnitude/terraform - branch: master + branch: topic-201-cdn-with-storage-account # cleanup after_deploy: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./after_deploy.ci.sh diff --git a/examples/azure-cdn-with-storage-account/deploy.ci.sh b/examples/azure-cdn-with-storage-account/deploy.ci.sh index 8fa08573faad..3abf813936c6 100755 --- a/examples/azure-cdn-with-storage-account/deploy.ci.sh +++ b/examples/azure-cdn-with-storage-account/deploy.ci.sh @@ -13,5 +13,5 @@ docker run --rm -it \ hashicorp/terraform:light \ -c "/bin/terraform get; \ /bin/terraform validate; \ - /bin/terraform plan -out=out.tfplan -var dns_name=$KEY -var hostname=$KEY -var resource_group=$KEY -var admin_password=$PASSWORD; \ + /bin/terraform plan -out=out.tfplan -var resource_group=$KEY; \ /bin/terraform apply out.tfplan" diff --git a/examples/azure-cdn-with-storage-account/main.tf b/examples/azure-cdn-with-storage-account/main.tf index 6073b2710690..d5b69558b0a7 100644 --- a/examples/azure-cdn-with-storage-account/main.tf +++ b/examples/azure-cdn-with-storage-account/main.tf @@ -4,31 +4,30 @@ resource "azurerm_resource_group" "rg" { } resource "azurerm_storage_account" "stor" { - name = "${var.hostname}stor" + name = "${var.resource_group}stor" location = "${var.location}" resource_group_name = "${azurerm_resource_group.rg.name}" account_type = "${var.storage_account_type}" } resource "azurerm_cdn_profile" "cdn" { - name = "${var.hostname}CdnProfile1" + name = "${var.resource_group}CdnProfile1" location = "${var.location}" resource_group_name = "${azurerm_resource_group.rg.name}" sku = "Standard_Akamai" } resource "azurerm_cdn_endpoint" "cdnendpt" { - name = "${var.hostname}CdnEndpoint1" + name = "${var.resource_group}CdnEndpoint1" profile_name = "${azurerm_cdn_profile.cdn.name}" location = "${var.location}" resource_group_name = "${azurerm_resource_group.rg.name}" - # content_types_to_compress = ["text/plain", "text/html", "text/css", "application/x-javascript", "text/javascript"] - # is_compression_enabled = true - # is_https_allowed = false + is_https_allowed = false origin { - name = "${var.hostname}Origin1" - host_name = "vmforcdn.southcentralus.cloudapp.azure.com" + name = "${var.resource_group}Origin1" + host_name = "${var.host_name}" http_port = 80 + https_port = 443 } } diff --git a/examples/azure-cdn-with-storage-account/variables.tf b/examples/azure-cdn-with-storage-account/variables.tf index 1793b6b24654..9b69787ef788 100644 --- a/examples/azure-cdn-with-storage-account/variables.tf +++ b/examples/azure-cdn-with-storage-account/variables.tf @@ -2,10 +2,6 @@ variable "resource_group" { description = "The name of the resource group in which to create the virtual network." } -variable "hostname" { - description = "VM name referenced also in storage-related names." -} - variable "location" { description = "The location/region where the virtual network is created. Changing this forces a new resource to be created." default = "southcentralus" @@ -16,12 +12,7 @@ variable "storage_account_type" { default = "Standard_LRS" } -variable "admin_username" { - description = "administrator user name" - default = "vmadmin" -} - -variable "admin_password" { - description = "administrator password (recommended to disable password auth)" - default = "T3rraform!!!" -} +variable "host_name" { + description = "A string that determines the hostname/IP address of the origin server. This string could be a domain name, IPv4 address or IPv6 address." + default = "www.example.com" +} \ No newline at end of file From 66b74413034b49764f8aa6f6f620f79a6c7e8b9c Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Thu, 27 Apr 2017 16:27:21 -0500 Subject: [PATCH 30/77] updated deploy --- .../after_deploy.ci.sh | 9 --------- .../deploy.ci.sh | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 9 deletions(-) delete mode 100755 examples/azure-cdn-with-storage-account/after_deploy.ci.sh diff --git a/examples/azure-cdn-with-storage-account/after_deploy.ci.sh b/examples/azure-cdn-with-storage-account/after_deploy.ci.sh deleted file mode 100755 index 245aba38045e..000000000000 --- a/examples/azure-cdn-with-storage-account/after_deploy.ci.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -set -o errexit -o nounset - -# cleanup deployed azure resources -docker run --rm -it \ - azuresdk/azure-cli-python \ - sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ - az group delete -y -n $KEY" diff --git a/examples/azure-cdn-with-storage-account/deploy.ci.sh b/examples/azure-cdn-with-storage-account/deploy.ci.sh index 3abf813936c6..d4a8bf244087 100755 --- a/examples/azure-cdn-with-storage-account/deploy.ci.sh +++ b/examples/azure-cdn-with-storage-account/deploy.ci.sh @@ -15,3 +15,22 @@ docker run --rm -it \ /bin/terraform validate; \ /bin/terraform plan -out=out.tfplan -var resource_group=$KEY; \ /bin/terraform apply out.tfplan" + +# cleanup deployed azure resources via terraform +docker run --rm -it \ + -e ARM_CLIENT_ID \ + -e ARM_CLIENT_SECRET \ + -e ARM_SUBSCRIPTION_ID \ + -e ARM_TENANT_ID \ + -v $(pwd):/data \ + --workdir=/data \ + --entrypoint "/bin/sh" \ + hashicorp/terraform:light \ + -c "/bin/terraform destroy -force -var resource_group=$KEY;" + + +# cleanup deployed azure resources via azure-cli +# docker run --rm -it \ +# azuresdk/azure-cli-python \ +# sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ +# az group delete -y -n $KEY" \ No newline at end of file From c98b1d11780976d1bba35b3537831102f5ef475d Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Thu, 27 Apr 2017 16:29:02 -0500 Subject: [PATCH 31/77] consolidated deploy and after_deploy into a single script; simplified ci process; added os_profile_linux_config --- .../after_deploy.ci.sh | 11 ------ .../azure-vm-from-user-image/deploy.ci.sh | 36 ++++++++++--------- .../azure-vm-from-user-image/deploy.mac.sh | 2 +- examples/azure-vm-from-user-image/main.tf | 4 +++ 4 files changed, 24 insertions(+), 29 deletions(-) delete mode 100755 examples/azure-vm-from-user-image/after_deploy.ci.sh diff --git a/examples/azure-vm-from-user-image/after_deploy.ci.sh b/examples/azure-vm-from-user-image/after_deploy.ci.sh deleted file mode 100755 index 8a5624eb7681..000000000000 --- a/examples/azure-vm-from-user-image/after_deploy.ci.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -set -o errexit -o nounset - -docker run --rm -it \ - azuresdk/azure-cli-python \ - sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ - az vm delete --name $KEY --resource-group permanent -y; \ - az network nic delete --name $KEY'nic' --resource-group permanent; \ - az network vnet delete --name $KEY'vnet' --resource-group permanent; \ - az network public-ip delete --name $KEY'-ip' --resource-group permanent;" diff --git a/examples/azure-vm-from-user-image/deploy.ci.sh b/examples/azure-vm-from-user-image/deploy.ci.sh index f45c5bb2a6cd..6c315809aadf 100755 --- a/examples/azure-vm-from-user-image/deploy.ci.sh +++ b/examples/azure-vm-from-user-image/deploy.ci.sh @@ -16,22 +16,24 @@ docker run --rm -it \ /bin/terraform plan -out=out.tfplan -var hostname=$KEY -var resource_group=$EXISTING_RESOURCE_GROUP -var admin_username=$KEY -var admin_password=$PASSWORD -var image_uri=$EXISTING_IMAGE_URI -var storage_account_name=$EXISTING_STORAGE_ACCOUNT_NAME; \ /bin/terraform apply out.tfplan" -# echo "Setting git user name" -# git config user.name $GH_USER_NAME -# -# echo "Setting git user email" -# git config user.email $GH_USER_EMAIL -# -# echo "Adding git upstream remote" -# git remote add upstream "https://$GH_TOKEN@github.com/$GH_REPO.git" -# -# git checkout master +# cleanup deployed azure resources via terraform +docker run --rm -it \ + -e ARM_CLIENT_ID \ + -e ARM_CLIENT_SECRET \ + -e ARM_SUBSCRIPTION_ID \ + -e ARM_TENANT_ID \ + -v $(pwd):/data \ + --workdir=/data \ + --entrypoint "/bin/sh" \ + hashicorp/terraform:light \ + -c "/bin/terraform destroy -force -var hostname=$KEY -var resource_group=$EXISTING_RESOURCE_GROUP -var admin_username=$KEY -var admin_password=$PASSWORD -var image_uri=$EXISTING_IMAGE_URI -var storage_account_name=$EXISTING_STORAGE_ACCOUNT_NAME -target=azurerm_virtual_machine.vm -target=azurerm_network_interface.nic -target=azurerm_virtual_network.vnet -target=azurerm_public_ip.pip;" -# -# NOW=$(TZ=America/Chicago date) -# -# git commit -m "tfstate: $NOW [ci skip]" -# -# echo "Pushing changes to upstream master" -# git push upstream master +## cleanup deployed azure resources via azure-cli +# docker run --rm -it \ +# azuresdk/azure-cli-python \ +# sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ +# az vm delete --name $KEY --resource-group permanent -y; \ +# az network nic delete --name $KEY'nic' --resource-group permanent; \ +# az network vnet delete --name $KEY'vnet' --resource-group permanent; \ +# az network public-ip delete --name $KEY'-ip' --resource-group permanent;" diff --git a/examples/azure-vm-from-user-image/deploy.mac.sh b/examples/azure-vm-from-user-image/deploy.mac.sh index acd4ca7028fc..079c7f1bbe60 100755 --- a/examples/azure-vm-from-user-image/deploy.mac.sh +++ b/examples/azure-vm-from-user-image/deploy.mac.sh @@ -5,7 +5,7 @@ set -o errexit -o nounset if docker -v; then # generate a unique string for CI deployment - export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) + export KEY=jcnkmmscfkrw export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) export EXISTING_IMAGE_URI=https://permanentstor.blob.core.windows.net/permanent-vhds/permanent-osdisk1.vhd export EXISTING_STORAGE_ACCOUNT_NAME=permanentstor diff --git a/examples/azure-vm-from-user-image/main.tf b/examples/azure-vm-from-user-image/main.tf index 28edf99204b5..929a87fa7134 100644 --- a/examples/azure-vm-from-user-image/main.tf +++ b/examples/azure-vm-from-user-image/main.tf @@ -59,4 +59,8 @@ resource "azurerm_virtual_machine" "vm" { admin_username = "${var.admin_username}" admin_password = "${var.admin_password}" } + + os_profile_linux_config { + disable_password_authentication = false + } } From 0ef07bcbe131ef32663d11c36cd9f325029c7cb0 Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Thu, 27 Apr 2017 17:22:22 -0500 Subject: [PATCH 32/77] added terraform show --- examples/azure-vm-from-user-image/deploy.ci.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/azure-vm-from-user-image/deploy.ci.sh b/examples/azure-vm-from-user-image/deploy.ci.sh index 6c315809aadf..faa3086987ba 100755 --- a/examples/azure-vm-from-user-image/deploy.ci.sh +++ b/examples/azure-vm-from-user-image/deploy.ci.sh @@ -14,7 +14,8 @@ docker run --rm -it \ -c "/bin/terraform get; \ /bin/terraform validate; \ /bin/terraform plan -out=out.tfplan -var hostname=$KEY -var resource_group=$EXISTING_RESOURCE_GROUP -var admin_username=$KEY -var admin_password=$PASSWORD -var image_uri=$EXISTING_IMAGE_URI -var storage_account_name=$EXISTING_STORAGE_ACCOUNT_NAME; \ - /bin/terraform apply out.tfplan" + /bin/terraform apply out.tfplan \ + /bin/terraform show;" # cleanup deployed azure resources via terraform docker run --rm -it \ From 50e8d8a5f6777581c85d89055b5d79005a6c07f8 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Thu, 27 Apr 2017 18:12:45 -0500 Subject: [PATCH 33/77] changed to allow http & https (like ARM tmplt) --- examples/azure-cdn-with-storage-account/main.tf | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/azure-cdn-with-storage-account/main.tf b/examples/azure-cdn-with-storage-account/main.tf index d5b69558b0a7..1f9c9ecbf843 100644 --- a/examples/azure-cdn-with-storage-account/main.tf +++ b/examples/azure-cdn-with-storage-account/main.tf @@ -22,7 +22,6 @@ resource "azurerm_cdn_endpoint" "cdnendpt" { profile_name = "${azurerm_cdn_profile.cdn.name}" location = "${var.location}" resource_group_name = "${azurerm_resource_group.rg.name}" - is_https_allowed = false origin { name = "${var.resource_group}Origin1" From ace9b0bd91019122d098ba02d53c561365c4b613 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Thu, 27 Apr 2017 18:39:39 -0500 Subject: [PATCH 34/77] changed host_name & host_name variable desc --- examples/azure-cdn-with-storage-account/outputs.tf | 3 +++ examples/azure-cdn-with-storage-account/variables.tf | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 examples/azure-cdn-with-storage-account/outputs.tf diff --git a/examples/azure-cdn-with-storage-account/outputs.tf b/examples/azure-cdn-with-storage-account/outputs.tf new file mode 100644 index 000000000000..8f7c1e5c8ad1 --- /dev/null +++ b/examples/azure-cdn-with-storage-account/outputs.tf @@ -0,0 +1,3 @@ +output "CDN Endpoint ID" { + value = "${azurerm_cdn_endpoint.cdnendpt.name}.azureedge.net" +} diff --git a/examples/azure-cdn-with-storage-account/variables.tf b/examples/azure-cdn-with-storage-account/variables.tf index 9b69787ef788..be6fd57487a6 100644 --- a/examples/azure-cdn-with-storage-account/variables.tf +++ b/examples/azure-cdn-with-storage-account/variables.tf @@ -13,6 +13,6 @@ variable "storage_account_type" { } variable "host_name" { - description = "A string that determines the hostname/IP address of the origin server. This string could be a domain name, IPv4 address or IPv6 address." - default = "www.example.com" + description = "Storage account endpoint. This template requires that the user creates a public container in the Storage Account in order for CDN Endpoint to serve content from the Storage Account." + default = "https://example.blob.core.windows.net/" } \ No newline at end of file From 5e99f8166ea6961a69eddc33bcd7b16eeb4ceb1e Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Thu, 27 Apr 2017 19:09:55 -0500 Subject: [PATCH 35/77] added az cli check --- examples/azure-vm-from-user-image/deploy.ci.sh | 17 ++++++----------- examples/azure-vm-from-user-image/deploy.mac.sh | 2 +- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/examples/azure-vm-from-user-image/deploy.ci.sh b/examples/azure-vm-from-user-image/deploy.ci.sh index faa3086987ba..a9f19bd7ed3e 100755 --- a/examples/azure-vm-from-user-image/deploy.ci.sh +++ b/examples/azure-vm-from-user-image/deploy.ci.sh @@ -14,9 +14,14 @@ docker run --rm -it \ -c "/bin/terraform get; \ /bin/terraform validate; \ /bin/terraform plan -out=out.tfplan -var hostname=$KEY -var resource_group=$EXISTING_RESOURCE_GROUP -var admin_username=$KEY -var admin_password=$PASSWORD -var image_uri=$EXISTING_IMAGE_URI -var storage_account_name=$EXISTING_STORAGE_ACCOUNT_NAME; \ - /bin/terraform apply out.tfplan \ + /bin/terraform apply out.tfplan; \ /bin/terraform show;" +docker run --rm -it \ + azuresdk/azure-cli-python \ + sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ + az vm show --name $KEY --resource-group permanent" + # cleanup deployed azure resources via terraform docker run --rm -it \ -e ARM_CLIENT_ID \ @@ -28,13 +33,3 @@ docker run --rm -it \ --entrypoint "/bin/sh" \ hashicorp/terraform:light \ -c "/bin/terraform destroy -force -var hostname=$KEY -var resource_group=$EXISTING_RESOURCE_GROUP -var admin_username=$KEY -var admin_password=$PASSWORD -var image_uri=$EXISTING_IMAGE_URI -var storage_account_name=$EXISTING_STORAGE_ACCOUNT_NAME -target=azurerm_virtual_machine.vm -target=azurerm_network_interface.nic -target=azurerm_virtual_network.vnet -target=azurerm_public_ip.pip;" - - -## cleanup deployed azure resources via azure-cli -# docker run --rm -it \ -# azuresdk/azure-cli-python \ -# sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ -# az vm delete --name $KEY --resource-group permanent -y; \ -# az network nic delete --name $KEY'nic' --resource-group permanent; \ -# az network vnet delete --name $KEY'vnet' --resource-group permanent; \ -# az network public-ip delete --name $KEY'-ip' --resource-group permanent;" diff --git a/examples/azure-vm-from-user-image/deploy.mac.sh b/examples/azure-vm-from-user-image/deploy.mac.sh index 079c7f1bbe60..acd4ca7028fc 100755 --- a/examples/azure-vm-from-user-image/deploy.mac.sh +++ b/examples/azure-vm-from-user-image/deploy.mac.sh @@ -5,7 +5,7 @@ set -o errexit -o nounset if docker -v; then # generate a unique string for CI deployment - export KEY=jcnkmmscfkrw + export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) export EXISTING_IMAGE_URI=https://permanentstor.blob.core.windows.net/permanent-vhds/permanent-osdisk1.vhd export EXISTING_STORAGE_ACCOUNT_NAME=permanentstor From 65826c136151f4822f72b3cad3dd60cadee1c4ac Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Thu, 27 Apr 2017 20:28:33 -0500 Subject: [PATCH 36/77] on this branch, only build test_dir; master will aggregate all the examples --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f17d0ca9930d..d7f21a323fff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,7 +16,6 @@ git: # establish environment variables env: - - TEST_DIR=examples/azure-vm-simple-linux-managed-disk - TEST_DIR=examples/azure-vm-from-user-image branches: From 2675c55d5c22abb71bdd859a830f789e5f3b0eb9 Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Fri, 28 Apr 2017 10:16:01 -0500 Subject: [PATCH 37/77] merge master --- .travis.yml | 9 ++-- examples/azure-vnet-two-subnets/.gitignore | 3 ++ examples/azure-vnet-two-subnets/README.md | 22 ++++++++++ examples/azure-vnet-two-subnets/deploy.mac.sh | 14 ++++++ examples/azure-vnet-two-subnets/deploy.sh | 43 +++++++++++++++++++ examples/azure-vnet-two-subnets/main.tf | 25 +++++++++++ .../provider.tf.example | 6 +++ examples/azure-vnet-two-subnets/variables.tf | 9 ++++ 8 files changed, 128 insertions(+), 3 deletions(-) create mode 100644 examples/azure-vnet-two-subnets/.gitignore create mode 100644 examples/azure-vnet-two-subnets/README.md create mode 100644 examples/azure-vnet-two-subnets/deploy.mac.sh create mode 100755 examples/azure-vnet-two-subnets/deploy.sh create mode 100644 examples/azure-vnet-two-subnets/main.tf create mode 100644 examples/azure-vnet-two-subnets/provider.tf.example create mode 100644 examples/azure-vnet-two-subnets/variables.tf diff --git a/.travis.yml b/.travis.yml index dc362203e9b2..33cdfdab3d17 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,13 +9,16 @@ services: language: generic +# on branches: ignore multiple commits that will queue build jobs, just run latest commit +git: + depth: 1 + # establish environment variables env: - - TEST_DIR=examples/azure-vm-simple-linux-managed-disk + - TEST_DIR=examples/azure-vnet-two-subnets branches: only: - - master - /^(?i:topic)-.*$/ # install terraform @@ -30,4 +33,4 @@ deploy: script: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./deploy.ci.sh on: repo: harijayms/terraform - branch: master + branch: topic-101-vnet-two-subnets diff --git a/examples/azure-vnet-two-subnets/.gitignore b/examples/azure-vnet-two-subnets/.gitignore new file mode 100644 index 000000000000..4893d38ff8fc --- /dev/null +++ b/examples/azure-vnet-two-subnets/.gitignore @@ -0,0 +1,3 @@ +terraform.tfstate* +provider.tf +out.tfplan diff --git a/examples/azure-vnet-two-subnets/README.md b/examples/azure-vnet-two-subnets/README.md new file mode 100644 index 000000000000..dc1c50277301 --- /dev/null +++ b/examples/azure-vnet-two-subnets/README.md @@ -0,0 +1,22 @@ +# Virtual Network with two Subnets + + + + + +This template allows you to create a Virtual Network with two subnets. + +## main.tf +The `main.tf` file contains the actual resources that will be deployed. It also contains the Azure Resource Group definition and any defined variables. + +## outputs.tf +This data is outputted when `terraform apply` is called, and can be queried using the `terraform output` command. + +## provider.tf +Azure requires that an application is added to Azure Active Directory to generate the `client_id`, `client_secret`, and `tenant_id` needed by Terraform (`subscription_id` can be recovered from your Azure account details). Please go [here](https://www.terraform.io/docs/providers/azurerm/) for full instructions on how to create this to populate your `provider.tf` file. + +## terraform.tfvars +If a `terraform.tfvars` file is present in the current directory, Terraform automatically loads it to populate variables. We don't recommend saving usernames and password to version control, but you can create a local secret variables file and use `-var-file` to load it. + +## variables.tf +The `variables.tf` file contains all of the input parameters that the user can specify when deploying this Terraform template. \ No newline at end of file diff --git a/examples/azure-vnet-two-subnets/deploy.mac.sh b/examples/azure-vnet-two-subnets/deploy.mac.sh new file mode 100644 index 000000000000..e712aa6aa8f1 --- /dev/null +++ b/examples/azure-vnet-two-subnets/deploy.mac.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +set -o errexit -o nounset + +# generate a unique string for CI deployment +export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) +export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) + +/bin/sh ./deploy.sh + +# docker run --rm -it \ +# azuresdk/azure-cli-python \ +# sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ +# az group delete -y -n $KEY" \ No newline at end of file diff --git a/examples/azure-vnet-two-subnets/deploy.sh b/examples/azure-vnet-two-subnets/deploy.sh new file mode 100755 index 000000000000..c267eaea7986 --- /dev/null +++ b/examples/azure-vnet-two-subnets/deploy.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +set -o errexit -o nounset + +# generate a unique string for CI deployment +# KEY=$(cat /dev/urandom | tr -cd 'a-z' | head -c 12) +# PASSWORD=$KEY$(cat /dev/urandom | tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | tr -cd '0-9' | head -c 2) + +docker run --rm -it \ + -e ARM_CLIENT_ID \ + -e ARM_CLIENT_SECRET \ + -e ARM_SUBSCRIPTION_ID \ + -e ARM_TENANT_ID \ + -v $(pwd):/data \ + --entrypoint "/bin/sh" \ + hashicorp/terraform:light \ + -c "cd /data; \ + /bin/terraform get; \ + /bin/terraform validate; \ + /bin/terraform plan -out=out.tfplan; \ + /bin/terraform apply out.tfplan" + +# TODO: determine external validation, possibly Azure CLI + +# echo "Setting git user name" +# git config user.name $GH_USER_NAME +# +# echo "Setting git user email" +# git config user.email $GH_USER_EMAIL +# +# echo "Adding git upstream remote" +# git remote add upstream "https://$GH_TOKEN@github.com/$GH_REPO.git" +# +# git checkout master + + +# +# NOW=$(TZ=America/Chicago date) +# +# git commit -m "tfstate: $NOW [ci skip]" +# +# echo "Pushing changes to upstream master" +# git push upstream master \ No newline at end of file diff --git a/examples/azure-vnet-two-subnets/main.tf b/examples/azure-vnet-two-subnets/main.tf new file mode 100644 index 000000000000..eb83a4bf35b3 --- /dev/null +++ b/examples/azure-vnet-two-subnets/main.tf @@ -0,0 +1,25 @@ +resource "azurerm_resource_group" "rg" { + name = "${var.resource_group}" + location = "${var.location}" +} + +resource "azurerm_virtual_network" "vnet" { + name = "${var.resource_group}vnet" + location = "${var.location}" + address_space = ["10.0.0.0/16"] + resource_group_name = "${azurerm_resource_group.rg.name}" +} + +resource "azurerm_subnet" "subnet1" { + name = "${var.resource_group}subnet1" + virtual_network_name = "${azurerm_virtual_network.vnet.name}" + resource_group_name = "${azurerm_resource_group.rg.name}" + address_prefix = "10.0.0.0/24" +} + +resource "azurerm_subnet" "subnet2" { + name = "${var.resource_group}subnet2" + virtual_network_name = "${azurerm_virtual_network.vnet.name}" + resource_group_name = "${azurerm_resource_group.rg.name}" + address_prefix = "10.0.1.0/24" +} diff --git a/examples/azure-vnet-two-subnets/provider.tf.example b/examples/azure-vnet-two-subnets/provider.tf.example new file mode 100644 index 000000000000..327ceb55eefa --- /dev/null +++ b/examples/azure-vnet-two-subnets/provider.tf.example @@ -0,0 +1,6 @@ +provider "azurerm" { + subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" + client_id = "REPLACE-WITH-YOUR-CLIENT-ID" + client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" + tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" +} \ No newline at end of file diff --git a/examples/azure-vnet-two-subnets/variables.tf b/examples/azure-vnet-two-subnets/variables.tf new file mode 100644 index 000000000000..ee64ffbc28e2 --- /dev/null +++ b/examples/azure-vnet-two-subnets/variables.tf @@ -0,0 +1,9 @@ +variable "resource_group" { + description = "The name of the resource group in which to create the virtual network." + default = "rg2" +} + +variable "location" { + description = "The location/region where the virtual network is created. Changing this forces a new resource to be created." + default = "southcentralus" +} From 072a51a9845b72754142436bde091409676885b7 Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Fri, 28 Apr 2017 10:44:07 -0500 Subject: [PATCH 38/77] added new constructs/naming for deploy scripts, etc. --- examples/azure-vnet-two-subnets/deploy.ci.sh | 41 ++++++++++++++++++ examples/azure-vnet-two-subnets/deploy.mac.sh | 17 ++++---- examples/azure-vnet-two-subnets/deploy.sh | 43 ------------------- examples/azure-vnet-two-subnets/main.tf | 4 +- examples/azure-vnet-two-subnets/variables.tf | 1 - 5 files changed, 52 insertions(+), 54 deletions(-) create mode 100755 examples/azure-vnet-two-subnets/deploy.ci.sh mode change 100644 => 100755 examples/azure-vnet-two-subnets/deploy.mac.sh delete mode 100755 examples/azure-vnet-two-subnets/deploy.sh diff --git a/examples/azure-vnet-two-subnets/deploy.ci.sh b/examples/azure-vnet-two-subnets/deploy.ci.sh new file mode 100755 index 000000000000..b77b4135cf3a --- /dev/null +++ b/examples/azure-vnet-two-subnets/deploy.ci.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +set -o errexit -o nounset + +# generate a unique string for CI deployment +# KEY=$(cat /dev/urandom | tr -cd 'a-z' | head -c 12) +# PASSWORD=$KEY$(cat /dev/urandom | tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | tr -cd '0-9' | head -c 2) + +docker run --rm -it \ + -e ARM_CLIENT_ID \ + -e ARM_CLIENT_SECRET \ + -e ARM_SUBSCRIPTION_ID \ + -e ARM_TENANT_ID \ + -v $(pwd):/data \ + --workdir=/data \ + --entrypoint "/bin/sh" \ + hashicorp/terraform:light \ + -c "/bin/terraform get; \ + /bin/terraform validate; \ + /bin/terraform plan -out=out.tfplan -var resource_group=$KEY; \ + /bin/terraform apply out.tfplan; \ + /bin/terraform show;" + +# check that resources exist via azure cli +docker run --rm -it \ + azuresdk/azure-cli-python \ + sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ + az network vnet subnet show -n subnet1 -g $KEY --vnet-name '$KEY'vnet; \ + az network vnet subnet show -n subnet2 -g $KEY --vnet-name '$KEY'vnet;" + +# cleanup deployed azure resources via terraform +docker run --rm -it \ + -e ARM_CLIENT_ID \ + -e ARM_CLIENT_SECRET \ + -e ARM_SUBSCRIPTION_ID \ + -e ARM_TENANT_ID \ + -v $(pwd):/data \ + --workdir=/data \ + --entrypoint "/bin/sh" \ + hashicorp/terraform:light \ + -c "/bin/terraform destroy -force -var resource_group=$KEY;" diff --git a/examples/azure-vnet-two-subnets/deploy.mac.sh b/examples/azure-vnet-two-subnets/deploy.mac.sh old mode 100644 new mode 100755 index e712aa6aa8f1..9c6563f07d71 --- a/examples/azure-vnet-two-subnets/deploy.mac.sh +++ b/examples/azure-vnet-two-subnets/deploy.mac.sh @@ -2,13 +2,14 @@ set -o errexit -o nounset -# generate a unique string for CI deployment -export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) -export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) +if docker -v; then -/bin/sh ./deploy.sh + # generate a unique string for CI deployment + export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) + export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) -# docker run --rm -it \ -# azuresdk/azure-cli-python \ -# sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ -# az group delete -y -n $KEY" \ No newline at end of file + /bin/sh ./deploy.ci.sh + +else + echo "Docker is used to run terraform commands, please install before run: https://docs.docker.com/docker-for-mac/install/" +fi diff --git a/examples/azure-vnet-two-subnets/deploy.sh b/examples/azure-vnet-two-subnets/deploy.sh deleted file mode 100755 index c267eaea7986..000000000000 --- a/examples/azure-vnet-two-subnets/deploy.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -set -o errexit -o nounset - -# generate a unique string for CI deployment -# KEY=$(cat /dev/urandom | tr -cd 'a-z' | head -c 12) -# PASSWORD=$KEY$(cat /dev/urandom | tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | tr -cd '0-9' | head -c 2) - -docker run --rm -it \ - -e ARM_CLIENT_ID \ - -e ARM_CLIENT_SECRET \ - -e ARM_SUBSCRIPTION_ID \ - -e ARM_TENANT_ID \ - -v $(pwd):/data \ - --entrypoint "/bin/sh" \ - hashicorp/terraform:light \ - -c "cd /data; \ - /bin/terraform get; \ - /bin/terraform validate; \ - /bin/terraform plan -out=out.tfplan; \ - /bin/terraform apply out.tfplan" - -# TODO: determine external validation, possibly Azure CLI - -# echo "Setting git user name" -# git config user.name $GH_USER_NAME -# -# echo "Setting git user email" -# git config user.email $GH_USER_EMAIL -# -# echo "Adding git upstream remote" -# git remote add upstream "https://$GH_TOKEN@github.com/$GH_REPO.git" -# -# git checkout master - - -# -# NOW=$(TZ=America/Chicago date) -# -# git commit -m "tfstate: $NOW [ci skip]" -# -# echo "Pushing changes to upstream master" -# git push upstream master \ No newline at end of file diff --git a/examples/azure-vnet-two-subnets/main.tf b/examples/azure-vnet-two-subnets/main.tf index eb83a4bf35b3..ef74357ce256 100644 --- a/examples/azure-vnet-two-subnets/main.tf +++ b/examples/azure-vnet-two-subnets/main.tf @@ -11,14 +11,14 @@ resource "azurerm_virtual_network" "vnet" { } resource "azurerm_subnet" "subnet1" { - name = "${var.resource_group}subnet1" + name = "subnet1" virtual_network_name = "${azurerm_virtual_network.vnet.name}" resource_group_name = "${azurerm_resource_group.rg.name}" address_prefix = "10.0.0.0/24" } resource "azurerm_subnet" "subnet2" { - name = "${var.resource_group}subnet2" + name = "subnet2" virtual_network_name = "${azurerm_virtual_network.vnet.name}" resource_group_name = "${azurerm_resource_group.rg.name}" address_prefix = "10.0.1.0/24" diff --git a/examples/azure-vnet-two-subnets/variables.tf b/examples/azure-vnet-two-subnets/variables.tf index ee64ffbc28e2..8d5dd4131636 100644 --- a/examples/azure-vnet-two-subnets/variables.tf +++ b/examples/azure-vnet-two-subnets/variables.tf @@ -1,6 +1,5 @@ variable "resource_group" { description = "The name of the resource group in which to create the virtual network." - default = "rg2" } variable "location" { From 06f1a7f11258b912c56006a69bdf2fcb99397dc8 Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Fri, 28 Apr 2017 11:59:31 -0500 Subject: [PATCH 39/77] suppress az login output --- examples/azure-vnet-two-subnets/deploy.ci.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/azure-vnet-two-subnets/deploy.ci.sh b/examples/azure-vnet-two-subnets/deploy.ci.sh index b77b4135cf3a..ee119ea4269f 100755 --- a/examples/azure-vnet-two-subnets/deploy.ci.sh +++ b/examples/azure-vnet-two-subnets/deploy.ci.sh @@ -24,7 +24,7 @@ docker run --rm -it \ # check that resources exist via azure cli docker run --rm -it \ azuresdk/azure-cli-python \ - sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ + sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID > /dev/null; \ az network vnet subnet show -n subnet1 -g $KEY --vnet-name '$KEY'vnet; \ az network vnet subnet show -n subnet2 -g $KEY --vnet-name '$KEY'vnet;" From 3523ed3305ff908e242388946298c823ec694863 Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Fri, 28 Apr 2017 12:40:25 -0500 Subject: [PATCH 40/77] suppress az login output --- examples/azure-vm-from-user-image/deploy.ci.sh | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/examples/azure-vm-from-user-image/deploy.ci.sh b/examples/azure-vm-from-user-image/deploy.ci.sh index a9f19bd7ed3e..cf4a9c814511 100755 --- a/examples/azure-vm-from-user-image/deploy.ci.sh +++ b/examples/azure-vm-from-user-image/deploy.ci.sh @@ -19,7 +19,7 @@ docker run --rm -it \ docker run --rm -it \ azuresdk/azure-cli-python \ - sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ + sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID > /dev/null; \ az vm show --name $KEY --resource-group permanent" # cleanup deployed azure resources via terraform @@ -32,4 +32,14 @@ docker run --rm -it \ --workdir=/data \ --entrypoint "/bin/sh" \ hashicorp/terraform:light \ - -c "/bin/terraform destroy -force -var hostname=$KEY -var resource_group=$EXISTING_RESOURCE_GROUP -var admin_username=$KEY -var admin_password=$PASSWORD -var image_uri=$EXISTING_IMAGE_URI -var storage_account_name=$EXISTING_STORAGE_ACCOUNT_NAME -target=azurerm_virtual_machine.vm -target=azurerm_network_interface.nic -target=azurerm_virtual_network.vnet -target=azurerm_public_ip.pip;" + -c "/bin/terraform destroy -force \ + -var hostname=$KEY + -var resource_group=$EXISTING_RESOURCE_GROUP + -var admin_username=$KEY + -var admin_password=$PASSWORD + -var image_uri=$EXISTING_IMAGE_URI + -var storage_account_name=$EXISTING_STORAGE_ACCOUNT_NAME + -target=azurerm_virtual_machine.vm + -target=azurerm_network_interface.nic + -target=azurerm_virtual_network.vnet + -target=azurerm_public_ip.pip;" From 21837a95bc02adca7b4d9dfb357a65499b8d24d5 Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Fri, 28 Apr 2017 12:47:10 -0500 Subject: [PATCH 41/77] forgot about line breaks --- examples/azure-vm-from-user-image/deploy.ci.sh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/azure-vm-from-user-image/deploy.ci.sh b/examples/azure-vm-from-user-image/deploy.ci.sh index cf4a9c814511..37578ed7db12 100755 --- a/examples/azure-vm-from-user-image/deploy.ci.sh +++ b/examples/azure-vm-from-user-image/deploy.ci.sh @@ -33,13 +33,13 @@ docker run --rm -it \ --entrypoint "/bin/sh" \ hashicorp/terraform:light \ -c "/bin/terraform destroy -force \ - -var hostname=$KEY - -var resource_group=$EXISTING_RESOURCE_GROUP - -var admin_username=$KEY - -var admin_password=$PASSWORD - -var image_uri=$EXISTING_IMAGE_URI - -var storage_account_name=$EXISTING_STORAGE_ACCOUNT_NAME - -target=azurerm_virtual_machine.vm - -target=azurerm_network_interface.nic - -target=azurerm_virtual_network.vnet + -var hostname=$KEY \ + -var resource_group=$EXISTING_RESOURCE_GROUP \ + -var admin_username=$KEY \ + -var admin_password=$PASSWORD \ + -var image_uri=$EXISTING_IMAGE_URI \ + -var storage_account_name=$EXISTING_STORAGE_ACCOUNT_NAME \ + -target=azurerm_virtual_machine.vm \ + -target=azurerm_network_interface.nic \ + -target=azurerm_virtual_network.vnet \ -target=azurerm_public_ip.pip;" From e1e3aa2cdfd18ece7f3e7edb292785470d85ad7d Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Fri, 28 Apr 2017 13:34:56 -0500 Subject: [PATCH 42/77] breaking build as an example --- examples/azure-vm-from-user-image/deploy.ci.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/azure-vm-from-user-image/deploy.ci.sh b/examples/azure-vm-from-user-image/deploy.ci.sh index 37578ed7db12..1f0c4782d210 100755 --- a/examples/azure-vm-from-user-image/deploy.ci.sh +++ b/examples/azure-vm-from-user-image/deploy.ci.sh @@ -19,7 +19,7 @@ docker run --rm -it \ docker run --rm -it \ azuresdk/azure-cli-python \ - sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID > /dev/null; \ + sh -c "az login --service-principal -u $ARM_CLIENT_ID -p WRONG --tenant $ARM_TENANT_ID > /dev/null; \ az vm show --name $KEY --resource-group permanent" # cleanup deployed azure resources via terraform From a0a7643e081dcab1a93433fbc86e822a1aacfebf Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Fri, 28 Apr 2017 13:40:41 -0500 Subject: [PATCH 43/77] fixing broken build example --- examples/azure-vm-from-user-image/deploy.ci.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/azure-vm-from-user-image/deploy.ci.sh b/examples/azure-vm-from-user-image/deploy.ci.sh index 1f0c4782d210..37578ed7db12 100755 --- a/examples/azure-vm-from-user-image/deploy.ci.sh +++ b/examples/azure-vm-from-user-image/deploy.ci.sh @@ -19,7 +19,7 @@ docker run --rm -it \ docker run --rm -it \ azuresdk/azure-cli-python \ - sh -c "az login --service-principal -u $ARM_CLIENT_ID -p WRONG --tenant $ARM_TENANT_ID > /dev/null; \ + sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID > /dev/null; \ az vm show --name $KEY --resource-group permanent" # cleanup deployed azure resources via terraform From 2c02115a92c4e25648a91882457ce7b3165f585c Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Mon, 1 May 2017 10:35:36 -0500 Subject: [PATCH 44/77] merge of CI config --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 33cdfdab3d17..86488119349f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,10 +15,12 @@ git: # establish environment variables env: + - TEST_DIR=examples/azure-vm-simple-linux-managed-disk - TEST_DIR=examples/azure-vnet-two-subnets branches: only: + - master - /^(?i:topic)-.*$/ # install terraform @@ -33,4 +35,4 @@ deploy: script: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./deploy.ci.sh on: repo: harijayms/terraform - branch: topic-101-vnet-two-subnets + branch: master From 487d9cd1eeeeb4a03d0dcaa08fd07d21580b8b7b Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Mon, 1 May 2017 15:58:45 -0500 Subject: [PATCH 45/77] fixed grammar in readme --- examples/azure-vm-from-user-image/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/azure-vm-from-user-image/README.md b/examples/azure-vm-from-user-image/README.md index 455b0bcb1a5f..7f575a7926de 100644 --- a/examples/azure-vm-from-user-image/README.md +++ b/examples/azure-vm-from-user-image/README.md @@ -1,6 +1,6 @@ # [Create a Virtual Machine from a User Image](https://docs.microsoft.com/en-us/azure/virtual-machines/linux/cli-deploy-templates#create-a-custom-vm-image) -This Terraform template was based on [this](https://github.com/Azure/azure-quickstart-templates/tree/master/101-vm-from-user-image) Azure Quickstart Template. Changes to the ARM template may have occured since the creation of this example may not be reflected here. +This Terraform template was based on [this](https://github.com/Azure/azure-quickstart-templates/tree/master/101-vm-from-user-image) Azure Quickstart Template. Changes to the ARM template that may have occured since the creation of this example may not be reflected here. @@ -11,7 +11,7 @@ This Terraform template was based on [this](https://github.com/Azure/azure-quick This template allows you to create a Virtual Machine from an unmanaged User image vhd. This template also deploys a Virtual Network, Public IP addresses and a Network Interface. ## main.tf -The `main.tf` file contains the actual resources that will be deployed. It also contains the Azure Resource Group definition and any defined variables. +The `main.tf` file contains the actual resources that will be deployed. It also contains the Azure Resource Group definition and any defined variables. ## outputs.tf This data is outputted when `terraform apply` is called, and can be queried using the `terraform output` command. @@ -20,7 +20,7 @@ This data is outputted when `terraform apply` is called, and can be queried usin Azure requires that an application is added to Azure Active Directory to generate the `client_id`, `client_secret`, and `tenant_id` needed by Terraform (`subscription_id` can be recovered from your Azure account details). Please go [here](https://www.terraform.io/docs/providers/azurerm/) for full instructions on how to create this to populate your `provider.tf` file. ## terraform.tfvars -If a `terraform.tfvars` file is present in the current directory, Terraform automatically loads it to populate variables. We don't recommend saving usernames and password to version control, but you can create a local secret variables file and use `-var-file` to load it. +If a `terraform.tfvars` file is present in the current directory, Terraform automatically loads it to populate variables. We don't recommend saving usernames and password to version control, but you can create a local secret variables file and use `-var-file` to load it. If you are committing this template to source control, please insure that you add this file to your `.gitignore` file. From d8ef7b121ce959e8363937085896d40367542d92 Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Mon, 1 May 2017 18:14:53 -0500 Subject: [PATCH 46/77] prep for PR --- .travis.yml | 1 - examples/azure-cdn-with-storage-account/README.md | 2 +- examples/azure-cdn-with-storage-account/deploy.ci.sh | 6 ++++-- examples/azure-cdn-with-storage-account/deploy.mac.sh | 1 - 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index f9dec25566ff..42e207da6b9c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,6 @@ branches: before_deploy: - export KEY=$(cat /dev/urandom | tr -cd 'a-z' | head -c 12) - export PASSWORD=$KEY$(cat /dev/urandom | tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | tr -cd '0-9' | head -c 2) - - export VM_HOST_NAME=anniecdn.southcentralus.cloudapp.azure.com # terraform deploy + script deploy: diff --git a/examples/azure-cdn-with-storage-account/README.md b/examples/azure-cdn-with-storage-account/README.md index 287a09b4e7ea..6536f729385c 100644 --- a/examples/azure-cdn-with-storage-account/README.md +++ b/examples/azure-cdn-with-storage-account/README.md @@ -1,6 +1,6 @@ # Create a CDN Profile, a CDN Endpoint with a Storage Account as origin -This Terraform template was based on [this](https://github.com/Azure/azure-quickstart-templates/tree/master/201-cdn-with-storage-account) Azure Quickstart Template. Changes to the ARM template may have occurred since the creation of this example may not be reflected here. +This Terraform template was based on [this](https://github.com/Azure/azure-quickstart-templates/tree/master/201-cdn-with-storage-account) Azure Quickstart Template. Changes to the ARM template that may have occurred since the creation of this example may not be reflected here. diff --git a/examples/azure-cdn-with-storage-account/deploy.ci.sh b/examples/azure-cdn-with-storage-account/deploy.ci.sh index 4f8f967ab289..dcb4de86e3b9 100755 --- a/examples/azure-cdn-with-storage-account/deploy.ci.sh +++ b/examples/azure-cdn-with-storage-account/deploy.ci.sh @@ -13,9 +13,11 @@ docker run --rm -it \ hashicorp/terraform:light \ -c "/bin/terraform get; \ /bin/terraform validate; \ - /bin/terraform plan -out=out.tfplan -var resource_group=$KEY -var host_name=$VM_HOST_NAME; \ + /bin/terraform plan -out=out.tfplan -var resource_group=$KEY -var host_name=$KEY; \ /bin/terraform apply out.tfplan" +#TODO: how do we validate? + # cleanup deployed azure resources via terraform docker run --rm -it \ -e ARM_CLIENT_ID \ @@ -26,4 +28,4 @@ docker run --rm -it \ --workdir=/data \ --entrypoint "/bin/sh" \ hashicorp/terraform:light \ - -c "/bin/terraform destroy -force -var resource_group=$KEY -var host_name=$VM_HOST_NAME;" + -c "/bin/terraform destroy -force -var resource_group=$KEY -var host_name=$KEY;" diff --git a/examples/azure-cdn-with-storage-account/deploy.mac.sh b/examples/azure-cdn-with-storage-account/deploy.mac.sh index 11ec6e0967b3..9c6563f07d71 100755 --- a/examples/azure-cdn-with-storage-account/deploy.mac.sh +++ b/examples/azure-cdn-with-storage-account/deploy.mac.sh @@ -7,7 +7,6 @@ if docker -v; then # generate a unique string for CI deployment export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) - export VM_HOST_NAME=anniecdn.southcentralus.cloudapp.azure.com /bin/sh ./deploy.ci.sh From 25ef50c256a212c13ec6ac60175f46d2a577d73b Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Tue, 2 May 2017 15:18:48 -0500 Subject: [PATCH 47/77] took out armviz button and minor README changes --- examples/azure-cdn-with-storage-account/README.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/examples/azure-cdn-with-storage-account/README.md b/examples/azure-cdn-with-storage-account/README.md index 6536f729385c..8d2d0377caa3 100644 --- a/examples/azure-cdn-with-storage-account/README.md +++ b/examples/azure-cdn-with-storage-account/README.md @@ -1,18 +1,14 @@ # Create a CDN Profile, a CDN Endpoint with a Storage Account as origin -This Terraform template was based on [this](https://github.com/Azure/azure-quickstart-templates/tree/master/201-cdn-with-storage-account) Azure Quickstart Template. Changes to the ARM template that may have occurred since the creation of this example may not be reflected here. +This Terraform template was based on [this](https://github.com/Azure/azure-quickstart-templates/tree/master/201-cdn-with-storage-account) Azure Quickstart Template. Changes to the ARM template that may have occurred since the creation of this example may not be reflected in this Terraform template. - - - - -This template creates a [CDN Profile](https://docs.microsoft.com/en-us/azure/cdn/cdn-overview) and a CDN Endpoint with origin as a Storage Account. Note that user needs to create a public container in the Storage Account in order for CDN Endpoint to serve content from the Storage Account. +This template creates a [CDN Profile](https://docs.microsoft.com/en-us/azure/cdn/cdn-overview) and a CDN Endpoint with the origin as a Storage Account. Note that the user needs to create a public container in the Storage Account in order for CDN Endpoint to serve content from the Storage Account. # Important The endpoint will not immediately be available for use, as it takes time for the registration to propagate through the CDN. For Azure CDN from Akamai profiles, propagation will usually complete within one minute. For Azure CDN from Verizon profiles, propagation will usually complete within 90 minutes, but in some cases can take longer. -Users who try to use the CDN domain name before the endpoint configuration has propagated to the POPs will receive HTTP 404 response codes. If it's been several hours since you created your endpoint and you're still receiving 404 responses, please see [Troubleshooting CDN endpoints returning 404 statuses](https://docs.microsoft.com/en-us/azure/cdn/cdn-troubleshoot-endpoint). +Users who try to use the CDN domain name before the endpoint configuration has propagated to the POPs will receive HTTP 404 response codes. If it has been several hours since you created your endpoint and you're still receiving 404 responses, please see [Troubleshooting CDN endpoints returning 404 statuses](https://docs.microsoft.com/en-us/azure/cdn/cdn-troubleshoot-endpoint). ## main.tf The `main.tf` file contains the actual resources that will be deployed. It also contains the Azure Resource Group definition and any defined variables. From 63c494dc58b24a0dd6723fdd80955de60609b4eb Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Tue, 2 May 2017 15:31:03 -0500 Subject: [PATCH 48/77] changed host_name --- examples/azure-cdn-with-storage-account/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/azure-cdn-with-storage-account/main.tf b/examples/azure-cdn-with-storage-account/main.tf index 1f9c9ecbf843..b161e37258d3 100644 --- a/examples/azure-cdn-with-storage-account/main.tf +++ b/examples/azure-cdn-with-storage-account/main.tf @@ -25,7 +25,7 @@ resource "azurerm_cdn_endpoint" "cdnendpt" { origin { name = "${var.resource_group}Origin1" - host_name = "${var.host_name}" + host_name = "www.${var.host_name}.com" http_port = 80 https_port = 443 } From 9a5a15a99ffaf0715900e2adc37af26d2d385962 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Tue, 2 May 2017 16:54:13 -0500 Subject: [PATCH 49/77] fixed merge conflicts --- .../deploy.ci.sh | 8 ++------ .../azure-vm-simple-linux-managed-disk/main.tf | 15 +-------------- .../variables.tf | 10 +--------- 3 files changed, 4 insertions(+), 29 deletions(-) diff --git a/examples/azure-vm-simple-linux-managed-disk/deploy.ci.sh b/examples/azure-vm-simple-linux-managed-disk/deploy.ci.sh index 8ffbeae2ad9f..71e407526186 100755 --- a/examples/azure-vm-simple-linux-managed-disk/deploy.ci.sh +++ b/examples/azure-vm-simple-linux-managed-disk/deploy.ci.sh @@ -14,14 +14,13 @@ docker run --rm -it \ -c "/bin/terraform get; \ /bin/terraform validate; \ /bin/terraform plan -out=out.tfplan -var dns_name=$KEY -var hostname=$KEY -var resource_group=$KEY -var admin_password=$PASSWORD; \ -<<<<<<< HEAD /bin/terraform apply out.tfplan; \ /bin/terraform show;" # cleanup deployed azure resources via azure-cli docker run --rm -it \ azuresdk/azure-cli-python \ - sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ + sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID > /dev/null; \ az vm show -g $KEY -n rgvm" # cleanup deployed azure resources via terraform @@ -34,7 +33,4 @@ docker run --rm -it \ --workdir=/data \ --entrypoint "/bin/sh" \ hashicorp/terraform:light \ - -c "/bin/terraform destroy -force -var dns_name=$KEY -var hostname=$KEY -var resource_group=$KEY -var admin_password=$PASSWORD;" -======= - /bin/terraform apply out.tfplan" ->>>>>>> ace9b0bd91019122d098ba02d53c561365c4b613 + -c "/bin/terraform destroy -force -var dns_name=$KEY -var hostname=$KEY -var resource_group=$KEY -var admin_password=$PASSWORD;" \ No newline at end of file diff --git a/examples/azure-vm-simple-linux-managed-disk/main.tf b/examples/azure-vm-simple-linux-managed-disk/main.tf index e39e6f16cfe8..8ef283c7819c 100644 --- a/examples/azure-vm-simple-linux-managed-disk/main.tf +++ b/examples/azure-vm-simple-linux-managed-disk/main.tf @@ -45,16 +45,6 @@ resource "azurerm_storage_account" "stor" { account_type = "${var.storage_account_type}" } -<<<<<<< HEAD -======= -resource "azurerm_storage_container" "storc" { - name = "${var.hostname}-vhds" - resource_group_name = "${azurerm_resource_group.rg.name}" - storage_account_name = "${azurerm_storage_account.stor.name}" - container_access_type = "private" -} - ->>>>>>> ace9b0bd91019122d098ba02d53c561365c4b613 resource "azurerm_managed_disk" "datadisk" { name = "${var.hostname}-datadisk" location = "${var.location}" @@ -100,15 +90,12 @@ resource "azurerm_virtual_machine" "vm" { admin_password = "${var.admin_password}" } -<<<<<<< HEAD os_profile_linux_config { disable_password_authentication = false } -======= ->>>>>>> ace9b0bd91019122d098ba02d53c561365c4b613 boot_diagnostics { enabled = "true" storage_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}" } -} +} \ No newline at end of file diff --git a/examples/azure-vm-simple-linux-managed-disk/variables.tf b/examples/azure-vm-simple-linux-managed-disk/variables.tf index 09cf59f8f834..91024000bc03 100644 --- a/examples/azure-vm-simple-linux-managed-disk/variables.tf +++ b/examples/azure-vm-simple-linux-managed-disk/variables.tf @@ -36,20 +36,12 @@ variable "subnet_prefix" { } variable "storage_account_type" { -<<<<<<< HEAD description = "Defines the type of storage account to be created. Valid options are Standard_LRS, Standard_ZRS, Standard_GRS, Standard_RAGRS, Premium_LRS. Changing this is sometimes valid - see the Azure documentation for more information on which types of accounts can be converted into other types." -======= - description = "Specifies the name of the storage account. Changing this forces a new resource to be created. This must be unique across the entire Azure service, not just within the resource group." ->>>>>>> ace9b0bd91019122d098ba02d53c561365c4b613 default = "Standard_LRS" } variable "vm_size" { -<<<<<<< HEAD description = "Specifies the size of the virtual machine." -======= - description = "Specifies the name of the virtual machine resource. Changing this forces a new resource to be created." ->>>>>>> ace9b0bd91019122d098ba02d53c561365c4b613 default = "Standard_A0" } @@ -80,4 +72,4 @@ variable "admin_username" { variable "admin_password" { description = "administrator password (recommended to disable password auth)" -} +} \ No newline at end of file From d7e2acb5cbe1608b45d9429f78ac318e29ca661d Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Tue, 2 May 2017 17:45:06 -0500 Subject: [PATCH 50/77] changed host_name variable --- examples/azure-cdn-with-storage-account/deploy.ci.sh | 4 ++-- examples/azure-cdn-with-storage-account/main.tf | 2 +- examples/azure-cdn-with-storage-account/variables.tf | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/azure-cdn-with-storage-account/deploy.ci.sh b/examples/azure-cdn-with-storage-account/deploy.ci.sh index dcb4de86e3b9..3fd0efac3f6d 100755 --- a/examples/azure-cdn-with-storage-account/deploy.ci.sh +++ b/examples/azure-cdn-with-storage-account/deploy.ci.sh @@ -13,7 +13,7 @@ docker run --rm -it \ hashicorp/terraform:light \ -c "/bin/terraform get; \ /bin/terraform validate; \ - /bin/terraform plan -out=out.tfplan -var resource_group=$KEY -var host_name=$KEY; \ + /bin/terraform plan -out=out.tfplan -var resource_group=$KEY; \ /bin/terraform apply out.tfplan" #TODO: how do we validate? @@ -28,4 +28,4 @@ docker run --rm -it \ --workdir=/data \ --entrypoint "/bin/sh" \ hashicorp/terraform:light \ - -c "/bin/terraform destroy -force -var resource_group=$KEY -var host_name=$KEY;" + -c "/bin/terraform destroy -force -var resource_group=$KEY;" diff --git a/examples/azure-cdn-with-storage-account/main.tf b/examples/azure-cdn-with-storage-account/main.tf index b161e37258d3..1f9c9ecbf843 100644 --- a/examples/azure-cdn-with-storage-account/main.tf +++ b/examples/azure-cdn-with-storage-account/main.tf @@ -25,7 +25,7 @@ resource "azurerm_cdn_endpoint" "cdnendpt" { origin { name = "${var.resource_group}Origin1" - host_name = "www.${var.host_name}.com" + host_name = "${var.host_name}" http_port = 80 https_port = 443 } diff --git a/examples/azure-cdn-with-storage-account/variables.tf b/examples/azure-cdn-with-storage-account/variables.tf index e42c937ab0d7..d9bf51015d93 100644 --- a/examples/azure-cdn-with-storage-account/variables.tf +++ b/examples/azure-cdn-with-storage-account/variables.tf @@ -8,10 +8,11 @@ variable "location" { } variable "storage_account_type" { - description = "Specifies the name of the storage account. Changing this forces a new resource to be created. This must be unique across the entire Azure service, not just within the resource group." + description = "Specifies the type of the storage account" default = "Standard_LRS" } variable "host_name" { - description = "Storage account endpoint. This template requires that the user creates a public container in the Storage Account in order for CDN Endpoint to serve content from the Storage Account." + description = "A string that determines the hostname/IP address of the origin server. This string could be a domain name, IPv4 address or IPv6 address." + default = "www.hostnameoforiginserver.com" } \ No newline at end of file From dbaf8d14a9cdfcef0281919671357f6171ebd4e6 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Wed, 3 May 2017 13:17:55 -0500 Subject: [PATCH 51/77] updating Hashicorp's changes to merged simple linux branch --- examples/azure-vm-simple-linux-managed-disk/README.md | 8 ++------ .../azure-vm-simple-linux-managed-disk/deploy.mac.sh | 2 +- examples/azure-vm-simple-linux-managed-disk/main.tf | 11 +++++++++-- .../azure-vm-simple-linux-managed-disk/outputs.tf | 4 ++-- .../azure-vm-simple-linux-managed-disk/provider.tf | 7 ------- .../terraform.tfvars | 8 -------- 6 files changed, 14 insertions(+), 26 deletions(-) delete mode 100644 examples/azure-vm-simple-linux-managed-disk/provider.tf delete mode 100644 examples/azure-vm-simple-linux-managed-disk/terraform.tfvars diff --git a/examples/azure-vm-simple-linux-managed-disk/README.md b/examples/azure-vm-simple-linux-managed-disk/README.md index 0492e3edccb9..cde5c458e82d 100644 --- a/examples/azure-vm-simple-linux-managed-disk/README.md +++ b/examples/azure-vm-simple-linux-managed-disk/README.md @@ -1,10 +1,6 @@ # Very simple deployment of a Linux VM - - - - -This template allows you to deploy a simple Linux VM using a few different options for the Ubuntu version, using the latest patched version. This will deploy a A1 size VM in the resource group location and return the FQDN of the VM. +This template allows you to deploy a simple Linux VM using a few different options for the Ubuntu version, using the latest patched version. This will deploy an A0 size VM in the resource group location and return the FQDN of the VM. This template takes a minimum amount of parameters and deploys a Linux VM, using the latest patched version. @@ -21,4 +17,4 @@ Azure requires that an application is added to Azure Active Directory to generat If a `terraform.tfvars` file is present in the current directory, Terraform automatically loads it to populate variables. We don't recommend saving usernames and password to version control, but you can create a local secret variables file and use `-var-file` to load it. ## variables.tf -The `variables.tf` file contains all of the input parameters that the user can specify when deploying this Terraform template. +The `variables.tf` file contains all of the input parameters that the user can specify when deploying this Terraform template. \ No newline at end of file diff --git a/examples/azure-vm-simple-linux-managed-disk/deploy.mac.sh b/examples/azure-vm-simple-linux-managed-disk/deploy.mac.sh index 9c6563f07d71..dfc34c2be2fc 100755 --- a/examples/azure-vm-simple-linux-managed-disk/deploy.mac.sh +++ b/examples/azure-vm-simple-linux-managed-disk/deploy.mac.sh @@ -12,4 +12,4 @@ if docker -v; then else echo "Docker is used to run terraform commands, please install before run: https://docs.docker.com/docker-for-mac/install/" -fi +fi \ No newline at end of file diff --git a/examples/azure-vm-simple-linux-managed-disk/main.tf b/examples/azure-vm-simple-linux-managed-disk/main.tf index 8ef283c7819c..5dc9ce1cb086 100644 --- a/examples/azure-vm-simple-linux-managed-disk/main.tf +++ b/examples/azure-vm-simple-linux-managed-disk/main.tf @@ -1,3 +1,10 @@ +# provider "azurerm" { +# subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" +# client_id = "REPLACE-WITH-YOUR-CLIENT-ID" +# client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" +# tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" +# } + resource "azurerm_resource_group" "rg" { name = "${var.resource_group}" location = "${var.location}" @@ -34,7 +41,7 @@ resource "azurerm_public_ip" "pip" { name = "${var.rg_prefix}-ip" location = "${var.location}" resource_group_name = "${azurerm_resource_group.rg.name}" - public_ip_address_allocation = "dynamic" + public_ip_address_allocation = "Dynamic" domain_name_label = "${var.dns_name}" } @@ -95,7 +102,7 @@ resource "azurerm_virtual_machine" "vm" { } boot_diagnostics { - enabled = "true" + enabled = true storage_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}" } } \ No newline at end of file diff --git a/examples/azure-vm-simple-linux-managed-disk/outputs.tf b/examples/azure-vm-simple-linux-managed-disk/outputs.tf index 9e3c2f0712bc..32c6294ceeab 100644 --- a/examples/azure-vm-simple-linux-managed-disk/outputs.tf +++ b/examples/azure-vm-simple-linux-managed-disk/outputs.tf @@ -6,6 +6,6 @@ output "vm_fqdn" { value = "${azurerm_public_ip.pip.fqdn}" } -output "sshCommand" { +output "ssh_command" { value = "ssh ${var.admin_username}@${azurerm_public_ip.pip.fqdn}" -} +} \ No newline at end of file diff --git a/examples/azure-vm-simple-linux-managed-disk/provider.tf b/examples/azure-vm-simple-linux-managed-disk/provider.tf deleted file mode 100644 index 79291f7ca895..000000000000 --- a/examples/azure-vm-simple-linux-managed-disk/provider.tf +++ /dev/null @@ -1,7 +0,0 @@ -# provider "azurerm" { -# subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" -# client_id = "REPLACE-WITH-YOUR-CLIENT-ID" -# client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" -# tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" -# } - diff --git a/examples/azure-vm-simple-linux-managed-disk/terraform.tfvars b/examples/azure-vm-simple-linux-managed-disk/terraform.tfvars deleted file mode 100644 index bee98e4e11bc..000000000000 --- a/examples/azure-vm-simple-linux-managed-disk/terraform.tfvars +++ /dev/null @@ -1,8 +0,0 @@ -# Replace with relevant values - -# resource_group = "myresourcegroup" -# rg_prefix = "rg" -# hostname = "myvm" -# dns_name = "mydnsname" -# location = "southcentralus" -# admin_password = "T3rr@f0rmP@ssword" From b850cd5d2a858eff073fc5a1097a6813d0f8b362 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Wed, 3 May 2017 13:35:37 -0500 Subject: [PATCH 52/77] updating files to merge w/master and prep for Hashicorp pr --- .travis.yml | 17 +++++++++++++---- .../azure-cdn-with-storage-account/deploy.ci.sh | 2 +- .../deploy.mac.sh | 2 +- examples/azure-cdn-with-storage-account/main.tf | 7 +++++++ .../provider.tf.example | 7 ------- .../terraform.tfvars | 8 -------- 6 files changed, 22 insertions(+), 21 deletions(-) delete mode 100644 examples/azure-cdn-with-storage-account/provider.tf.example delete mode 100644 examples/azure-cdn-with-storage-account/terraform.tfvars diff --git a/.travis.yml b/.travis.yml index 42e207da6b9c..6180da4dec64 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,7 @@ +#################################################################################### +## NOT FOR UPSTREAM PROPOSAL; INTENDED FOR CI OF AZURE EXAMPLES IN THIS REPO ONLY ## +#################################################################################### + sudo: required services: @@ -5,14 +9,19 @@ services: language: generic +# on branches: ignore multiple commits that will queue build jobs, just run latest commit +git: + depth: 1 + # establish environment variables env: - - TEST_DIR=examples/azure-cdn-with-storage-account + - TEST_DIR=examples/azure-vm-simple-linux-managed-disk + - TEST_DIR=examples/azure-vnet-two-subnets branches: only: -# - master - - /^(?i:topic)-.*$/ + - master + - /^(?i:topic)-.*$/ # install terraform before_deploy: @@ -26,4 +35,4 @@ deploy: script: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./deploy.ci.sh on: repo: harijayms/terraform - branch: topic-201-cdn-with-storage-account + branch: master \ No newline at end of file diff --git a/examples/azure-cdn-with-storage-account/deploy.ci.sh b/examples/azure-cdn-with-storage-account/deploy.ci.sh index 3fd0efac3f6d..3ccc9b9ecef2 100755 --- a/examples/azure-cdn-with-storage-account/deploy.ci.sh +++ b/examples/azure-cdn-with-storage-account/deploy.ci.sh @@ -28,4 +28,4 @@ docker run --rm -it \ --workdir=/data \ --entrypoint "/bin/sh" \ hashicorp/terraform:light \ - -c "/bin/terraform destroy -force -var resource_group=$KEY;" + -c "/bin/terraform destroy -force -var resource_group=$KEY;" \ No newline at end of file diff --git a/examples/azure-cdn-with-storage-account/deploy.mac.sh b/examples/azure-cdn-with-storage-account/deploy.mac.sh index 9c6563f07d71..dfc34c2be2fc 100755 --- a/examples/azure-cdn-with-storage-account/deploy.mac.sh +++ b/examples/azure-cdn-with-storage-account/deploy.mac.sh @@ -12,4 +12,4 @@ if docker -v; then else echo "Docker is used to run terraform commands, please install before run: https://docs.docker.com/docker-for-mac/install/" -fi +fi \ No newline at end of file diff --git a/examples/azure-cdn-with-storage-account/main.tf b/examples/azure-cdn-with-storage-account/main.tf index 1f9c9ecbf843..2e7f56954c3c 100644 --- a/examples/azure-cdn-with-storage-account/main.tf +++ b/examples/azure-cdn-with-storage-account/main.tf @@ -1,3 +1,10 @@ +# provider "azurerm" { +# subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" +# client_id = "REPLACE-WITH-YOUR-CLIENT-ID" +# client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" +# tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" +# } + resource "azurerm_resource_group" "rg" { name = "${var.resource_group}" location = "${var.location}" diff --git a/examples/azure-cdn-with-storage-account/provider.tf.example b/examples/azure-cdn-with-storage-account/provider.tf.example deleted file mode 100644 index 79291f7ca895..000000000000 --- a/examples/azure-cdn-with-storage-account/provider.tf.example +++ /dev/null @@ -1,7 +0,0 @@ -# provider "azurerm" { -# subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" -# client_id = "REPLACE-WITH-YOUR-CLIENT-ID" -# client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" -# tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" -# } - diff --git a/examples/azure-cdn-with-storage-account/terraform.tfvars b/examples/azure-cdn-with-storage-account/terraform.tfvars deleted file mode 100644 index bee98e4e11bc..000000000000 --- a/examples/azure-cdn-with-storage-account/terraform.tfvars +++ /dev/null @@ -1,8 +0,0 @@ -# Replace with relevant values - -# resource_group = "myresourcegroup" -# rg_prefix = "rg" -# hostname = "myvm" -# dns_name = "mydnsname" -# location = "southcentralus" -# admin_password = "T3rr@f0rmP@ssword" From a6151bcc5970a2a5262fcbe3ed8908315ac54187 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Wed, 3 May 2017 17:48:18 -0500 Subject: [PATCH 53/77] Revert "updating files to merge w/master and prep for Hashicorp pr" This reverts commit b850cd5d2a858eff073fc5a1097a6813d0f8b362. --- .travis.yml | 17 ++++------------- .../azure-cdn-with-storage-account/deploy.ci.sh | 2 +- .../deploy.mac.sh | 2 +- examples/azure-cdn-with-storage-account/main.tf | 7 ------- .../provider.tf.example | 7 +++++++ .../terraform.tfvars | 8 ++++++++ 6 files changed, 21 insertions(+), 22 deletions(-) create mode 100644 examples/azure-cdn-with-storage-account/provider.tf.example create mode 100644 examples/azure-cdn-with-storage-account/terraform.tfvars diff --git a/.travis.yml b/.travis.yml index 6180da4dec64..42e207da6b9c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,3 @@ -#################################################################################### -## NOT FOR UPSTREAM PROPOSAL; INTENDED FOR CI OF AZURE EXAMPLES IN THIS REPO ONLY ## -#################################################################################### - sudo: required services: @@ -9,19 +5,14 @@ services: language: generic -# on branches: ignore multiple commits that will queue build jobs, just run latest commit -git: - depth: 1 - # establish environment variables env: - - TEST_DIR=examples/azure-vm-simple-linux-managed-disk - - TEST_DIR=examples/azure-vnet-two-subnets + - TEST_DIR=examples/azure-cdn-with-storage-account branches: only: - - master - - /^(?i:topic)-.*$/ +# - master + - /^(?i:topic)-.*$/ # install terraform before_deploy: @@ -35,4 +26,4 @@ deploy: script: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./deploy.ci.sh on: repo: harijayms/terraform - branch: master \ No newline at end of file + branch: topic-201-cdn-with-storage-account diff --git a/examples/azure-cdn-with-storage-account/deploy.ci.sh b/examples/azure-cdn-with-storage-account/deploy.ci.sh index 3ccc9b9ecef2..3fd0efac3f6d 100755 --- a/examples/azure-cdn-with-storage-account/deploy.ci.sh +++ b/examples/azure-cdn-with-storage-account/deploy.ci.sh @@ -28,4 +28,4 @@ docker run --rm -it \ --workdir=/data \ --entrypoint "/bin/sh" \ hashicorp/terraform:light \ - -c "/bin/terraform destroy -force -var resource_group=$KEY;" \ No newline at end of file + -c "/bin/terraform destroy -force -var resource_group=$KEY;" diff --git a/examples/azure-cdn-with-storage-account/deploy.mac.sh b/examples/azure-cdn-with-storage-account/deploy.mac.sh index dfc34c2be2fc..9c6563f07d71 100755 --- a/examples/azure-cdn-with-storage-account/deploy.mac.sh +++ b/examples/azure-cdn-with-storage-account/deploy.mac.sh @@ -12,4 +12,4 @@ if docker -v; then else echo "Docker is used to run terraform commands, please install before run: https://docs.docker.com/docker-for-mac/install/" -fi \ No newline at end of file +fi diff --git a/examples/azure-cdn-with-storage-account/main.tf b/examples/azure-cdn-with-storage-account/main.tf index 2e7f56954c3c..1f9c9ecbf843 100644 --- a/examples/azure-cdn-with-storage-account/main.tf +++ b/examples/azure-cdn-with-storage-account/main.tf @@ -1,10 +1,3 @@ -# provider "azurerm" { -# subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" -# client_id = "REPLACE-WITH-YOUR-CLIENT-ID" -# client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" -# tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" -# } - resource "azurerm_resource_group" "rg" { name = "${var.resource_group}" location = "${var.location}" diff --git a/examples/azure-cdn-with-storage-account/provider.tf.example b/examples/azure-cdn-with-storage-account/provider.tf.example new file mode 100644 index 000000000000..79291f7ca895 --- /dev/null +++ b/examples/azure-cdn-with-storage-account/provider.tf.example @@ -0,0 +1,7 @@ +# provider "azurerm" { +# subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" +# client_id = "REPLACE-WITH-YOUR-CLIENT-ID" +# client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" +# tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" +# } + diff --git a/examples/azure-cdn-with-storage-account/terraform.tfvars b/examples/azure-cdn-with-storage-account/terraform.tfvars new file mode 100644 index 000000000000..bee98e4e11bc --- /dev/null +++ b/examples/azure-cdn-with-storage-account/terraform.tfvars @@ -0,0 +1,8 @@ +# Replace with relevant values + +# resource_group = "myresourcegroup" +# rg_prefix = "rg" +# hostname = "myvm" +# dns_name = "mydnsname" +# location = "southcentralus" +# admin_password = "T3rr@f0rmP@ssword" From 542673967d74e18c5e8759b685288596c243381a Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Wed, 3 May 2017 17:49:04 -0500 Subject: [PATCH 54/77] Revert "updating Hashicorp's changes to merged simple linux branch" This reverts commit dbaf8d14a9cdfcef0281919671357f6171ebd4e6. --- examples/azure-vm-simple-linux-managed-disk/README.md | 8 ++++++-- .../azure-vm-simple-linux-managed-disk/deploy.mac.sh | 2 +- examples/azure-vm-simple-linux-managed-disk/main.tf | 11 ++--------- .../azure-vm-simple-linux-managed-disk/outputs.tf | 4 ++-- .../azure-vm-simple-linux-managed-disk/provider.tf | 7 +++++++ .../terraform.tfvars | 8 ++++++++ 6 files changed, 26 insertions(+), 14 deletions(-) create mode 100644 examples/azure-vm-simple-linux-managed-disk/provider.tf create mode 100644 examples/azure-vm-simple-linux-managed-disk/terraform.tfvars diff --git a/examples/azure-vm-simple-linux-managed-disk/README.md b/examples/azure-vm-simple-linux-managed-disk/README.md index cde5c458e82d..0492e3edccb9 100644 --- a/examples/azure-vm-simple-linux-managed-disk/README.md +++ b/examples/azure-vm-simple-linux-managed-disk/README.md @@ -1,6 +1,10 @@ # Very simple deployment of a Linux VM -This template allows you to deploy a simple Linux VM using a few different options for the Ubuntu version, using the latest patched version. This will deploy an A0 size VM in the resource group location and return the FQDN of the VM. + + + + +This template allows you to deploy a simple Linux VM using a few different options for the Ubuntu version, using the latest patched version. This will deploy a A1 size VM in the resource group location and return the FQDN of the VM. This template takes a minimum amount of parameters and deploys a Linux VM, using the latest patched version. @@ -17,4 +21,4 @@ Azure requires that an application is added to Azure Active Directory to generat If a `terraform.tfvars` file is present in the current directory, Terraform automatically loads it to populate variables. We don't recommend saving usernames and password to version control, but you can create a local secret variables file and use `-var-file` to load it. ## variables.tf -The `variables.tf` file contains all of the input parameters that the user can specify when deploying this Terraform template. \ No newline at end of file +The `variables.tf` file contains all of the input parameters that the user can specify when deploying this Terraform template. diff --git a/examples/azure-vm-simple-linux-managed-disk/deploy.mac.sh b/examples/azure-vm-simple-linux-managed-disk/deploy.mac.sh index dfc34c2be2fc..9c6563f07d71 100755 --- a/examples/azure-vm-simple-linux-managed-disk/deploy.mac.sh +++ b/examples/azure-vm-simple-linux-managed-disk/deploy.mac.sh @@ -12,4 +12,4 @@ if docker -v; then else echo "Docker is used to run terraform commands, please install before run: https://docs.docker.com/docker-for-mac/install/" -fi \ No newline at end of file +fi diff --git a/examples/azure-vm-simple-linux-managed-disk/main.tf b/examples/azure-vm-simple-linux-managed-disk/main.tf index 5dc9ce1cb086..8ef283c7819c 100644 --- a/examples/azure-vm-simple-linux-managed-disk/main.tf +++ b/examples/azure-vm-simple-linux-managed-disk/main.tf @@ -1,10 +1,3 @@ -# provider "azurerm" { -# subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" -# client_id = "REPLACE-WITH-YOUR-CLIENT-ID" -# client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" -# tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" -# } - resource "azurerm_resource_group" "rg" { name = "${var.resource_group}" location = "${var.location}" @@ -41,7 +34,7 @@ resource "azurerm_public_ip" "pip" { name = "${var.rg_prefix}-ip" location = "${var.location}" resource_group_name = "${azurerm_resource_group.rg.name}" - public_ip_address_allocation = "Dynamic" + public_ip_address_allocation = "dynamic" domain_name_label = "${var.dns_name}" } @@ -102,7 +95,7 @@ resource "azurerm_virtual_machine" "vm" { } boot_diagnostics { - enabled = true + enabled = "true" storage_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}" } } \ No newline at end of file diff --git a/examples/azure-vm-simple-linux-managed-disk/outputs.tf b/examples/azure-vm-simple-linux-managed-disk/outputs.tf index 32c6294ceeab..9e3c2f0712bc 100644 --- a/examples/azure-vm-simple-linux-managed-disk/outputs.tf +++ b/examples/azure-vm-simple-linux-managed-disk/outputs.tf @@ -6,6 +6,6 @@ output "vm_fqdn" { value = "${azurerm_public_ip.pip.fqdn}" } -output "ssh_command" { +output "sshCommand" { value = "ssh ${var.admin_username}@${azurerm_public_ip.pip.fqdn}" -} \ No newline at end of file +} diff --git a/examples/azure-vm-simple-linux-managed-disk/provider.tf b/examples/azure-vm-simple-linux-managed-disk/provider.tf new file mode 100644 index 000000000000..79291f7ca895 --- /dev/null +++ b/examples/azure-vm-simple-linux-managed-disk/provider.tf @@ -0,0 +1,7 @@ +# provider "azurerm" { +# subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" +# client_id = "REPLACE-WITH-YOUR-CLIENT-ID" +# client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" +# tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" +# } + diff --git a/examples/azure-vm-simple-linux-managed-disk/terraform.tfvars b/examples/azure-vm-simple-linux-managed-disk/terraform.tfvars new file mode 100644 index 000000000000..bee98e4e11bc --- /dev/null +++ b/examples/azure-vm-simple-linux-managed-disk/terraform.tfvars @@ -0,0 +1,8 @@ +# Replace with relevant values + +# resource_group = "myresourcegroup" +# rg_prefix = "rg" +# hostname = "myvm" +# dns_name = "mydnsname" +# location = "southcentralus" +# admin_password = "T3rr@f0rmP@ssword" From 5174369a32b753c9980b01165b1d3a12e9ee4c10 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Thu, 4 May 2017 11:47:57 -0500 Subject: [PATCH 55/77] removing vm from user image example from this branch --- examples/azure-vm-from-user-image/README.md | 28 --------- .../after_deploy.ci.sh | 11 ---- .../azure-vm-from-user-image/deploy.ci.sh | 37 ----------- .../azure-vm-from-user-image/deploy.mac.sh | 18 ------ examples/azure-vm-from-user-image/main.tf | 62 ------------------- examples/azure-vm-from-user-image/outputs.tf | 11 ---- examples/azure-vm-from-user-image/provider.tf | 6 -- .../azure-vm-from-user-image/terraform.tfvars | 13 ---- .../azure-vm-from-user-image/variables.tf | 56 ----------------- 9 files changed, 242 deletions(-) delete mode 100644 examples/azure-vm-from-user-image/README.md delete mode 100755 examples/azure-vm-from-user-image/after_deploy.ci.sh delete mode 100755 examples/azure-vm-from-user-image/deploy.ci.sh delete mode 100755 examples/azure-vm-from-user-image/deploy.mac.sh delete mode 100644 examples/azure-vm-from-user-image/main.tf delete mode 100644 examples/azure-vm-from-user-image/outputs.tf delete mode 100644 examples/azure-vm-from-user-image/provider.tf delete mode 100644 examples/azure-vm-from-user-image/terraform.tfvars delete mode 100644 examples/azure-vm-from-user-image/variables.tf diff --git a/examples/azure-vm-from-user-image/README.md b/examples/azure-vm-from-user-image/README.md deleted file mode 100644 index 455b0bcb1a5f..000000000000 --- a/examples/azure-vm-from-user-image/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# [Create a Virtual Machine from a User Image](https://docs.microsoft.com/en-us/azure/virtual-machines/linux/cli-deploy-templates#create-a-custom-vm-image) - -This Terraform template was based on [this](https://github.com/Azure/azure-quickstart-templates/tree/master/101-vm-from-user-image) Azure Quickstart Template. Changes to the ARM template may have occured since the creation of this example may not be reflected here. - - - - - -> Prerequisite - The generalized image VHD should exist, as well as a Storage Account for boot diagnostics - -This template allows you to create a Virtual Machine from an unmanaged User image vhd. This template also deploys a Virtual Network, Public IP addresses and a Network Interface. - -## main.tf -The `main.tf` file contains the actual resources that will be deployed. It also contains the Azure Resource Group definition and any defined variables. - -## outputs.tf -This data is outputted when `terraform apply` is called, and can be queried using the `terraform output` command. - -## provider.tf -Azure requires that an application is added to Azure Active Directory to generate the `client_id`, `client_secret`, and `tenant_id` needed by Terraform (`subscription_id` can be recovered from your Azure account details). Please go [here](https://www.terraform.io/docs/providers/azurerm/) for full instructions on how to create this to populate your `provider.tf` file. - -## terraform.tfvars -If a `terraform.tfvars` file is present in the current directory, Terraform automatically loads it to populate variables. We don't recommend saving usernames and password to version control, but you can create a local secret variables file and use `-var-file` to load it. - -If you are committing this template to source control, please insure that you add this file to your `.gitignore` file. - -## variables.tf -The `variables.tf` file contains all of the input parameters that the user can specify when deploying this Terraform template. diff --git a/examples/azure-vm-from-user-image/after_deploy.ci.sh b/examples/azure-vm-from-user-image/after_deploy.ci.sh deleted file mode 100755 index 8a5624eb7681..000000000000 --- a/examples/azure-vm-from-user-image/after_deploy.ci.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -set -o errexit -o nounset - -docker run --rm -it \ - azuresdk/azure-cli-python \ - sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID; \ - az vm delete --name $KEY --resource-group permanent -y; \ - az network nic delete --name $KEY'nic' --resource-group permanent; \ - az network vnet delete --name $KEY'vnet' --resource-group permanent; \ - az network public-ip delete --name $KEY'-ip' --resource-group permanent;" diff --git a/examples/azure-vm-from-user-image/deploy.ci.sh b/examples/azure-vm-from-user-image/deploy.ci.sh deleted file mode 100755 index f45c5bb2a6cd..000000000000 --- a/examples/azure-vm-from-user-image/deploy.ci.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash - -set -o errexit -o nounset - -docker run --rm -it \ - -e ARM_CLIENT_ID \ - -e ARM_CLIENT_SECRET \ - -e ARM_SUBSCRIPTION_ID \ - -e ARM_TENANT_ID \ - -v $(pwd):/data \ - --workdir=/data \ - --entrypoint "/bin/sh" \ - hashicorp/terraform:light \ - -c "/bin/terraform get; \ - /bin/terraform validate; \ - /bin/terraform plan -out=out.tfplan -var hostname=$KEY -var resource_group=$EXISTING_RESOURCE_GROUP -var admin_username=$KEY -var admin_password=$PASSWORD -var image_uri=$EXISTING_IMAGE_URI -var storage_account_name=$EXISTING_STORAGE_ACCOUNT_NAME; \ - /bin/terraform apply out.tfplan" - -# echo "Setting git user name" -# git config user.name $GH_USER_NAME -# -# echo "Setting git user email" -# git config user.email $GH_USER_EMAIL -# -# echo "Adding git upstream remote" -# git remote add upstream "https://$GH_TOKEN@github.com/$GH_REPO.git" -# -# git checkout master - - -# -# NOW=$(TZ=America/Chicago date) -# -# git commit -m "tfstate: $NOW [ci skip]" -# -# echo "Pushing changes to upstream master" -# git push upstream master diff --git a/examples/azure-vm-from-user-image/deploy.mac.sh b/examples/azure-vm-from-user-image/deploy.mac.sh deleted file mode 100755 index acd4ca7028fc..000000000000 --- a/examples/azure-vm-from-user-image/deploy.mac.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -set -o errexit -o nounset - -if docker -v; then - - # generate a unique string for CI deployment - export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) - export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) - export EXISTING_IMAGE_URI=https://permanentstor.blob.core.windows.net/permanent-vhds/permanent-osdisk1.vhd - export EXISTING_STORAGE_ACCOUNT_NAME=permanentstor - export EXISTING_RESOURCE_GROUP=permanent - - /bin/sh ./deploy.ci.sh - -else - echo "Docker is used to run terraform commands, please install before run: https://docs.docker.com/docker-for-mac/install/" -fi diff --git a/examples/azure-vm-from-user-image/main.tf b/examples/azure-vm-from-user-image/main.tf deleted file mode 100644 index 28edf99204b5..000000000000 --- a/examples/azure-vm-from-user-image/main.tf +++ /dev/null @@ -1,62 +0,0 @@ -resource "azurerm_resource_group" "rg" { - name = "${var.resource_group}" - location = "${var.location}" -} - -resource "azurerm_virtual_network" "vnet" { - name = "${var.hostname}vnet" - location = "${var.location}" - address_space = ["${var.address_space}"] - resource_group_name = "${azurerm_resource_group.rg.name}" -} - -resource "azurerm_subnet" "subnet" { - name = "${var.hostname}subnet" - virtual_network_name = "${azurerm_virtual_network.vnet.name}" - resource_group_name = "${azurerm_resource_group.rg.name}" - address_prefix = "${var.subnet_prefix}" -} - -resource "azurerm_network_interface" "nic" { - name = "${var.hostname}nic" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - - ip_configuration { - name = "${var.hostname}ipconfig" - subnet_id = "${azurerm_subnet.subnet.id}" - private_ip_address_allocation = "Dynamic" - public_ip_address_id = "${azurerm_public_ip.pip.id}" - } -} - -resource "azurerm_public_ip" "pip" { - name = "${var.hostname}-ip" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - public_ip_address_allocation = "dynamic" - domain_name_label = "${var.hostname}" -} - -resource "azurerm_virtual_machine" "vm" { - name = "${var.hostname}" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - vm_size = "${var.vm_size}" - network_interface_ids = ["${azurerm_network_interface.nic.id}"] - - storage_os_disk { - name = "${var.hostname}-osdisk1" - image_uri = "${var.image_uri}" - vhd_uri = "https://${var.storage_account_name}.blob.core.windows.net/vhds/${var.hostname}osdisk.vhd" - os_type = "${var.os_type}" - caching = "ReadWrite" - create_option = "FromImage" - } - - os_profile { - computer_name = "${var.hostname}" - admin_username = "${var.admin_username}" - admin_password = "${var.admin_password}" - } -} diff --git a/examples/azure-vm-from-user-image/outputs.tf b/examples/azure-vm-from-user-image/outputs.tf deleted file mode 100644 index e0e255a9e01c..000000000000 --- a/examples/azure-vm-from-user-image/outputs.tf +++ /dev/null @@ -1,11 +0,0 @@ -output "hostname" { - value = "${var.hostname}" -} - -output "vm_fqdn" { - value = "${azurerm_public_ip.pip.fqdn}" -} - -output "sshCommand" { - value = "${concat("ssh ", var.admin_username, "@", azurerm_public_ip.pip.fqdn)}" -} diff --git a/examples/azure-vm-from-user-image/provider.tf b/examples/azure-vm-from-user-image/provider.tf deleted file mode 100644 index bdf0583f3259..000000000000 --- a/examples/azure-vm-from-user-image/provider.tf +++ /dev/null @@ -1,6 +0,0 @@ -# provider "azurerm" { -# subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" -# client_id = "REPLACE-WITH-YOUR-CLIENT-ID" -# client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" -# tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" -# } diff --git a/examples/azure-vm-from-user-image/terraform.tfvars b/examples/azure-vm-from-user-image/terraform.tfvars deleted file mode 100644 index 15da2a9c6ca7..000000000000 --- a/examples/azure-vm-from-user-image/terraform.tfvars +++ /dev/null @@ -1,13 +0,0 @@ -# resource_group = "myresourcegroup" -# image_uri = "https://DISK.blob.core.windows.net/vhds/ORIGINAL-VM.vhd" -# primary_blob_endpoint = "https://DISK.blob.core.windows.net/" -# location = "southcentralus" -# os_type = "linux" -# address_space = "10.0.0.0/16" -# subnet_prefix = "10.0.0.0/24" -# storage_account_name = "STOR-ACCT-NAME" -# storage_account_type = "Standard_LRS" -# vm_size = "Standard_DS1_v2" -# hostname = "HOSTNAME" -# admin_username = "vmadmin" -# admin_password = "YOURPASSWORDHERE" diff --git a/examples/azure-vm-from-user-image/variables.tf b/examples/azure-vm-from-user-image/variables.tf deleted file mode 100644 index b3e94928978d..000000000000 --- a/examples/azure-vm-from-user-image/variables.tf +++ /dev/null @@ -1,56 +0,0 @@ -variable "resource_group" { - description = "The name of the resource group in which the image to clone resides." - default = "myrg" -} - -variable "image_uri" { - description = "Specifies the image_uri in the form publisherName:offer:skus:version. image_uri can also specify the VHD uri of a custom VM image to clone." -} - -variable "os_type" { - description = "Specifies the operating system Type, valid values are windows, linux." - default = "linux" -} - -variable "location" { - description = "The location/region where the virtual network is created. Changing this forces a new resource to be created." - default = "southcentralus" -} - -variable "address_space" { - description = "The address space that is used by the virtual network. You can supply more than one address space. Changing this forces a new resource to be created." - default = "10.0.0.0/24" -} - -variable "subnet_prefix" { - description = "The address prefix to use for the subnet." - default = "10.0.0.0/24" -} - -variable "storage_account_name" { - description = "The name of the storage account in which the image from which you are cloning resides." -} - -variable "storage_account_type" { - description = "Defines the type of storage account to be created. Valid options are Standard_LRS, Standard_ZRS, Standard_GRS, Standard_RAGRS, Premium_LRS. Changing this is sometimes valid - see the Azure documentation for more information on which types of accounts can be converted into other types." - default = "Premium_LRS" -} - -variable "vm_size" { - description = "Specifies the size of the virtual machine. This must be the same as the vm image from which you are copying." - default = "Standard_DS1_v2" -} - -variable "hostname" { - description = "VM name referenced also in storage-related names. This is also used as the label for the Domain Name and to make up the FQDN. If a domain name label is specified, an A DNS record is created for the public IP in the Microsoft Azure DNS system." -} - -variable "admin_username" { - description = "administrator user name" - default = "vmadmin" -} - -variable "admin_password" { - description = "administrator password (recommended to disable password auth)" - default = "T3rr@f0rmP@ssword" -} From 1366980b8b8a03eadd4472d9d9346d50eeebb9c0 Mon Sep 17 00:00:00 2001 From: Annie Hedgpeth Date: Thu, 4 May 2017 18:10:14 -0500 Subject: [PATCH 56/77] removed old branch --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 907dafde5d25..2432ad83a56b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,5 +36,4 @@ deploy: script: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./deploy.ci.sh on: repo: harijayms/terraform - branch: topic-101-vm-from-user-image - branch: master \ No newline at end of file + branch: master From 6a1813e07fa3412b86d523973c96374c1976ea64 Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Fri, 5 May 2017 15:08:09 -0500 Subject: [PATCH 57/77] azure-2-vms-loadbalancer-lbrules (#13) * initial commit * need to change lb_rule & nic * deploys locally * updated README * updated travis and deploy scripts for Hari's repo * renamed deploy script * clean up * prep for PR * updated readme * fixing conflict in .travis.yml --- .travis.yml | 2 +- .../README.md | 26 ++++ .../deploy.ci.sh | 36 +++++ .../deploy.mac.sh | 15 ++ .../azure-2-vms-loadbalancer-lbrules/main.tf | 138 ++++++++++++++++++ .../outputs.tf | 11 ++ .../provider.tf | 6 + .../terraform.tfvars | 6 + .../variables.tf | 80 ++++++++++ 9 files changed, 319 insertions(+), 1 deletion(-) create mode 100644 examples/azure-2-vms-loadbalancer-lbrules/README.md create mode 100755 examples/azure-2-vms-loadbalancer-lbrules/deploy.ci.sh create mode 100755 examples/azure-2-vms-loadbalancer-lbrules/deploy.mac.sh create mode 100644 examples/azure-2-vms-loadbalancer-lbrules/main.tf create mode 100644 examples/azure-2-vms-loadbalancer-lbrules/outputs.tf create mode 100644 examples/azure-2-vms-loadbalancer-lbrules/provider.tf create mode 100644 examples/azure-2-vms-loadbalancer-lbrules/terraform.tfvars create mode 100644 examples/azure-2-vms-loadbalancer-lbrules/variables.tf diff --git a/.travis.yml b/.travis.yml index 2432ad83a56b..93e8b1d03795 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,4 +36,4 @@ deploy: script: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./deploy.ci.sh on: repo: harijayms/terraform - branch: master + branch: master \ No newline at end of file diff --git a/examples/azure-2-vms-loadbalancer-lbrules/README.md b/examples/azure-2-vms-loadbalancer-lbrules/README.md new file mode 100644 index 000000000000..d7ca3d4d3cb6 --- /dev/null +++ b/examples/azure-2-vms-loadbalancer-lbrules/README.md @@ -0,0 +1,26 @@ +# Create 2 Virtual Machines under a Load balancer and configures Load Balancing rules for the VMs + +This Terraform template was based on [this](https://github.com/Azure/azure-quickstart-templates/tree/master/201-2-vms-loadbalancer-lbrules) Azure Quickstart Template. Changes to the ARM template may have occured since the creation of this example may not be reflected here. + + + + + +This template allows you to create 2 Virtual Machines under a Load balancer and configure a load balancing rule on Port 80. This template also deploys a Storage Account, Virtual Network, Public IP address, Availability Set, and Network Interfaces. + +## main.tf +The `main.tf` file contains the actual resources that will be deployed. It also contains the Azure Resource Group definition and any defined variables. + +## outputs.tf +This data is outputted when `terraform apply` is called, and can be queried using the `terraform output` command. + +## provider.tf +Azure requires that an application is added to Azure Active Directory to generate the `client_id`, `client_secret`, and `tenant_id` needed by Terraform (`subscription_id` can be recovered from your Azure account details). Please go [here](https://www.terraform.io/docs/providers/azurerm/) for full instructions on how to create this to populate your `provider.tf` file. + +## terraform.tfvars +If a `terraform.tfvars` file is present in the current directory, Terraform automatically loads it to populate variables. We don't recommend saving usernames and password to version control, but you can create a local secret variables file and use `-var-file` to load it. + +If you are committing this template to source control, please insure that you add this file to your .gitignore file. + +## variables.tf +The `variables.tf` file contains all of the input parameters that the user can specify when deploying this Terraform template. diff --git a/examples/azure-2-vms-loadbalancer-lbrules/deploy.ci.sh b/examples/azure-2-vms-loadbalancer-lbrules/deploy.ci.sh new file mode 100755 index 000000000000..57e0dc9b1a42 --- /dev/null +++ b/examples/azure-2-vms-loadbalancer-lbrules/deploy.ci.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +set -o errexit -o nounset + +docker run --rm -it \ + -e ARM_CLIENT_ID \ + -e ARM_CLIENT_SECRET \ + -e ARM_SUBSCRIPTION_ID \ + -e ARM_TENANT_ID \ + -v $(pwd):/data \ + --entrypoint "/bin/sh" \ + hashicorp/terraform:light \ + -c "cd /data; \ + /bin/terraform get; \ + /bin/terraform validate; \ + /bin/terraform plan -out=out.tfplan -var dns_name=$KEY -var hostname=$KEY -var lb_ip_dns_name=$KEY -var resource_group=$KEY -var admin_password=$PASSWORD; \ + /bin/terraform apply out.tfplan" + +# cleanup deployed azure resources via azure-cli +docker run --rm -it \ + azuresdk/azure-cli-python \ + sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID > /dev/null; \ + az network lb show -g $KEY -n rglb; \ + az network lb rule list -g $KEY --lb-name rglb;" + +# cleanup deployed azure resources via terraform +docker run --rm -it \ + -e ARM_CLIENT_ID \ + -e ARM_CLIENT_SECRET \ + -e ARM_SUBSCRIPTION_ID \ + -e ARM_TENANT_ID \ + -v $(pwd):/data \ + --workdir=/data \ + --entrypoint "/bin/sh" \ + hashicorp/terraform:light \ + -c "/bin/terraform destroy -force -var dns_name=$KEY -var hostname=$KEY -var lb_ip_dns_name=$KEY -var resource_group=$KEY -var admin_password=$PASSWORD;" diff --git a/examples/azure-2-vms-loadbalancer-lbrules/deploy.mac.sh b/examples/azure-2-vms-loadbalancer-lbrules/deploy.mac.sh new file mode 100755 index 000000000000..cf5cdc32279f --- /dev/null +++ b/examples/azure-2-vms-loadbalancer-lbrules/deploy.mac.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +set -o errexit -o nounset + +if docker -v; then + + # generate a unique string for CI deployment + export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) + export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) + +/bin/sh ./deploy.ci.sh + +else + echo "Docker is used to run terraform commands, please install before run: https://docs.docker.com/docker-for-mac/install/" +fi \ No newline at end of file diff --git a/examples/azure-2-vms-loadbalancer-lbrules/main.tf b/examples/azure-2-vms-loadbalancer-lbrules/main.tf new file mode 100644 index 000000000000..24981118d3e2 --- /dev/null +++ b/examples/azure-2-vms-loadbalancer-lbrules/main.tf @@ -0,0 +1,138 @@ +resource "azurerm_resource_group" "rg" { + name = "${var.resource_group}" + location = "${var.location}" +} + +resource "azurerm_storage_account" "stor" { + name = "${var.dns_name}stor" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + account_type = "${var.storage_account_type}" +} + +resource "azurerm_availability_set" "avset" { + name = "${var.dns_name}avset" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + platform_fault_domain_count = 2 + platform_update_domain_count = 2 + managed = true +} + +resource "azurerm_public_ip" "lbpip" { + name = "${var.rg_prefix}-ip" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + public_ip_address_allocation = "dynamic" + domain_name_label = "${var.lb_ip_dns_name}" +} + +resource "azurerm_virtual_network" "vnet" { + name = "${var.virtual_network_name}" + location = "${var.location}" + address_space = ["${var.address_space}"] + resource_group_name = "${azurerm_resource_group.rg.name}" +} + +resource "azurerm_subnet" "subnet" { + name = "${var.rg_prefix}subnet" + virtual_network_name = "${azurerm_virtual_network.vnet.name}" + resource_group_name = "${azurerm_resource_group.rg.name}" + address_prefix = "${var.subnet_prefix}" +} + +resource "azurerm_lb" "lb" { + resource_group_name = "${azurerm_resource_group.rg.name}" + name = "${var.rg_prefix}lb" + location = "${var.location}" + + frontend_ip_configuration { + name = "LoadBalancerFrontEnd" + public_ip_address_id = "${azurerm_public_ip.lbpip.id}" + } +} + +resource "azurerm_lb_backend_address_pool" "backend_pool" { + resource_group_name = "${azurerm_resource_group.rg.name}" + loadbalancer_id = "${azurerm_lb.lb.id}" + name = "BackendPool1" +} + +resource "azurerm_lb_nat_rule" "tcp" { + resource_group_name = "${azurerm_resource_group.rg.name}" + loadbalancer_id = "${azurerm_lb.lb.id}" + name = "RDP-VM-${count.index}" + protocol = "tcp" + frontend_port = "5000${count.index + 1}" + backend_port = 3389 + frontend_ip_configuration_name = "LoadBalancerFrontEnd" + count = 2 +} + +resource "azurerm_lb_rule" "lb_rule" { + resource_group_name = "${azurerm_resource_group.rg.name}" + loadbalancer_id = "${azurerm_lb.lb.id}" + name = "LBRule" + protocol = "tcp" + frontend_port = 80 + backend_port = 80 + frontend_ip_configuration_name = "LoadBalancerFrontEnd" + enable_floating_ip = false + backend_address_pool_id = "${azurerm_lb_backend_address_pool.backend_pool.id}" + idle_timeout_in_minutes = 5 + probe_id = "${azurerm_lb_probe.lb_probe.id}" + depends_on = ["azurerm_lb_probe.lb_probe"] +} + +resource "azurerm_lb_probe" "lb_probe" { + resource_group_name = "${azurerm_resource_group.rg.name}" + loadbalancer_id = "${azurerm_lb.lb.id}" + name = "tcpProbe" + protocol = "tcp" + port = 80 + interval_in_seconds = 5 + number_of_probes = 2 +} + +resource "azurerm_network_interface" "nic" { + name = "nic${count.index}" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + count = 2 + + ip_configuration { + name = "ipconfig${count.index}" + subnet_id = "${azurerm_subnet.subnet.id}" + private_ip_address_allocation = "Dynamic" + load_balancer_backend_address_pools_ids = ["${azurerm_lb_backend_address_pool.backend_pool.id}"] + load_balancer_inbound_nat_rules_ids = ["${element(azurerm_lb_nat_rule.tcp.*.id, count.index)}"] + } +} + +resource "azurerm_virtual_machine" "vm" { + name = "vm${count.index}" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + availability_set_id = "${azurerm_availability_set.avset.id}" + vm_size = "${var.vm_size}" + network_interface_ids = ["${element(azurerm_network_interface.nic.*.id, count.index)}"] + count = 2 + + storage_image_reference { + publisher = "${var.image_publisher}" + offer = "${var.image_offer}" + sku = "${var.image_sku}" + version = "${var.image_version}" + } + + storage_os_disk { + name = "osdisk${count.index}" + create_option = "FromImage" + } + + os_profile { + computer_name = "${var.hostname}" + admin_username = "${var.admin_username}" + admin_password = "${var.admin_password}" + } +} diff --git a/examples/azure-2-vms-loadbalancer-lbrules/outputs.tf b/examples/azure-2-vms-loadbalancer-lbrules/outputs.tf new file mode 100644 index 000000000000..a21a9568b688 --- /dev/null +++ b/examples/azure-2-vms-loadbalancer-lbrules/outputs.tf @@ -0,0 +1,11 @@ +output "hostname" { + value = "${var.hostname}" +} + +output "vm_fqdn" { + value = "${azurerm_public_ip.lbpip.fqdn}" +} + +output "sshCommand" { + value = "ssh ${var.admin_username}@${azurerm_public_ip.lbpip.fqdn}" +} diff --git a/examples/azure-2-vms-loadbalancer-lbrules/provider.tf b/examples/azure-2-vms-loadbalancer-lbrules/provider.tf new file mode 100644 index 000000000000..bdf0583f3259 --- /dev/null +++ b/examples/azure-2-vms-loadbalancer-lbrules/provider.tf @@ -0,0 +1,6 @@ +# provider "azurerm" { +# subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" +# client_id = "REPLACE-WITH-YOUR-CLIENT-ID" +# client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" +# tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" +# } diff --git a/examples/azure-2-vms-loadbalancer-lbrules/terraform.tfvars b/examples/azure-2-vms-loadbalancer-lbrules/terraform.tfvars new file mode 100644 index 000000000000..824d4a691b61 --- /dev/null +++ b/examples/azure-2-vms-loadbalancer-lbrules/terraform.tfvars @@ -0,0 +1,6 @@ +# resource_group = "myresourcegroup" +# rg_prefix = "rg" +# hostname = "myvm" +# dns_name = "mydnsname" +# location = "southcentralus" +# admin_password = "T3rr@f0rmP@ssword" diff --git a/examples/azure-2-vms-loadbalancer-lbrules/variables.tf b/examples/azure-2-vms-loadbalancer-lbrules/variables.tf new file mode 100644 index 000000000000..55320c2653a4 --- /dev/null +++ b/examples/azure-2-vms-loadbalancer-lbrules/variables.tf @@ -0,0 +1,80 @@ +variable "resource_group" { + description = "The name of the resource group in which to create the virtual network." +} + +variable "rg_prefix" { + description = "The shortened abbreviation to represent your resource group that will go on the front of some resources." + default = "rg" +} + +variable "hostname" { + description = "VM name referenced also in storage-related names." +} + +variable "dns_name" { + description = " Label for the Domain Name. Will be used to make up the FQDN. If a domain name label is specified, an A DNS record is created for the public IP in the Microsoft Azure DNS system." +} + +variable "lb_ip_dns_name" { + description = "DNS for Load Balancer IP" +} + +variable "location" { + description = "The location/region where the virtual network is created. Changing this forces a new resource to be created." + default = "southcentralus" +} + +variable "virtual_network_name" { + description = "The name for the virtual network." + default = "vnet" +} + +variable "address_space" { + description = "The address space that is used by the virtual network. You can supply more than one address space. Changing this forces a new resource to be created." + default = "10.0.0.0/16" +} + +variable "subnet_prefix" { + description = "The address prefix to use for the subnet." + default = "10.0.10.0/24" +} + +variable "storage_account_type" { + description = "Defines the type of storage account to be created. Valid options are Standard_LRS, Standard_ZRS, Standard_GRS, Standard_RAGRS, Premium_LRS. Changing this is sometimes valid - see the Azure documentation for more information on which types of accounts can be converted into other types." + default = "Standard_LRS" +} + +variable "vm_size" { + description = "Specifies the size of the virtual machine." + default = "Standard_D1" +} + +variable "image_publisher" { + description = "name of the publisher of the image (az vm image list)" + default = "MicrosoftWindowsServer" +} + +variable "image_offer" { + description = "the name of the offer (az vm image list)" + default = "WindowsServer" +} + +variable "image_sku" { + description = "image sku to apply (az vm image list)" + default = "2012-R2-Datacenter" +} + +variable "image_version" { + description = "version of the image to apply (az vm image list)" + default = "latest" +} + +variable "admin_username" { + description = "administrator user name" + default = "vmadmin" +} + +variable "admin_password" { + description = "administrator password (recommended to disable password auth)" + default = "T3rr@f0rmP@ssword" +} From 888b57830ff72f511e8204a48004f705f92e769e Mon Sep 17 00:00:00 2001 From: Scott Nowicki Date: Mon, 8 May 2017 15:23:30 -0500 Subject: [PATCH 58/77] add CI build tag --- examples/azure-vm-simple-linux-managed-disk/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/azure-vm-simple-linux-managed-disk/README.md b/examples/azure-vm-simple-linux-managed-disk/README.md index 0492e3edccb9..79b1d7ee9458 100644 --- a/examples/azure-vm-simple-linux-managed-disk/README.md +++ b/examples/azure-vm-simple-linux-managed-disk/README.md @@ -1,4 +1,4 @@ -# Very simple deployment of a Linux VM +# Very simple deployment of a Linux VM [![Build Status](https://travis-ci.org/harijayms/terraform.svg?branch=topic-101-vm-simple-linux)](https://travis-ci.org/harijayms/terraform) From 08c4d7f4a878b10623ee5a13992c6cf408705169 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Tue, 9 May 2017 13:27:33 -0500 Subject: [PATCH 59/77] initial commit; in progress --- .travis.yml | 7 +- .../README.md | 139 ++++++++++++++++++ .../deploy.ci.sh | 45 ++++++ .../deploy.mac.sh | 18 +++ .../main.tf | 70 +++++++++ .../variables.tf | 91 ++++++++++++ 6 files changed, 365 insertions(+), 5 deletions(-) create mode 100644 examples/azure-vm-custom-image-new-storage-account/README.md create mode 100644 examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh create mode 100644 examples/azure-vm-custom-image-new-storage-account/deploy.mac.sh create mode 100644 examples/azure-vm-custom-image-new-storage-account/main.tf create mode 100644 examples/azure-vm-custom-image-new-storage-account/variables.tf diff --git a/.travis.yml b/.travis.yml index 93e8b1d03795..308517092b76 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,10 +11,7 @@ git: # establish environment variables env: - - TEST_DIR=examples/azure-vm-from-user-image - - TEST_DIR=examples/azure-cdn-with-storage-account - - TEST_DIR=examples/azure-vm-simple-linux-managed-disk - - TEST_DIR=examples/azure-vnet-two-subnets + - TEST_DIR=examples/azure-vm-custom-image-new-storage-account branches: only: @@ -36,4 +33,4 @@ deploy: script: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./deploy.ci.sh on: repo: harijayms/terraform - branch: master \ No newline at end of file + branch: topic-201-vm-custom-image-new-storage-account \ No newline at end of file diff --git a/examples/azure-vm-custom-image-new-storage-account/README.md b/examples/azure-vm-custom-image-new-storage-account/README.md new file mode 100644 index 000000000000..f27f32ab8c8d --- /dev/null +++ b/examples/azure-vm-custom-image-new-storage-account/README.md @@ -0,0 +1,139 @@ +# Create a new VM on a new storage account from a custom image + +This Terraform template was based on [this](https://github.com/Azure/azure-quickstart-templates/tree/master/201-vm-custom-image-new-storage-account) Azure Quickstart Template. Changes to the ARM template that may have occurred since the creation of this example may not be reflected here. + +This template allows you to create a new Virtual Machine from a custom image on a new storage account deployed together with the storage account, which means the source image VHD must be transferred to the newly created storage account before that Virtual Machine is deployed. This is accomplished by the usage of a transfer virtual machine that is deployed and then uses a script via custom script extension to copy the source VHD to the destination storage account. This process is used to overcome the limitation of the custom VHD that needs to reside at the same storage account where new virtual machines based on it will be spun up, the problem arises when you are also deploying the storage account within your template, since the storage account does not exist yet, how can you add the source VHDs beforehand? + +Basically, it creates two VMs, one that is the transfer virtual machine and the second that is the actual virtual machine that is the goal of the deployment. Transfer VM can be removed later. + +The process of this template is: + +1. A Virtual Network is deployed +2. Virtual NICs for both Virtual Machines +3. Storage Account is created +3. Transfer Virtual Machine gets deployed +4. Transfer Virtual Machine starts the custom script extension to start the VHD copy from source to destination storage acounts +5. The new Virtual Machine based on a custom image VHD gets deployed + +## Requirements + +* A preexisting generalized (sysprepped) Windows image. For more information on how to create custom Windows images, please refer to [How to capture a Windows virtual machine in the Resource Manager deployment model](https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-windows-capture-image/) article. +* Source image blob full URL. E.g. https://pmcstorage01.blob.core.windows.net/images/images/Win10MasterImage-osDisk.72451a98-4c26-4375-90c5-0a940dd56bab.vhd. Note that container name always comes after https://pmcstorage01.blob.core.windows.net, in this example it is images. The actual blob name is **images/Win10MasterImage-osDisk.72451a98-4c26-4375-90c5-0a940dd56bab.vhd**. + +## How to deploy this template from Powershell + +###### Deploying using existing parameters file (azuredeploy.parameters.json) + +1. Modify `azuredeploy.parameters.json` parameters file accordingly, be aware that this method can expose your local admin credential since it is defined in the parameters file. + +2. Open Powershell command prompt, change folder to your template folder. + +3. Authenticate to this session + + ```powershell + Add-AzureRmAccount + ``` + +4. Create the new Resource Group where your deployment will happen + + ```powershell + New-AzureRmResourceGroup -Name "myResourceGroupName" -Location "centralus" + ``` + +5. Deploy your template + + ```powershell + New-AzureRmResourceGroupDeployment -Name "myDeploymentName" ` + -ResourceGroupName "myResourceGroupName" ` + -Mode Incremental ` + -TemplateFile .\azuredeploy.json ` + -TemplateParameterFile .\azuredeploy.parameters.json ` + -Force -Verbose + ``` + +###### Deploying without using existing parameters file (azuredeploy.parameters.json) + +1. Open Powershell command prompt, change folder to your template folder. + +2. Authenticate to this session + + ```powershell + Add-AzureRmAccount + ``` + +3. Create the new Resource Group where your deployment will happen + + ```powershell + New-AzureRmResourceGroup -Name "myResourceGroupName" -Location "centralus" + ``` + +4. Obtain a credential object that will be used to define your local administrator name and password. Note that you can define those variables in clear text too, but this is not recommended. + + ```powershell + $credential = Get-Credential + ``` + +5. (Optional if you know the image name already) Getting source storage account authorization Key. Note that this is an automated way to get this key, you can get it directly from the new portal and define the content directly. + + If your source storage account is based on Azure Service Manager management model: + ```powershell + $sourceStorageAccountName = "mysourcestorageaccount" + $storageKey = (Get-AzureStorageKey -StorageAccountName $sourceStorageAccountName).Primary + $saContext = New-AzureStorageContext -StorageAccountName $sourceStorageAccountName -StorageAccountKey $storageKey + $sourceVhdContainer = "images" + ``` + + If your source storage account is based on Azure Resource Manager management model: + ```powershell + $sourceStorageAccountName = "mysourcestorageaccount" + $sourceSaResourceGroupName = "myRgWhereSaResides" + $storageKey = (Get-AzureRmStorageAccountKey -StorageAccountName $sourceStorageAccountName -ResourceGroup $sourceSaResourceGroupName).Key1 + $saContext = New-AzureStorageContext -StorageAccountName $sourceStorageAccountName -StorageAccountKey $storagekey + $sourceVhdContainer = "images" + ``` + +6. (Optional if you know the image name already) How to list blobs from Powershell, previous step is mandatory to obtain the storage account context object. In this example the custom images resides in **images** container. + + ```powershell + $vhds = Get-AzureStorageBlob -Container $sourceVhdContainer -Context $saContext -Blob *.vhd + $vhds | Format-Table -AutoSize + ``` + + In this output, Name column is the image name to be used + ``` + Name BlobType Length ContentType LastModified SnapshotTime + ---- -------- ------ ----------- ------------ ------------ + images/SqlSccmMasterImage-osDisk.37383203-eeba-414c-a2ea-c7be33f970fa.vhd PageBlob 136367309312 application/octet-stream 3/3/2016 3:13:25 PM +00:00 + images/Win10MasterImage-osDisk.72451a98-4c26-4375-90c5-0a940dd56bab.vhd PageBlob 136367309312 application/octet-stream 3/3/2016 3:36:09 PM +00:00 + ``` + +7. Since we already have all necessary information, define the remaining variables required to deploy this template + + ```powershell + $adminUserName = $credential.UserName + $adminPassword = $credential.GetNetworkCredential().Password + # Following line is the equivalent of defining "images/Win10MasterImage-osDisk.72451a98-4c26-4375-90c5-0a940dd56bab.vhd", but here we executed optional steps 5 and 6 and have an array of vhds, we are picking the second vhd + $customImageName = $vhds[1].Name + $sourceImageUri = [string]::Format("http://{0}.blob.core.windows.net/{1}/{2}",$sourceStorageAccountName,$sourceVhdContainer,$customImageName) + $transferVmName = "myTransferVm" + $newVmName = "myNewWin10Vm" + $vmSize = "Standard_D1" + $sourceStorageAccountResourceGroup = $sourceSaResourceGroupName # if you exected step 5 then you can use this variable, otherwise just add the storage account resource group name as string + ``` + +8. Define a hashtable with all parameters + + ```powershell + $parameters = @{"AdminUsername"=$adminUserName;"AdminPassword"=$adminPassword;"sourceStorageAccountResourceGroup"=$sourceStorageAccountResourceGroup;"CustomImageName"=$CustomImageName;"sourceImageUri"=$sourceImageUri;"TransferVmName"=$transferVmName;"NewVmName"=$newVmName;"vmSize"=$vmSize} + ``` + +9. Deploy your template + + ```powershell + New-AzureRmResourceGroupDeployment -Name "myDeploymentName" ` + -ResourceGroupName "myResourceGroupName" ` + -Mode Incremental ` + -TemplateFile .\azuredeploy.json ` + -TemplateParameterObject $parameters ` + -Force -Verbose + ``` \ No newline at end of file diff --git a/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh b/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh new file mode 100644 index 000000000000..37578ed7db12 --- /dev/null +++ b/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +set -o errexit -o nounset + +docker run --rm -it \ + -e ARM_CLIENT_ID \ + -e ARM_CLIENT_SECRET \ + -e ARM_SUBSCRIPTION_ID \ + -e ARM_TENANT_ID \ + -v $(pwd):/data \ + --workdir=/data \ + --entrypoint "/bin/sh" \ + hashicorp/terraform:light \ + -c "/bin/terraform get; \ + /bin/terraform validate; \ + /bin/terraform plan -out=out.tfplan -var hostname=$KEY -var resource_group=$EXISTING_RESOURCE_GROUP -var admin_username=$KEY -var admin_password=$PASSWORD -var image_uri=$EXISTING_IMAGE_URI -var storage_account_name=$EXISTING_STORAGE_ACCOUNT_NAME; \ + /bin/terraform apply out.tfplan; \ + /bin/terraform show;" + +docker run --rm -it \ + azuresdk/azure-cli-python \ + sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID > /dev/null; \ + az vm show --name $KEY --resource-group permanent" + +# cleanup deployed azure resources via terraform +docker run --rm -it \ + -e ARM_CLIENT_ID \ + -e ARM_CLIENT_SECRET \ + -e ARM_SUBSCRIPTION_ID \ + -e ARM_TENANT_ID \ + -v $(pwd):/data \ + --workdir=/data \ + --entrypoint "/bin/sh" \ + hashicorp/terraform:light \ + -c "/bin/terraform destroy -force \ + -var hostname=$KEY \ + -var resource_group=$EXISTING_RESOURCE_GROUP \ + -var admin_username=$KEY \ + -var admin_password=$PASSWORD \ + -var image_uri=$EXISTING_IMAGE_URI \ + -var storage_account_name=$EXISTING_STORAGE_ACCOUNT_NAME \ + -target=azurerm_virtual_machine.vm \ + -target=azurerm_network_interface.nic \ + -target=azurerm_virtual_network.vnet \ + -target=azurerm_public_ip.pip;" diff --git a/examples/azure-vm-custom-image-new-storage-account/deploy.mac.sh b/examples/azure-vm-custom-image-new-storage-account/deploy.mac.sh new file mode 100644 index 000000000000..acd4ca7028fc --- /dev/null +++ b/examples/azure-vm-custom-image-new-storage-account/deploy.mac.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +set -o errexit -o nounset + +if docker -v; then + + # generate a unique string for CI deployment + export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) + export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) + export EXISTING_IMAGE_URI=https://permanentstor.blob.core.windows.net/permanent-vhds/permanent-osdisk1.vhd + export EXISTING_STORAGE_ACCOUNT_NAME=permanentstor + export EXISTING_RESOURCE_GROUP=permanent + + /bin/sh ./deploy.ci.sh + +else + echo "Docker is used to run terraform commands, please install before run: https://docs.docker.com/docker-for-mac/install/" +fi diff --git a/examples/azure-vm-custom-image-new-storage-account/main.tf b/examples/azure-vm-custom-image-new-storage-account/main.tf new file mode 100644 index 000000000000..44dc4458e99d --- /dev/null +++ b/examples/azure-vm-custom-image-new-storage-account/main.tf @@ -0,0 +1,70 @@ +# provider "azurerm" { +# subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" +# client_id = "REPLACE-WITH-YOUR-CLIENT-ID" +# client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" +# tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" +# } + +resource "azurerm_resource_group" "rg" { + name = "${var.resource_group}" + location = "${var.location}" +} + +resource "azurerm_network_interface" "nic" { + name = "nic" + location = "${var.location}" + resource_group_name = "${var.existing_vnet_resource_group}" + + ip_configuration { + name = "ipconfig" + subnet_id = "${var.subnet_id}" # "${azurerm_subnet.subnet.id}" + private_ip_address_allocation = "Dynamic" + public_ip_address_id = "${azurerm_public_ip.pip.id}" + } +} + +resource "azurerm_public_ip" "pip" { + name = "PublicIp" + location = "${var.location}" + resource_group_name = "${var.existing_vnet_resource_group}" + public_ip_address_allocation = "Dynamic" + domain_name_label = "${var.hostname}" +} + +resource "azurerm_storage_account" "stor" { + name = "bootdiagstor" + resource_group_name = "${var.existing_vnet_resource_group}" + location = "${var.location}" + account_type = "${var.storage_account_type}" +} + +resource "azurerm_virtual_machine" "vm" { + name = "${var.hostname}" + location = "${var.location}" + resource_group_name = "${var.existing_vnet_resource_group}" + vm_size = "${var.vm_size}" + network_interface_ids = ["${azurerm_network_interface.nic.id}"] + + storage_os_disk { + name = "${var.hostname}osdisk1" + vhd_uri = "${var.os_disk_vhd_uri}" # "https://${var.storage_account_name}.blob.core.windows.net/vhds/${var.hostname}osdisk.vhd" + os_type = "${var.os_type}" + caching = "ReadWrite" + create_option = "Attach" + } + + os_profile { + computer_name = "${var.hostname}" + admin_username = "${var.admin_username}" + admin_password = "${var.admin_password}" + } + + os_profile_linux_config { + disable_password_authentication = false + } + + boot_diagnostics { + enabled = true + storage_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}" + } +} diff --git a/examples/azure-vm-custom-image-new-storage-account/variables.tf b/examples/azure-vm-custom-image-new-storage-account/variables.tf new file mode 100644 index 000000000000..12d4d0ca837e --- /dev/null +++ b/examples/azure-vm-custom-image-new-storage-account/variables.tf @@ -0,0 +1,91 @@ +variable "existing_vnet_resource_group" { + description = "Name of the existing resource group in which the existing vnet resides" +} + +variable "location" { + description = "The location/region where the virtual network resides." + default = "southcentralus" +} + +variable "existing_storage_account" { + description = "" +} + +variable "existing_vhds" { + description = "" +} + +variable "hostname" { + description = "This variable is used in this template to create the domain name label as well as the virtual machine name. Must be unique." +} + +variable "os_type" { + description = "Type of OS on the existing vhd. Allowed values: 'Windows' or 'Linux'." + default = "Linux" +} + +variable "os_disk_vhd_uri" { + description = "Uri of the existing VHD in ARM standard or premium storage" +} + +variable "existing_virtual_network_name" { + description = "The name for the existing virtual network" + default = "vnet" +} + +variable "subnet_name" { + description = "Name of the subnet in the virtual network you want to use" +} + +variable "subnet_id" { + description = "***put desc here***" +} + +variable "address_space" { + description = "The address space that is used by the virtual network. You can supply more than one address space. Changing this forces a new resource to be created." + default = "10.0.0.0/16" +} + +variable "subnet_prefix" { + description = "The address prefix to use for the subnet." + default = "10.0.10.0/24" +} + +variable "storage_account_type" { + description = "Defines the type of storage account to be created. Valid options are Standard_LRS, Standard_ZRS, Standard_GRS, Standard_RAGRS, Premium_LRS. Changing this is sometimes valid - see the Azure documentation for more information on which types of accounts can be converted into other types." + default = "Standard_GRS" +} + +variable "vm_size" { + description = "Specifies the size of the virtual machine." + default = "Standard_A0" +} + +variable "image_publisher" { + description = "name of the publisher of the image (az vm image list)" + default = "Canonical" +} + +variable "image_offer" { + description = "the name of the offer (az vm image list)" + default = "UbuntuServer" +} + +variable "image_sku" { + description = "image sku to apply (az vm image list)" + default = "16.04-LTS" +} + +variable "image_version" { + description = "version of the image to apply (az vm image list)" + default = "latest" +} + +variable "admin_username" { + description = "administrator user name" + default = "vmadmin" +} + +variable "admin_password" { + description = "administrator password (recommended to disable password auth)" +} From 645a0ebca2a644cbf2e6e50dbb7646b04b7a4f76 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Tue, 9 May 2017 13:28:06 -0500 Subject: [PATCH 60/77] in progress --- examples/azure-vm-custom-image-new-storage-account/variables.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/azure-vm-custom-image-new-storage-account/variables.tf b/examples/azure-vm-custom-image-new-storage-account/variables.tf index 12d4d0ca837e..452f1961e083 100644 --- a/examples/azure-vm-custom-image-new-storage-account/variables.tf +++ b/examples/azure-vm-custom-image-new-storage-account/variables.tf @@ -88,4 +88,4 @@ variable "admin_username" { variable "admin_password" { description = "administrator password (recommended to disable password auth)" -} +} From 58ff5c8f1265427306e9c485baab107864d716ad Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Wed, 10 May 2017 14:17:42 -0500 Subject: [PATCH 61/77] undoing change to readme --- examples/azure-vm-simple-linux-managed-disk/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/azure-vm-simple-linux-managed-disk/README.md b/examples/azure-vm-simple-linux-managed-disk/README.md index 26afb451e81d..cde5c458e82d 100644 --- a/examples/azure-vm-simple-linux-managed-disk/README.md +++ b/examples/azure-vm-simple-linux-managed-disk/README.md @@ -1,4 +1,4 @@ -# Very simple deployment of a Linux VM [![Build Status](https://travis-ci.org/harijayms/terraform.svg?branch=topic-101-vm-simple-linux)](https://travis-ci.org/harijayms/terraform) +# Very simple deployment of a Linux VM This template allows you to deploy a simple Linux VM using a few different options for the Ubuntu version, using the latest patched version. This will deploy an A0 size VM in the resource group location and return the FQDN of the VM. From 915c01736a849084b71c101ea32bbd6022b0ac10 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Wed, 10 May 2017 17:44:06 -0500 Subject: [PATCH 62/77] in progress --- .../deploy.ci.sh | 31 +++++++++++------ .../deploy.mac.sh | 7 ++-- .../main.tf | 33 ++++++++++--------- .../outputs.tf | 11 +++++++ .../variables.tf | 33 +++++++++---------- 5 files changed, 70 insertions(+), 45 deletions(-) create mode 100644 examples/azure-vm-custom-image-new-storage-account/outputs.tf diff --git a/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh b/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh index 37578ed7db12..4c983f4cf20a 100644 --- a/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh +++ b/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh @@ -7,20 +7,31 @@ docker run --rm -it \ -e ARM_CLIENT_SECRET \ -e ARM_SUBSCRIPTION_ID \ -e ARM_TENANT_ID \ + -e EXISTING_SUBNET_ID \ -v $(pwd):/data \ --workdir=/data \ --entrypoint "/bin/sh" \ hashicorp/terraform:light \ -c "/bin/terraform get; \ /bin/terraform validate; \ - /bin/terraform plan -out=out.tfplan -var hostname=$KEY -var resource_group=$EXISTING_RESOURCE_GROUP -var admin_username=$KEY -var admin_password=$PASSWORD -var image_uri=$EXISTING_IMAGE_URI -var storage_account_name=$EXISTING_STORAGE_ACCOUNT_NAME; \ + /bin/terraform plan -out=out.tfplan \ + -var os_disk_vhd_uri=$EXISTING_IMAGE_URI \ + -var hostname=$KEY \ + -var resource_group=$KEY \ + -var existing_vnet_resource_group=$EXISTING_RESOURCE_GROUP \ + -var admin_password=$PASSWORD \ + -var existing_subnet_id=$EXISTING_SUBNET_ID \ + -var existing_subnet_name=$EXISTING_SUBNET_NAME \ + -var existing_virtual_network_name=$EXISTING_VIRTUAL_NETWORK_NAME \ + -var existing_storage_acct=$EXISTING_STORAGE_ACCOUNT_NAME; \ /bin/terraform apply out.tfplan; \ /bin/terraform show;" +# cleanup deployed azure resources via azure-cli docker run --rm -it \ azuresdk/azure-cli-python \ sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID > /dev/null; \ - az vm show --name $KEY --resource-group permanent" + az vm show -g $KEY -n $KEY" # cleanup deployed azure resources via terraform docker run --rm -it \ @@ -33,13 +44,13 @@ docker run --rm -it \ --entrypoint "/bin/sh" \ hashicorp/terraform:light \ -c "/bin/terraform destroy -force \ + -var os_disk_vhd_uri=$EXISTING_IMAGE_URI \ -var hostname=$KEY \ - -var resource_group=$EXISTING_RESOURCE_GROUP \ - -var admin_username=$KEY \ + -var resource_group=$KEY \ + -var existing_vnet_resource_group=$EXISTING_RESOURCE_GROUP \ -var admin_password=$PASSWORD \ - -var image_uri=$EXISTING_IMAGE_URI \ - -var storage_account_name=$EXISTING_STORAGE_ACCOUNT_NAME \ - -target=azurerm_virtual_machine.vm \ - -target=azurerm_network_interface.nic \ - -target=azurerm_virtual_network.vnet \ - -target=azurerm_public_ip.pip;" + -var existing_subnet_id=$EXISTING_SUBNET_ID \ + -var existing_subnet_name=$EXISTING_SUBNET_NAME \ + -var existing_virtual_network_name=$EXISTING_VIRTUAL_NETWORK_NAME \ + -var existing_storage_acct=$EXISTING_STORAGE_ACCOUNT_NAME \ + -target=azurerm_resource_group.rg" \ No newline at end of file diff --git a/examples/azure-vm-custom-image-new-storage-account/deploy.mac.sh b/examples/azure-vm-custom-image-new-storage-account/deploy.mac.sh index acd4ca7028fc..f42729304856 100644 --- a/examples/azure-vm-custom-image-new-storage-account/deploy.mac.sh +++ b/examples/azure-vm-custom-image-new-storage-account/deploy.mac.sh @@ -7,12 +7,15 @@ if docker -v; then # generate a unique string for CI deployment export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) + export EXISTING_RESOURCE_GROUP=permanent export EXISTING_IMAGE_URI=https://permanentstor.blob.core.windows.net/permanent-vhds/permanent-osdisk1.vhd export EXISTING_STORAGE_ACCOUNT_NAME=permanentstor - export EXISTING_RESOURCE_GROUP=permanent + export EXISTING_VIRTUAL_NETWORK_NAME=vqeeopeictwmvnet + export EXISTING_SUBNET_NAME=vqeeopeictwmsubnet + export EXISTING_SUBNET_ID /bin/sh ./deploy.ci.sh else echo "Docker is used to run terraform commands, please install before run: https://docs.docker.com/docker-for-mac/install/" -fi +fi \ No newline at end of file diff --git a/examples/azure-vm-custom-image-new-storage-account/main.tf b/examples/azure-vm-custom-image-new-storage-account/main.tf index 44dc4458e99d..b1d69c2aaaa9 100644 --- a/examples/azure-vm-custom-image-new-storage-account/main.tf +++ b/examples/azure-vm-custom-image-new-storage-account/main.tf @@ -10,30 +10,30 @@ resource "azurerm_resource_group" "rg" { location = "${var.location}" } +resource "azurerm_public_ip" "pip" { + name = "PublicIp" + location = "${var.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + public_ip_address_allocation = "Dynamic" + domain_name_label = "${var.hostname}" +} + resource "azurerm_network_interface" "nic" { name = "nic" location = "${var.location}" - resource_group_name = "${var.existing_vnet_resource_group}" + resource_group_name = "${azurerm_resource_group.rg.name}" ip_configuration { name = "ipconfig" - subnet_id = "${var.subnet_id}" # "${azurerm_subnet.subnet.id}" + subnet_id = "${var.existing_subnet_id}" private_ip_address_allocation = "Dynamic" public_ip_address_id = "${azurerm_public_ip.pip.id}" } } -resource "azurerm_public_ip" "pip" { - name = "PublicIp" - location = "${var.location}" - resource_group_name = "${var.existing_vnet_resource_group}" - public_ip_address_allocation = "Dynamic" - domain_name_label = "${var.hostname}" -} - resource "azurerm_storage_account" "stor" { - name = "bootdiagstor" - resource_group_name = "${var.existing_vnet_resource_group}" + name = "${var.hostname}" + resource_group_name = "${azurerm_resource_group.rg.name}" location = "${var.location}" account_type = "${var.storage_account_type}" } @@ -41,16 +41,17 @@ resource "azurerm_storage_account" "stor" { resource "azurerm_virtual_machine" "vm" { name = "${var.hostname}" location = "${var.location}" - resource_group_name = "${var.existing_vnet_resource_group}" + resource_group_name = "${azurerm_resource_group.rg.name}" vm_size = "${var.vm_size}" network_interface_ids = ["${azurerm_network_interface.nic.id}"] storage_os_disk { name = "${var.hostname}osdisk1" - vhd_uri = "${var.os_disk_vhd_uri}" # "https://${var.storage_account_name}.blob.core.windows.net/vhds/${var.hostname}osdisk.vhd" + image_uri = "${var.os_disk_vhd_uri}" + vhd_uri = "https://${var.existing_storage_acct}.blob.core.windows.net/${var.existing_vnet_resource_group}-vhds/${var.hostname}osdisk.vhd" os_type = "${var.os_type}" caching = "ReadWrite" - create_option = "Attach" + create_option = "FromImage" } os_profile { @@ -67,4 +68,4 @@ resource "azurerm_virtual_machine" "vm" { enabled = true storage_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}" } -} +} \ No newline at end of file diff --git a/examples/azure-vm-custom-image-new-storage-account/outputs.tf b/examples/azure-vm-custom-image-new-storage-account/outputs.tf new file mode 100644 index 000000000000..32c6294ceeab --- /dev/null +++ b/examples/azure-vm-custom-image-new-storage-account/outputs.tf @@ -0,0 +1,11 @@ +output "hostname" { + value = "${var.hostname}" +} + +output "vm_fqdn" { + value = "${azurerm_public_ip.pip.fqdn}" +} + +output "ssh_command" { + value = "ssh ${var.admin_username}@${azurerm_public_ip.pip.fqdn}" +} \ No newline at end of file diff --git a/examples/azure-vm-custom-image-new-storage-account/variables.tf b/examples/azure-vm-custom-image-new-storage-account/variables.tf index 452f1961e083..baf140c0a73f 100644 --- a/examples/azure-vm-custom-image-new-storage-account/variables.tf +++ b/examples/azure-vm-custom-image-new-storage-account/variables.tf @@ -1,3 +1,7 @@ +variable "resource_group" { + description = "Name of the resource group in which to deploy your new Virtual Machine" +} + variable "existing_vnet_resource_group" { description = "Name of the existing resource group in which the existing vnet resides" } @@ -7,38 +11,33 @@ variable "location" { default = "southcentralus" } -variable "existing_storage_account" { - description = "" -} - -variable "existing_vhds" { - description = "" -} - variable "hostname" { description = "This variable is used in this template to create the domain name label as well as the virtual machine name. Must be unique." } variable "os_type" { - description = "Type of OS on the existing vhd. Allowed values: 'Windows' or 'Linux'." - default = "Linux" + description = "Type of OS on the existing vhd. Allowed values: 'windows' or 'linux'." + default = "linux" } variable "os_disk_vhd_uri" { description = "Uri of the existing VHD in ARM standard or premium storage" } +variable "existing_storage_acct" { + description = "The name of the storage account in which your existing VHD and image reside" +} + variable "existing_virtual_network_name" { description = "The name for the existing virtual network" - default = "vnet" } -variable "subnet_name" { - description = "Name of the subnet in the virtual network you want to use" +variable "existing_subnet_name" { + description = "The name for the existing subnet in the existing virtual network" } -variable "subnet_id" { - description = "***put desc here***" +variable "existing_subnet_id" { + description = "The id for the existing subnet in the existing virtual network" } variable "address_space" { @@ -58,7 +57,7 @@ variable "storage_account_type" { variable "vm_size" { description = "Specifies the size of the virtual machine." - default = "Standard_A0" + default = "Standard_DS1_v2" } variable "image_publisher" { @@ -88,4 +87,4 @@ variable "admin_username" { variable "admin_password" { description = "administrator password (recommended to disable password auth)" -} +} \ No newline at end of file From 64db6e49189fe443614ec91b3dfbaa09453ab58c Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Thu, 11 May 2017 11:50:27 -0500 Subject: [PATCH 63/77] in progress --- .../README.md | 120 +----------------- .../deploy.mac.sh | 3 +- .../main.tf | 97 ++++++++++---- .../variables.tf | 63 +++++---- 4 files changed, 115 insertions(+), 168 deletions(-) diff --git a/examples/azure-vm-custom-image-new-storage-account/README.md b/examples/azure-vm-custom-image-new-storage-account/README.md index f27f32ab8c8d..2733f1cb7367 100644 --- a/examples/azure-vm-custom-image-new-storage-account/README.md +++ b/examples/azure-vm-custom-image-new-storage-account/README.md @@ -18,122 +18,6 @@ The process of this template is: ## Requirements * A preexisting generalized (sysprepped) Windows image. For more information on how to create custom Windows images, please refer to [How to capture a Windows virtual machine in the Resource Manager deployment model](https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-windows-capture-image/) article. -* Source image blob full URL. E.g. https://pmcstorage01.blob.core.windows.net/images/images/Win10MasterImage-osDisk.72451a98-4c26-4375-90c5-0a940dd56bab.vhd. Note that container name always comes after https://pmcstorage01.blob.core.windows.net, in this example it is images. The actual blob name is **images/Win10MasterImage-osDisk.72451a98-4c26-4375-90c5-0a940dd56bab.vhd**. +* Source image blob full URL. e.g. https://pmcstorage01.blob.core.windows.net/images/images/Win10MasterImage-osDisk.72451a98-4c26-4375-90c5-0a940dd56bab.vhd. Note that container name always comes after https://pmcstorage01.blob.core.windows.net, in this example it is images. The actual blob name is **images/Win10MasterImage-osDisk.72451a98-4c26-4375-90c5-0a940dd56bab.vhd**. -## How to deploy this template from Powershell - -###### Deploying using existing parameters file (azuredeploy.parameters.json) - -1. Modify `azuredeploy.parameters.json` parameters file accordingly, be aware that this method can expose your local admin credential since it is defined in the parameters file. - -2. Open Powershell command prompt, change folder to your template folder. - -3. Authenticate to this session - - ```powershell - Add-AzureRmAccount - ``` - -4. Create the new Resource Group where your deployment will happen - - ```powershell - New-AzureRmResourceGroup -Name "myResourceGroupName" -Location "centralus" - ``` - -5. Deploy your template - - ```powershell - New-AzureRmResourceGroupDeployment -Name "myDeploymentName" ` - -ResourceGroupName "myResourceGroupName" ` - -Mode Incremental ` - -TemplateFile .\azuredeploy.json ` - -TemplateParameterFile .\azuredeploy.parameters.json ` - -Force -Verbose - ``` - -###### Deploying without using existing parameters file (azuredeploy.parameters.json) - -1. Open Powershell command prompt, change folder to your template folder. - -2. Authenticate to this session - - ```powershell - Add-AzureRmAccount - ``` - -3. Create the new Resource Group where your deployment will happen - - ```powershell - New-AzureRmResourceGroup -Name "myResourceGroupName" -Location "centralus" - ``` - -4. Obtain a credential object that will be used to define your local administrator name and password. Note that you can define those variables in clear text too, but this is not recommended. - - ```powershell - $credential = Get-Credential - ``` - -5. (Optional if you know the image name already) Getting source storage account authorization Key. Note that this is an automated way to get this key, you can get it directly from the new portal and define the content directly. - - If your source storage account is based on Azure Service Manager management model: - ```powershell - $sourceStorageAccountName = "mysourcestorageaccount" - $storageKey = (Get-AzureStorageKey -StorageAccountName $sourceStorageAccountName).Primary - $saContext = New-AzureStorageContext -StorageAccountName $sourceStorageAccountName -StorageAccountKey $storageKey - $sourceVhdContainer = "images" - ``` - - If your source storage account is based on Azure Resource Manager management model: - ```powershell - $sourceStorageAccountName = "mysourcestorageaccount" - $sourceSaResourceGroupName = "myRgWhereSaResides" - $storageKey = (Get-AzureRmStorageAccountKey -StorageAccountName $sourceStorageAccountName -ResourceGroup $sourceSaResourceGroupName).Key1 - $saContext = New-AzureStorageContext -StorageAccountName $sourceStorageAccountName -StorageAccountKey $storagekey - $sourceVhdContainer = "images" - ``` - -6. (Optional if you know the image name already) How to list blobs from Powershell, previous step is mandatory to obtain the storage account context object. In this example the custom images resides in **images** container. - - ```powershell - $vhds = Get-AzureStorageBlob -Container $sourceVhdContainer -Context $saContext -Blob *.vhd - $vhds | Format-Table -AutoSize - ``` - - In this output, Name column is the image name to be used - ``` - Name BlobType Length ContentType LastModified SnapshotTime - ---- -------- ------ ----------- ------------ ------------ - images/SqlSccmMasterImage-osDisk.37383203-eeba-414c-a2ea-c7be33f970fa.vhd PageBlob 136367309312 application/octet-stream 3/3/2016 3:13:25 PM +00:00 - images/Win10MasterImage-osDisk.72451a98-4c26-4375-90c5-0a940dd56bab.vhd PageBlob 136367309312 application/octet-stream 3/3/2016 3:36:09 PM +00:00 - ``` - -7. Since we already have all necessary information, define the remaining variables required to deploy this template - - ```powershell - $adminUserName = $credential.UserName - $adminPassword = $credential.GetNetworkCredential().Password - # Following line is the equivalent of defining "images/Win10MasterImage-osDisk.72451a98-4c26-4375-90c5-0a940dd56bab.vhd", but here we executed optional steps 5 and 6 and have an array of vhds, we are picking the second vhd - $customImageName = $vhds[1].Name - $sourceImageUri = [string]::Format("http://{0}.blob.core.windows.net/{1}/{2}",$sourceStorageAccountName,$sourceVhdContainer,$customImageName) - $transferVmName = "myTransferVm" - $newVmName = "myNewWin10Vm" - $vmSize = "Standard_D1" - $sourceStorageAccountResourceGroup = $sourceSaResourceGroupName # if you exected step 5 then you can use this variable, otherwise just add the storage account resource group name as string - ``` - -8. Define a hashtable with all parameters - - ```powershell - $parameters = @{"AdminUsername"=$adminUserName;"AdminPassword"=$adminPassword;"sourceStorageAccountResourceGroup"=$sourceStorageAccountResourceGroup;"CustomImageName"=$CustomImageName;"sourceImageUri"=$sourceImageUri;"TransferVmName"=$transferVmName;"NewVmName"=$newVmName;"vmSize"=$vmSize} - ``` - -9. Deploy your template - - ```powershell - New-AzureRmResourceGroupDeployment -Name "myDeploymentName" ` - -ResourceGroupName "myResourceGroupName" ` - -Mode Incremental ` - -TemplateFile .\azuredeploy.json ` - -TemplateParameterObject $parameters ` - -Force -Verbose - ``` \ No newline at end of file +![graph](/examples/azure-vm-custom-image-new-storage-account/graph.png) \ No newline at end of file diff --git a/examples/azure-vm-custom-image-new-storage-account/deploy.mac.sh b/examples/azure-vm-custom-image-new-storage-account/deploy.mac.sh index f42729304856..9298a501a259 100644 --- a/examples/azure-vm-custom-image-new-storage-account/deploy.mac.sh +++ b/examples/azure-vm-custom-image-new-storage-account/deploy.mac.sh @@ -9,11 +9,12 @@ if docker -v; then export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) export EXISTING_RESOURCE_GROUP=permanent export EXISTING_IMAGE_URI=https://permanentstor.blob.core.windows.net/permanent-vhds/permanent-osdisk1.vhd + # https://donotdeletedisks636.blob.core.windows.net/vhds/mywindowsimage20170510184809.vhd export EXISTING_STORAGE_ACCOUNT_NAME=permanentstor export EXISTING_VIRTUAL_NETWORK_NAME=vqeeopeictwmvnet export EXISTING_SUBNET_NAME=vqeeopeictwmsubnet export EXISTING_SUBNET_ID - +# donotdeletedisks636 /bin/sh ./deploy.ci.sh else diff --git a/examples/azure-vm-custom-image-new-storage-account/main.tf b/examples/azure-vm-custom-image-new-storage-account/main.tf index b1d69c2aaaa9..5ce3b0efe27d 100644 --- a/examples/azure-vm-custom-image-new-storage-account/main.tf +++ b/examples/azure-vm-custom-image-new-storage-account/main.tf @@ -10,45 +10,71 @@ resource "azurerm_resource_group" "rg" { location = "${var.location}" } +resource "azurerm_virtual_network" "vnet" { + name = "${var.hostname}vnet" + location = "${azurerm_resource_group.rg.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + address_space = ["${var.address_space}"] +} + +resource "azurerm_subnet" "subnet" { + name = "${var.hostname}subnet" + virtual_network_name = "${azurerm_virtual_network.vnet.name}" + resource_group_name = "${azurerm_resource_group.rg.name}" + address_prefix = "${var.subnet_prefix}" +} + resource "azurerm_public_ip" "pip" { - name = "PublicIp" - location = "${var.location}" + name = "PublicIp${count.index}" + location = "${azurerm_resource_group.rg.location}" resource_group_name = "${azurerm_resource_group.rg.name}" public_ip_address_allocation = "Dynamic" - domain_name_label = "${var.hostname}" + count = "${var.vm_count}" } resource "azurerm_network_interface" "nic" { - name = "nic" - location = "${var.location}" + name = "nic${count.index}" + location = "${azurerm_resource_group.rg.location}" resource_group_name = "${azurerm_resource_group.rg.name}" + count = "${var.vm_count}" ip_configuration { - name = "ipconfig" - subnet_id = "${var.existing_subnet_id}" + name = "${element(azurerm_public_ip.pip.*.name, count.index)}" + subnet_id = "${azurerm_subnet.subnet.id}" private_ip_address_allocation = "Dynamic" - public_ip_address_id = "${azurerm_public_ip.pip.id}" + public_ip_address_id = "${element(azurerm_public_ip.pip.*.id, count.index)}" + } +} + +resource "azurerm_storage_account" "existing" { + name = "${var.existing_storage_acct}" + resource_group_name = "${var.existing_resource_group}" + location = "${azurerm_resource_group.rg.location}" + account_type = "${var.existing_storage_acct_type}" + + lifecycle = { + prevent_destroy = true } } resource "azurerm_storage_account" "stor" { - name = "${var.hostname}" + name = "${var.hostname}stor" resource_group_name = "${azurerm_resource_group.rg.name}" - location = "${var.location}" + location = "${azurerm_resource_group.rg.location}" account_type = "${var.storage_account_type}" } -resource "azurerm_virtual_machine" "vm" { - name = "${var.hostname}" - location = "${var.location}" +resource "azurerm_virtual_machine" "transfer" { + name = "${var.transfer_vm_name}" + location = "${azurerm_resource_group.rg.location}" resource_group_name = "${azurerm_resource_group.rg.name}" vm_size = "${var.vm_size}" - network_interface_ids = ["${azurerm_network_interface.nic.id}"] + network_interface_ids = ["${element(azurerm_network_interface.nic.*.id, count.index)}"] storage_os_disk { - name = "${var.hostname}osdisk1" - image_uri = "${var.os_disk_vhd_uri}" - vhd_uri = "https://${var.existing_storage_acct}.blob.core.windows.net/${var.existing_vnet_resource_group}-vhds/${var.hostname}osdisk.vhd" + name = "${var.hostname}-osdisk" + image_uri = "${var.source_img_uri}" + vhd_uri = "https://${var.existing_storage_acct}.blob.core.windows.net/${var.existing_resource_group}-vhds/${var.hostname}3osdisk.vhd" os_type = "${var.os_type}" caching = "ReadWrite" create_option = "FromImage" @@ -60,12 +86,39 @@ resource "azurerm_virtual_machine" "vm" { admin_password = "${var.admin_password}" } - os_profile_linux_config { - disable_password_authentication = false - } - boot_diagnostics { enabled = true storage_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}" } -} \ No newline at end of file + + provisioner "file" { + source = "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/201-vm-custom-image-new-storage-account/ImageTransfer.ps1" + destination = "C:/tmp/ImageTransfer.ps1" + + connection { + type = "winrm" + user = "${var.admin_username}" + password = "${var.admin_password}" + host = "${azurerm_public_ip.pip.ip_address}" + } + } + + provisioner "remote-exec" { + inline = [ + "powershell -ExecutionPolicy Unrestricted -File ImageTransfer.ps1 -SourceImage ${var.source_img_uri} -SourceSAKey ${azurerm_storage_account.existing.primary_access_key} -DestinationURI https://${azurerm_storage_account.stor.name}.blob.core.windows.net/vhds -DestinationSAKey ${azurerm_storage_account.stor.primary_access_key}" + ] + + connection { + type = "winrm" + user = "${var.admin_username}" + password = "${var.admin_password}" + host = "${azurerm_public_ip.pip.ip_address}" + } + } + +} + +# *************************************************************************************************************** +# FROM ARM TEMPLATE: +# "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File ','ImageTransfer.ps1 -SourceImage ',parameters('sourceImageURI'),' -SourceSAKey ', listKeys(resourceId(parameters('sourceStorageAccountResourceGroup'),'Microsoft.Storage/storageAccounts', variables('sourceStorageAccountName')), '2015-06-15').key1, ' -DestinationURI https://', variables('StorageAccountName'), '.blob.core.windows.net/vhds', ' -DestinationSAKey ', listKeys(concat('Microsoft.Storage/storageAccounts/', variables('StorageAccountName')), '2015-06-15').key1)]" +# *************************************************************************************************************** diff --git a/examples/azure-vm-custom-image-new-storage-account/variables.tf b/examples/azure-vm-custom-image-new-storage-account/variables.tf index baf140c0a73f..d5dc277505c9 100644 --- a/examples/azure-vm-custom-image-new-storage-account/variables.tf +++ b/examples/azure-vm-custom-image-new-storage-account/variables.tf @@ -1,9 +1,5 @@ variable "resource_group" { - description = "Name of the resource group in which to deploy your new Virtual Machine" -} - -variable "existing_vnet_resource_group" { - description = "Name of the existing resource group in which the existing vnet resides" + description = "Name of the resource group in which to deploy your new Virtual Machines" } variable "location" { @@ -12,33 +8,26 @@ variable "location" { } variable "hostname" { - description = "This variable is used in this template to create the domain name label as well as the virtual machine name. Must be unique." + description = "This variable is used in this template to create various other names, such as vnet name, subnet name, storage account name, et. al." } variable "os_type" { description = "Type of OS on the existing vhd. Allowed values: 'windows' or 'linux'." - default = "linux" -} - -variable "os_disk_vhd_uri" { - description = "Uri of the existing VHD in ARM standard or premium storage" + default = "windows" } variable "existing_storage_acct" { description = "The name of the storage account in which your existing VHD and image reside" } -variable "existing_virtual_network_name" { - description = "The name for the existing virtual network" +variable "existing_storage_acct_type" { + description = "The type of the storage account in which your existing VHD and image reside" } -variable "existing_subnet_name" { - description = "The name for the existing subnet in the existing virtual network" +variable "existing_resource_group" { + description = "The name of the resource group in which your existing storage account with your existing VHD resides" } -variable "existing_subnet_id" { - description = "The id for the existing subnet in the existing virtual network" -} variable "address_space" { description = "The address space that is used by the virtual network. You can supply more than one address space. Changing this forces a new resource to be created." @@ -47,32 +36,36 @@ variable "address_space" { variable "subnet_prefix" { description = "The address prefix to use for the subnet." - default = "10.0.10.0/24" + default = "10.0.0.0/24" } variable "storage_account_type" { description = "Defines the type of storage account to be created. Valid options are Standard_LRS, Standard_ZRS, Standard_GRS, Standard_RAGRS, Premium_LRS. Changing this is sometimes valid - see the Azure documentation for more information on which types of accounts can be converted into other types." - default = "Standard_GRS" + default = "Standard_LRS" +} + +variable "vm_count" { + description = "The total amount of virtual machines to deploy" } variable "vm_size" { - description = "Specifies the size of the virtual machine." + description = "VM size of new virtual machine that will be deployed from a custom image." default = "Standard_DS1_v2" } variable "image_publisher" { description = "name of the publisher of the image (az vm image list)" - default = "Canonical" + default = "MicrosoftWindowsServer" } variable "image_offer" { description = "the name of the offer (az vm image list)" - default = "UbuntuServer" + default = "WindowsServer" } variable "image_sku" { description = "image sku to apply (az vm image list)" - default = "16.04-LTS" + default = "2012-R2-Datacenter" } variable "image_version" { @@ -81,10 +74,26 @@ variable "image_version" { } variable "admin_username" { - description = "administrator user name" + description = "Name of the local administrator account, this cannot be 'Admin', 'Administrator', or 'root'." default = "vmadmin" } variable "admin_password" { - description = "administrator password (recommended to disable password auth)" -} \ No newline at end of file + description = "Local administrator password, complex password is required, do not use any variation of the word 'password' because it will be rejected. Minimum 8 characters." +} + +variable "transfer_vm_name" { + description = "Name of the Windows VM that will perform the copy of the VHD from a source storage account to the new storage account created in the new deployment, this is known as transfer vm. Must be 3-15 characters." +} + +variable "new_vm_name" { + description = "Name of the new VM deployed from the custom image. Must be 3-15 characters." +} + +variable "custom_image_name" { + description = "Name of the VHD to be used as source syspreped/generalized image to deploy the VM, for example 'mybaseimage.vhd'" +} + +variable "source_img_uri" { + description = "Full URIs for one or more custom images (VHDs) that should be copied to the deployment storage account to spin up new VMs from them. URLs must be comma separated." +} From 9828fa34f6d793ec70340eff1396b2bfa2d90ee4 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Thu, 11 May 2017 17:33:27 -0500 Subject: [PATCH 64/77] doesn't winrm --- .../main.tf | 74 +++++++++++++++---- .../outputs.tf | 15 ++-- 2 files changed, 68 insertions(+), 21 deletions(-) diff --git a/examples/azure-vm-custom-image-new-storage-account/main.tf b/examples/azure-vm-custom-image-new-storage-account/main.tf index 5ce3b0efe27d..55b9dcabfb3c 100644 --- a/examples/azure-vm-custom-image-new-storage-account/main.tf +++ b/examples/azure-vm-custom-image-new-storage-account/main.tf @@ -24,25 +24,44 @@ resource "azurerm_subnet" "subnet" { address_prefix = "${var.subnet_prefix}" } -resource "azurerm_public_ip" "pip" { - name = "PublicIp${count.index}" +resource "azurerm_public_ip" "transferpip" { + name = "transferpip" + location = "${azurerm_resource_group.rg.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + public_ip_address_allocation = "Static" +} + +resource "azurerm_network_interface" "transfernic" { + name = "transfernic" + location = "${azurerm_resource_group.rg.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + + ip_configuration { + name = "${azurerm_public_ip.transferpip.name}" + subnet_id = "${azurerm_subnet.subnet.id}" + private_ip_address_allocation = "Static" + public_ip_address_id = "${azurerm_public_ip.transferpip.id}" + private_ip_address = "10.0.0.5" + } +} + +resource "azurerm_public_ip" "mypip" { + name = "mypip" location = "${azurerm_resource_group.rg.location}" resource_group_name = "${azurerm_resource_group.rg.name}" public_ip_address_allocation = "Dynamic" - count = "${var.vm_count}" } -resource "azurerm_network_interface" "nic" { - name = "nic${count.index}" +resource "azurerm_network_interface" "mynic" { + name = "mynic" location = "${azurerm_resource_group.rg.location}" resource_group_name = "${azurerm_resource_group.rg.name}" - count = "${var.vm_count}" ip_configuration { - name = "${element(azurerm_public_ip.pip.*.name, count.index)}" + name = "${azurerm_public_ip.mypip.name}" subnet_id = "${azurerm_subnet.subnet.id}" private_ip_address_allocation = "Dynamic" - public_ip_address_id = "${element(azurerm_public_ip.pip.*.id, count.index)}" + public_ip_address_id = "${azurerm_public_ip.mypip.id}" } } @@ -69,12 +88,12 @@ resource "azurerm_virtual_machine" "transfer" { location = "${azurerm_resource_group.rg.location}" resource_group_name = "${azurerm_resource_group.rg.name}" vm_size = "${var.vm_size}" - network_interface_ids = ["${element(azurerm_network_interface.nic.*.id, count.index)}"] + network_interface_ids = ["${azurerm_network_interface.transfernic.id}"] storage_os_disk { name = "${var.hostname}-osdisk" image_uri = "${var.source_img_uri}" - vhd_uri = "https://${var.existing_storage_acct}.blob.core.windows.net/${var.existing_resource_group}-vhds/${var.hostname}3osdisk.vhd" + vhd_uri = "https://${var.existing_storage_acct}.blob.core.windows.net/${var.existing_resource_group}-vhds/${var.hostname}osdisk.vhd" os_type = "${var.os_type}" caching = "ReadWrite" create_option = "FromImage" @@ -99,7 +118,7 @@ resource "azurerm_virtual_machine" "transfer" { type = "winrm" user = "${var.admin_username}" password = "${var.admin_password}" - host = "${azurerm_public_ip.pip.ip_address}" + host = "${azurerm_public_ip.transferpip.ip_address}" } } @@ -112,13 +131,36 @@ resource "azurerm_virtual_machine" "transfer" { type = "winrm" user = "${var.admin_username}" password = "${var.admin_password}" - host = "${azurerm_public_ip.pip.ip_address}" + host = "${azurerm_public_ip.transferpip.ip_address}" } } } -# *************************************************************************************************************** -# FROM ARM TEMPLATE: -# "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File ','ImageTransfer.ps1 -SourceImage ',parameters('sourceImageURI'),' -SourceSAKey ', listKeys(resourceId(parameters('sourceStorageAccountResourceGroup'),'Microsoft.Storage/storageAccounts', variables('sourceStorageAccountName')), '2015-06-15').key1, ' -DestinationURI https://', variables('StorageAccountName'), '.blob.core.windows.net/vhds', ' -DestinationSAKey ', listKeys(concat('Microsoft.Storage/storageAccounts/', variables('StorageAccountName')), '2015-06-15').key1)]" -# *************************************************************************************************************** +# resource "azurerm_virtual_machine" "new" { +# name = "${var.vm_vm_name}" +# location = "${azurerm_resource_group.rg.location}" +# resource_group_name = "${azurerm_resource_group.rg.name}" +# vm_size = "${var.vm_size}" +# network_interface_ids = ["${element(azurerm_network_interface.nic.*.id, count.index)}"] + +# storage_os_disk { +# name = "${var.hostname}-osdisk" +# image_uri = "${var.source_img_uri}" +# vhd_uri = "https://${var.existing_storage_acct}.blob.core.windows.net/${var.existing_resource_group}-vhds/${var.hostname}5osdisk.vhd" +# os_type = "${var.os_type}" +# caching = "ReadWrite" +# create_option = "FromImage" +# } + +# os_profile { +# computer_name = "${var.hostname}" +# admin_username = "${var.admin_username}" +# admin_password = "${var.admin_password}" +# } + +# boot_diagnostics { +# enabled = true +# storage_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}" +# } +# } diff --git a/examples/azure-vm-custom-image-new-storage-account/outputs.tf b/examples/azure-vm-custom-image-new-storage-account/outputs.tf index 32c6294ceeab..6a0a2e68bbfb 100644 --- a/examples/azure-vm-custom-image-new-storage-account/outputs.tf +++ b/examples/azure-vm-custom-image-new-storage-account/outputs.tf @@ -2,10 +2,15 @@ output "hostname" { value = "${var.hostname}" } -output "vm_fqdn" { - value = "${azurerm_public_ip.pip.fqdn}" +output "ip_address" { + value = "${azurerm_public_ip.transferpip.ip_address}" +} + +output "fqdn" { + value = "${azurerm_public_ip.transferpip.ip_address}" +} + +output "id" { + value = "${azurerm_public_ip.transferpip.id}" } -output "ssh_command" { - value = "ssh ${var.admin_username}@${azurerm_public_ip.pip.fqdn}" -} \ No newline at end of file From a300e6ea51b7892cc303136bce1aea83445d8d48 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Fri, 12 May 2017 17:38:37 -0500 Subject: [PATCH 65/77] deploys locally --- .../main.tf | 142 +++++++++++------- .../outputs.tf | 1 - .../variables.tf | 1 - 3 files changed, 90 insertions(+), 54 deletions(-) diff --git a/examples/azure-vm-custom-image-new-storage-account/main.tf b/examples/azure-vm-custom-image-new-storage-account/main.tf index 55b9dcabfb3c..c796480379c6 100644 --- a/examples/azure-vm-custom-image-new-storage-account/main.tf +++ b/examples/azure-vm-custom-image-new-storage-account/main.tf @@ -10,6 +10,36 @@ resource "azurerm_resource_group" "rg" { location = "${var.location}" } +resource "azurerm_network_security_group" "nsg" { + name = "nsg" + location = "${azurerm_resource_group.rg.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + + security_rule { + name = "5985" + priority = 100 + direction = "Inbound" + access = "Allow" + protocol = "Tcp" + source_port_range = "5985" + destination_port_range = "*" + source_address_prefix = "*" + destination_address_prefix = "*" + } + + security_rule { + name = "RDP" + priority = 110 + direction = "Inbound" + access = "Allow" + protocol = "Tcp" + source_port_range = "*" + destination_port_range = "3389" + source_address_prefix = "*" + destination_address_prefix = "*" + } +} + resource "azurerm_virtual_network" "vnet" { name = "${var.hostname}vnet" location = "${azurerm_resource_group.rg.location}" @@ -32,9 +62,10 @@ resource "azurerm_public_ip" "transferpip" { } resource "azurerm_network_interface" "transfernic" { - name = "transfernic" - location = "${azurerm_resource_group.rg.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" + name = "transfernic" + location = "${azurerm_resource_group.rg.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + network_security_group_id = "${azurerm_network_security_group.nsg.id}" ip_configuration { name = "${azurerm_public_ip.transferpip.name}" @@ -109,58 +140,65 @@ resource "azurerm_virtual_machine" "transfer" { enabled = true storage_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}" } +} - provisioner "file" { - source = "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/201-vm-custom-image-new-storage-account/ImageTransfer.ps1" - destination = "C:/tmp/ImageTransfer.ps1" - - connection { - type = "winrm" - user = "${var.admin_username}" - password = "${var.admin_password}" - host = "${azurerm_public_ip.transferpip.ip_address}" +resource "azurerm_virtual_machine_extension" "script" { + name = "CustomScriptExtension" + location = "${azurerm_resource_group.rg.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" + virtual_machine_name = "${azurerm_virtual_machine.transfer.name}" + publisher = "Microsoft.Compute" + type = "CustomScriptExtension" + type_handler_version = "1.4" + + settings = < Date: Fri, 12 May 2017 23:28:06 -0500 Subject: [PATCH 66/77] added vars to deploy scripts; removed nsg --- .travis.yml | 9 ++--- .../deploy.ci.sh | 21 +++++------- .../deploy.mac.sh | 13 +++----- .../main.tf | 33 +------------------ .../variables.tf | 7 ++-- 5 files changed, 23 insertions(+), 60 deletions(-) diff --git a/.travis.yml b/.travis.yml index 308517092b76..84e11a03ea62 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,16 +15,17 @@ env: branches: only: - - master + # - master - /^(?i:topic)-.*$/ # install terraform before_deploy: - export KEY=$(cat /dev/urandom | tr -cd 'a-z' | head -c 12) - export PASSWORD=$KEY$(cat /dev/urandom | tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | tr -cd '0-9' | head -c 2) - - export EXISTING_IMAGE_URI=https://permanentstor.blob.core.windows.net/permanent-vhds/permanent-osdisk1.vhd - - export EXISTING_STORAGE_ACCOUNT_NAME=permanentstor - - export EXISTING_RESOURCE_GROUP=permanent + - export EXISTING_RESOURCE_GROUP=donotdelete + - export EXISTING_IMAGE_URI=https://donotdeletedisks636.blob.core.windows.net/vhds/mywindowsimage20170510184809.vhd + - export EXISTING_STORAGE_ACCOUNT_NAME=donotdeletedisks636 + - export CUSTOM_IMAGE_NAME=mywindowsimage20170510184809 # terraform deploy + script deploy: diff --git a/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh b/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh index 4c983f4cf20a..205761b7667e 100644 --- a/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh +++ b/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh @@ -15,15 +15,13 @@ docker run --rm -it \ -c "/bin/terraform get; \ /bin/terraform validate; \ /bin/terraform plan -out=out.tfplan \ - -var os_disk_vhd_uri=$EXISTING_IMAGE_URI \ + -var source_img_uri=$EXISTING_IMAGE_URI \ -var hostname=$KEY \ -var resource_group=$KEY \ - -var existing_vnet_resource_group=$EXISTING_RESOURCE_GROUP \ + -var existing_resource_group=$EXISTING_RESOURCE_GROUP \ -var admin_password=$PASSWORD \ - -var existing_subnet_id=$EXISTING_SUBNET_ID \ - -var existing_subnet_name=$EXISTING_SUBNET_NAME \ - -var existing_virtual_network_name=$EXISTING_VIRTUAL_NETWORK_NAME \ - -var existing_storage_acct=$EXISTING_STORAGE_ACCOUNT_NAME; \ + -var existing_storage_acct=$EXISTING_STORAGE_ACCOUNT_NAME \ + -var custom_image_name=$CUSTOM_IMAGE_NAME; \ /bin/terraform apply out.tfplan; \ /bin/terraform show;" @@ -31,7 +29,8 @@ docker run --rm -it \ docker run --rm -it \ azuresdk/azure-cli-python \ sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID > /dev/null; \ - az vm show -g $KEY -n $KEY" + az vm show -g $KEY -n myvm; \ + az storage account show -g $KEY -n $KEY" # cleanup deployed azure resources via terraform docker run --rm -it \ @@ -44,13 +43,11 @@ docker run --rm -it \ --entrypoint "/bin/sh" \ hashicorp/terraform:light \ -c "/bin/terraform destroy -force \ - -var os_disk_vhd_uri=$EXISTING_IMAGE_URI \ + -var source_img_uri=$EXISTING_IMAGE_URI \ -var hostname=$KEY \ -var resource_group=$KEY \ - -var existing_vnet_resource_group=$EXISTING_RESOURCE_GROUP \ + -var existing_resource_group=$EXISTING_RESOURCE_GROUP \ -var admin_password=$PASSWORD \ - -var existing_subnet_id=$EXISTING_SUBNET_ID \ - -var existing_subnet_name=$EXISTING_SUBNET_NAME \ - -var existing_virtual_network_name=$EXISTING_VIRTUAL_NETWORK_NAME \ -var existing_storage_acct=$EXISTING_STORAGE_ACCOUNT_NAME \ + -var custom_image_name=$CUSTOM_IMAGE_NAME; \ -target=azurerm_resource_group.rg" \ No newline at end of file diff --git a/examples/azure-vm-custom-image-new-storage-account/deploy.mac.sh b/examples/azure-vm-custom-image-new-storage-account/deploy.mac.sh index 9298a501a259..3520afac693e 100644 --- a/examples/azure-vm-custom-image-new-storage-account/deploy.mac.sh +++ b/examples/azure-vm-custom-image-new-storage-account/deploy.mac.sh @@ -7,14 +7,11 @@ if docker -v; then # generate a unique string for CI deployment export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) - export EXISTING_RESOURCE_GROUP=permanent - export EXISTING_IMAGE_URI=https://permanentstor.blob.core.windows.net/permanent-vhds/permanent-osdisk1.vhd - # https://donotdeletedisks636.blob.core.windows.net/vhds/mywindowsimage20170510184809.vhd - export EXISTING_STORAGE_ACCOUNT_NAME=permanentstor - export EXISTING_VIRTUAL_NETWORK_NAME=vqeeopeictwmvnet - export EXISTING_SUBNET_NAME=vqeeopeictwmsubnet - export EXISTING_SUBNET_ID -# donotdeletedisks636 + export EXISTING_RESOURCE_GROUP=donotdelete + export EXISTING_IMAGE_URI=https://donotdeletedisks636.blob.core.windows.net/vhds/mywindowsimage20170510184809.vhd + export EXISTING_STORAGE_ACCOUNT_NAME=donotdeletedisks636 + export CUSTOM_IMAGE_NAME=mywindowsimage20170510184809 + /bin/sh ./deploy.ci.sh else diff --git a/examples/azure-vm-custom-image-new-storage-account/main.tf b/examples/azure-vm-custom-image-new-storage-account/main.tf index c796480379c6..769ab4305480 100644 --- a/examples/azure-vm-custom-image-new-storage-account/main.tf +++ b/examples/azure-vm-custom-image-new-storage-account/main.tf @@ -10,36 +10,6 @@ resource "azurerm_resource_group" "rg" { location = "${var.location}" } -resource "azurerm_network_security_group" "nsg" { - name = "nsg" - location = "${azurerm_resource_group.rg.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - - security_rule { - name = "5985" - priority = 100 - direction = "Inbound" - access = "Allow" - protocol = "Tcp" - source_port_range = "5985" - destination_port_range = "*" - source_address_prefix = "*" - destination_address_prefix = "*" - } - - security_rule { - name = "RDP" - priority = 110 - direction = "Inbound" - access = "Allow" - protocol = "Tcp" - source_port_range = "*" - destination_port_range = "3389" - source_address_prefix = "*" - destination_address_prefix = "*" - } -} - resource "azurerm_virtual_network" "vnet" { name = "${var.hostname}vnet" location = "${azurerm_resource_group.rg.location}" @@ -65,7 +35,6 @@ resource "azurerm_network_interface" "transfernic" { name = "transfernic" location = "${azurerm_resource_group.rg.location}" resource_group_name = "${azurerm_resource_group.rg.name}" - network_security_group_id = "${azurerm_network_security_group.nsg.id}" ip_configuration { name = "${azurerm_public_ip.transferpip.name}" @@ -108,7 +77,7 @@ resource "azurerm_storage_account" "existing" { } resource "azurerm_storage_account" "stor" { - name = "${var.hostname}stor" + name = "${var.hostname}" resource_group_name = "${azurerm_resource_group.rg.name}" location = "${azurerm_resource_group.rg.location}" account_type = "${var.storage_account_type}" diff --git a/examples/azure-vm-custom-image-new-storage-account/variables.tf b/examples/azure-vm-custom-image-new-storage-account/variables.tf index bda08bd8c42e..c0684f2c02f7 100644 --- a/examples/azure-vm-custom-image-new-storage-account/variables.tf +++ b/examples/azure-vm-custom-image-new-storage-account/variables.tf @@ -22,6 +22,7 @@ variable "existing_storage_acct" { variable "existing_storage_acct_type" { description = "The type of the storage account in which your existing VHD and image reside" + default = "Premium_LRS" } variable "existing_resource_group" { @@ -43,10 +44,6 @@ variable "storage_account_type" { default = "Standard_LRS" } -variable "vm_count" { - description = "The total amount of virtual machines to deploy" -} - variable "vm_size" { description = "VM size of new virtual machine that will be deployed from a custom image." default = "Standard_DS1_v2" @@ -83,10 +80,12 @@ variable "admin_password" { variable "transfer_vm_name" { description = "Name of the Windows VM that will perform the copy of the VHD from a source storage account to the new storage account created in the new deployment, this is known as transfer vm. Must be 3-15 characters." + default = "transfervm" } variable "new_vm_name" { description = "Name of the new VM deployed from the custom image. Must be 3-15 characters." + default = "myvm" } variable "custom_image_name" { From 4fad6a113e4402ef8e14eb3302b8af58c9daf453 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Fri, 12 May 2017 23:34:03 -0500 Subject: [PATCH 67/77] chmod --- examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh | 0 examples/azure-vm-custom-image-new-storage-account/deploy.mac.sh | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh mode change 100644 => 100755 examples/azure-vm-custom-image-new-storage-account/deploy.mac.sh diff --git a/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh b/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh old mode 100644 new mode 100755 diff --git a/examples/azure-vm-custom-image-new-storage-account/deploy.mac.sh b/examples/azure-vm-custom-image-new-storage-account/deploy.mac.sh old mode 100644 new mode 100755 From a20238a4120e02f77aa64f8b377285b3d67f545c Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Fri, 12 May 2017 23:49:13 -0500 Subject: [PATCH 68/77] https typo --- examples/azure-vm-custom-image-new-storage-account/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/azure-vm-custom-image-new-storage-account/main.tf b/examples/azure-vm-custom-image-new-storage-account/main.tf index 769ab4305480..969c4b0b3de6 100644 --- a/examples/azure-vm-custom-image-new-storage-account/main.tf +++ b/examples/azure-vm-custom-image-new-storage-account/main.tf @@ -153,7 +153,7 @@ resource "azurerm_virtual_machine" "myvm" { storage_os_disk { name = "${var.hostname}myosdisk" - image_uri = "http://${azurerm_storage_account.stor.name}.blob.core.windows.net/vhds/${var.custom_image_name}.vhd" + image_uri = "https://${azurerm_storage_account.stor.name}.blob.core.windows.net/vhds/${var.custom_image_name}.vhd" vhd_uri = "https://${azurerm_storage_account.stor.name}.blob.core.windows.net/${azurerm_resource_group.rg.name}-vhds/${var.hostname}osdisk.vhd" os_type = "${var.os_type}" caching = "ReadWrite" From b1bc33abc25bc87cbb0f0fcde8df2f2fd3625e13 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Sat, 13 May 2017 00:24:11 -0500 Subject: [PATCH 69/77] deploy cleanup --- .travis.yml | 2 +- .../azure-vm-custom-image-new-storage-account/deploy.ci.sh | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 84e11a03ea62..8fef7822110d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,7 +15,7 @@ env: branches: only: - # - master + - master - /^(?i:topic)-.*$/ # install terraform diff --git a/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh b/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh index 205761b7667e..271a40c6aae0 100755 --- a/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh +++ b/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh @@ -7,7 +7,6 @@ docker run --rm -it \ -e ARM_CLIENT_SECRET \ -e ARM_SUBSCRIPTION_ID \ -e ARM_TENANT_ID \ - -e EXISTING_SUBNET_ID \ -v $(pwd):/data \ --workdir=/data \ --entrypoint "/bin/sh" \ @@ -30,7 +29,7 @@ docker run --rm -it \ azuresdk/azure-cli-python \ sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID > /dev/null; \ az vm show -g $KEY -n myvm; \ - az storage account show -g $KEY -n $KEY" + az storage account show -g $KEY -n $KEY;" # cleanup deployed azure resources via terraform docker run --rm -it \ From c8a06180df560961127a9b81ef782638c68dca9a Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Sat, 13 May 2017 22:22:37 -0500 Subject: [PATCH 70/77] deploys locally --- .../deploy.ci.sh | 4 ++-- .../main.tf | 22 ++++++------------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh b/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh index 271a40c6aae0..4737e5261f06 100755 --- a/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh +++ b/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh @@ -48,5 +48,5 @@ docker run --rm -it \ -var existing_resource_group=$EXISTING_RESOURCE_GROUP \ -var admin_password=$PASSWORD \ -var existing_storage_acct=$EXISTING_STORAGE_ACCOUNT_NAME \ - -var custom_image_name=$CUSTOM_IMAGE_NAME; \ - -target=azurerm_resource_group.rg" \ No newline at end of file + -var custom_image_name=$CUSTOM_IMAGE_NAME \ + -target=azurerm_resource_group.rg;" \ No newline at end of file diff --git a/examples/azure-vm-custom-image-new-storage-account/main.tf b/examples/azure-vm-custom-image-new-storage-account/main.tf index 969c4b0b3de6..e59983197e7a 100644 --- a/examples/azure-vm-custom-image-new-storage-account/main.tf +++ b/examples/azure-vm-custom-image-new-storage-account/main.tf @@ -32,9 +32,9 @@ resource "azurerm_public_ip" "transferpip" { } resource "azurerm_network_interface" "transfernic" { - name = "transfernic" - location = "${azurerm_resource_group.rg.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" + name = "transfernic" + location = "${azurerm_resource_group.rg.location}" + resource_group_name = "${azurerm_resource_group.rg.name}" ip_configuration { name = "${azurerm_public_ip.transferpip.name}" @@ -104,11 +104,6 @@ resource "azurerm_virtual_machine" "transfer" { admin_username = "${var.admin_username}" admin_password = "${var.admin_password}" } - - boot_diagnostics { - enabled = true - storage_uri = "${azurerm_storage_account.stor.primary_blob_endpoint}" - } } resource "azurerm_virtual_machine_extension" "script" { @@ -119,6 +114,7 @@ resource "azurerm_virtual_machine_extension" "script" { publisher = "Microsoft.Compute" type = "CustomScriptExtension" type_handler_version = "1.4" + depends_on = ["azurerm_virtual_machine.transfer"] settings = < Date: Sat, 13 May 2017 23:11:38 -0500 Subject: [PATCH 71/77] targeting resources for destroy --- .../deploy.ci.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh b/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh index 4737e5261f06..d87f00abce2e 100755 --- a/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh +++ b/examples/azure-vm-custom-image-new-storage-account/deploy.ci.sh @@ -49,4 +49,11 @@ docker run --rm -it \ -var admin_password=$PASSWORD \ -var existing_storage_acct=$EXISTING_STORAGE_ACCOUNT_NAME \ -var custom_image_name=$CUSTOM_IMAGE_NAME \ - -target=azurerm_resource_group.rg;" \ No newline at end of file + -target=azurerm_virtual_machine.myvm \ + -target=azurerm_virtual_machine.transfer \ + -target=azurerm_network_interface.transfernic \ + -target=azurerm_network_interface.mynic \ + -target=azurerm_virtual_network.vnet \ + -target=azurerm_public_ip.mypip \ + -target=azurerm_public_ip.transferpip \ + -target=azurerm_storage_account.stor;" \ No newline at end of file From 25b9a6d81f86d0bfeeb5d244414be70b31a2ecf8 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Sat, 13 May 2017 23:44:41 -0500 Subject: [PATCH 72/77] added graph --- .../graph.png | Bin 0 -> 424926 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/azure-vm-custom-image-new-storage-account/graph.png diff --git a/examples/azure-vm-custom-image-new-storage-account/graph.png b/examples/azure-vm-custom-image-new-storage-account/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..35f0c0a0ea6cb2208095202d52438b13a2d73bab GIT binary patch literal 424926 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

fU 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%0DM#<>IcExxtB zUVhs~o7j5cZOZMbx2an+6deO4Q_kr-hSRbL*``&hZ%|&m22;*#A|SBaDL?W%N?c`D zYjyt-+1n0q`9%blr7gBh0{pQw+#{Y(Y=0;^eP&s@)TXs8;7H&P$=9G*E)@Ufps@giGugFX1y&g3x7G_jXgF2l$0{o8IKR#oyT24XlgFK%-qz@7@r>DxRpfbZ zpH^zUMwhS@;4BBS(;ZjxI|~-vgl5aSM5}@r{}BdYV}+N{YYmi%WRktj`*%x6I!GeS zSEKj7?RYy&cVP5K2byPS!L`(j4^I%PkEjXuNW74f?|;WKGR@7ijfD?Bx> z>39~ghb)bWoMG~G6u9<^YhP4*xOzsP_ctu2#Bce&a_^X-d&=miffyHqqBe{BX>a0q zWzB;zPOzlV4i)n^%-Nwg`*yk2n0^PMWKrRjqa#0*`Jc_u>^(DIYZG0hnpj^CZW=a# z7hJ745PbN~i{}6Z^Y6-kUs+{T0K~v95J}qRkDu+jBE^K4CKJWIkoA{;sb0x(V({(x zqp@LpM&{o7UrxN^q4rZi8R=c_Fz2TV_Cy?m6d#;XNtdIlL(!uUTlYJ|1ZXz*T!>(PPzhPyX)XDiZNh zt@WBUVGCl0Nfr|C4GOIEM~KIa()JdMEu{r$P7_k?OMus(vwN^6!X;ycKoUDsCfQ}+ z{KhRNr+?eEvz)T5-&pO#6m={v_QlA~*(Xt+o)}&3mLllVr#Ep%jLxQNJgL`tvh;Z% zE&%HRt3YG0a*%6#v--aN;;a!XAMS?CBD91RJ7!g%?Qx0fjLslRPS5$fT?%peN?OVd z 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 z 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

Do3ulyDGvqmCo_#p5K-q?E`W}hgaia3l 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%0Ab9z1WoUPiXr>mh`7Te2;XZW-C}&aMXwo6^^b$ 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 b8TdJitXE49zFfH%UKtm;X-k+M70dqvd%iZ{ literal 0 HcmV?d00001 From 45991e2933b2da69c939b8e3532683829d7a244a Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Sun, 14 May 2017 00:51:24 -0500 Subject: [PATCH 73/77] removing unmerged example --- .../README.md | 26 ---- .../deploy.ci.sh | 36 ----- .../deploy.mac.sh | 15 -- .../azure-2-vms-loadbalancer-lbrules/main.tf | 138 ------------------ .../outputs.tf | 11 -- .../provider.tf | 6 - .../terraform.tfvars | 6 - 7 files changed, 238 deletions(-) delete mode 100644 examples/azure-2-vms-loadbalancer-lbrules/README.md delete mode 100755 examples/azure-2-vms-loadbalancer-lbrules/deploy.ci.sh delete mode 100755 examples/azure-2-vms-loadbalancer-lbrules/deploy.mac.sh delete mode 100644 examples/azure-2-vms-loadbalancer-lbrules/main.tf delete mode 100644 examples/azure-2-vms-loadbalancer-lbrules/outputs.tf delete mode 100644 examples/azure-2-vms-loadbalancer-lbrules/provider.tf delete mode 100644 examples/azure-2-vms-loadbalancer-lbrules/terraform.tfvars diff --git a/examples/azure-2-vms-loadbalancer-lbrules/README.md b/examples/azure-2-vms-loadbalancer-lbrules/README.md deleted file mode 100644 index d7ca3d4d3cb6..000000000000 --- a/examples/azure-2-vms-loadbalancer-lbrules/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# Create 2 Virtual Machines under a Load balancer and configures Load Balancing rules for the VMs - -This Terraform template was based on [this](https://github.com/Azure/azure-quickstart-templates/tree/master/201-2-vms-loadbalancer-lbrules) Azure Quickstart Template. Changes to the ARM template may have occured since the creation of this example may not be reflected here. - - - - - -This template allows you to create 2 Virtual Machines under a Load balancer and configure a load balancing rule on Port 80. This template also deploys a Storage Account, Virtual Network, Public IP address, Availability Set, and Network Interfaces. - -## main.tf -The `main.tf` file contains the actual resources that will be deployed. It also contains the Azure Resource Group definition and any defined variables. - -## outputs.tf -This data is outputted when `terraform apply` is called, and can be queried using the `terraform output` command. - -## provider.tf -Azure requires that an application is added to Azure Active Directory to generate the `client_id`, `client_secret`, and `tenant_id` needed by Terraform (`subscription_id` can be recovered from your Azure account details). Please go [here](https://www.terraform.io/docs/providers/azurerm/) for full instructions on how to create this to populate your `provider.tf` file. - -## terraform.tfvars -If a `terraform.tfvars` file is present in the current directory, Terraform automatically loads it to populate variables. We don't recommend saving usernames and password to version control, but you can create a local secret variables file and use `-var-file` to load it. - -If you are committing this template to source control, please insure that you add this file to your .gitignore file. - -## variables.tf -The `variables.tf` file contains all of the input parameters that the user can specify when deploying this Terraform template. diff --git a/examples/azure-2-vms-loadbalancer-lbrules/deploy.ci.sh b/examples/azure-2-vms-loadbalancer-lbrules/deploy.ci.sh deleted file mode 100755 index 57e0dc9b1a42..000000000000 --- a/examples/azure-2-vms-loadbalancer-lbrules/deploy.ci.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -set -o errexit -o nounset - -docker run --rm -it \ - -e ARM_CLIENT_ID \ - -e ARM_CLIENT_SECRET \ - -e ARM_SUBSCRIPTION_ID \ - -e ARM_TENANT_ID \ - -v $(pwd):/data \ - --entrypoint "/bin/sh" \ - hashicorp/terraform:light \ - -c "cd /data; \ - /bin/terraform get; \ - /bin/terraform validate; \ - /bin/terraform plan -out=out.tfplan -var dns_name=$KEY -var hostname=$KEY -var lb_ip_dns_name=$KEY -var resource_group=$KEY -var admin_password=$PASSWORD; \ - /bin/terraform apply out.tfplan" - -# cleanup deployed azure resources via azure-cli -docker run --rm -it \ - azuresdk/azure-cli-python \ - sh -c "az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID > /dev/null; \ - az network lb show -g $KEY -n rglb; \ - az network lb rule list -g $KEY --lb-name rglb;" - -# cleanup deployed azure resources via terraform -docker run --rm -it \ - -e ARM_CLIENT_ID \ - -e ARM_CLIENT_SECRET \ - -e ARM_SUBSCRIPTION_ID \ - -e ARM_TENANT_ID \ - -v $(pwd):/data \ - --workdir=/data \ - --entrypoint "/bin/sh" \ - hashicorp/terraform:light \ - -c "/bin/terraform destroy -force -var dns_name=$KEY -var hostname=$KEY -var lb_ip_dns_name=$KEY -var resource_group=$KEY -var admin_password=$PASSWORD;" diff --git a/examples/azure-2-vms-loadbalancer-lbrules/deploy.mac.sh b/examples/azure-2-vms-loadbalancer-lbrules/deploy.mac.sh deleted file mode 100755 index cf5cdc32279f..000000000000 --- a/examples/azure-2-vms-loadbalancer-lbrules/deploy.mac.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -set -o errexit -o nounset - -if docker -v; then - - # generate a unique string for CI deployment - export KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-z' | head -c 12) - export PASSWORD=$KEY$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | env LC_CTYPE=C tr -cd '0-9' | head -c 2) - -/bin/sh ./deploy.ci.sh - -else - echo "Docker is used to run terraform commands, please install before run: https://docs.docker.com/docker-for-mac/install/" -fi \ No newline at end of file diff --git a/examples/azure-2-vms-loadbalancer-lbrules/main.tf b/examples/azure-2-vms-loadbalancer-lbrules/main.tf deleted file mode 100644 index 24981118d3e2..000000000000 --- a/examples/azure-2-vms-loadbalancer-lbrules/main.tf +++ /dev/null @@ -1,138 +0,0 @@ -resource "azurerm_resource_group" "rg" { - name = "${var.resource_group}" - location = "${var.location}" -} - -resource "azurerm_storage_account" "stor" { - name = "${var.dns_name}stor" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - account_type = "${var.storage_account_type}" -} - -resource "azurerm_availability_set" "avset" { - name = "${var.dns_name}avset" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - platform_fault_domain_count = 2 - platform_update_domain_count = 2 - managed = true -} - -resource "azurerm_public_ip" "lbpip" { - name = "${var.rg_prefix}-ip" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - public_ip_address_allocation = "dynamic" - domain_name_label = "${var.lb_ip_dns_name}" -} - -resource "azurerm_virtual_network" "vnet" { - name = "${var.virtual_network_name}" - location = "${var.location}" - address_space = ["${var.address_space}"] - resource_group_name = "${azurerm_resource_group.rg.name}" -} - -resource "azurerm_subnet" "subnet" { - name = "${var.rg_prefix}subnet" - virtual_network_name = "${azurerm_virtual_network.vnet.name}" - resource_group_name = "${azurerm_resource_group.rg.name}" - address_prefix = "${var.subnet_prefix}" -} - -resource "azurerm_lb" "lb" { - resource_group_name = "${azurerm_resource_group.rg.name}" - name = "${var.rg_prefix}lb" - location = "${var.location}" - - frontend_ip_configuration { - name = "LoadBalancerFrontEnd" - public_ip_address_id = "${azurerm_public_ip.lbpip.id}" - } -} - -resource "azurerm_lb_backend_address_pool" "backend_pool" { - resource_group_name = "${azurerm_resource_group.rg.name}" - loadbalancer_id = "${azurerm_lb.lb.id}" - name = "BackendPool1" -} - -resource "azurerm_lb_nat_rule" "tcp" { - resource_group_name = "${azurerm_resource_group.rg.name}" - loadbalancer_id = "${azurerm_lb.lb.id}" - name = "RDP-VM-${count.index}" - protocol = "tcp" - frontend_port = "5000${count.index + 1}" - backend_port = 3389 - frontend_ip_configuration_name = "LoadBalancerFrontEnd" - count = 2 -} - -resource "azurerm_lb_rule" "lb_rule" { - resource_group_name = "${azurerm_resource_group.rg.name}" - loadbalancer_id = "${azurerm_lb.lb.id}" - name = "LBRule" - protocol = "tcp" - frontend_port = 80 - backend_port = 80 - frontend_ip_configuration_name = "LoadBalancerFrontEnd" - enable_floating_ip = false - backend_address_pool_id = "${azurerm_lb_backend_address_pool.backend_pool.id}" - idle_timeout_in_minutes = 5 - probe_id = "${azurerm_lb_probe.lb_probe.id}" - depends_on = ["azurerm_lb_probe.lb_probe"] -} - -resource "azurerm_lb_probe" "lb_probe" { - resource_group_name = "${azurerm_resource_group.rg.name}" - loadbalancer_id = "${azurerm_lb.lb.id}" - name = "tcpProbe" - protocol = "tcp" - port = 80 - interval_in_seconds = 5 - number_of_probes = 2 -} - -resource "azurerm_network_interface" "nic" { - name = "nic${count.index}" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - count = 2 - - ip_configuration { - name = "ipconfig${count.index}" - subnet_id = "${azurerm_subnet.subnet.id}" - private_ip_address_allocation = "Dynamic" - load_balancer_backend_address_pools_ids = ["${azurerm_lb_backend_address_pool.backend_pool.id}"] - load_balancer_inbound_nat_rules_ids = ["${element(azurerm_lb_nat_rule.tcp.*.id, count.index)}"] - } -} - -resource "azurerm_virtual_machine" "vm" { - name = "vm${count.index}" - location = "${var.location}" - resource_group_name = "${azurerm_resource_group.rg.name}" - availability_set_id = "${azurerm_availability_set.avset.id}" - vm_size = "${var.vm_size}" - network_interface_ids = ["${element(azurerm_network_interface.nic.*.id, count.index)}"] - count = 2 - - storage_image_reference { - publisher = "${var.image_publisher}" - offer = "${var.image_offer}" - sku = "${var.image_sku}" - version = "${var.image_version}" - } - - storage_os_disk { - name = "osdisk${count.index}" - create_option = "FromImage" - } - - os_profile { - computer_name = "${var.hostname}" - admin_username = "${var.admin_username}" - admin_password = "${var.admin_password}" - } -} diff --git a/examples/azure-2-vms-loadbalancer-lbrules/outputs.tf b/examples/azure-2-vms-loadbalancer-lbrules/outputs.tf deleted file mode 100644 index a21a9568b688..000000000000 --- a/examples/azure-2-vms-loadbalancer-lbrules/outputs.tf +++ /dev/null @@ -1,11 +0,0 @@ -output "hostname" { - value = "${var.hostname}" -} - -output "vm_fqdn" { - value = "${azurerm_public_ip.lbpip.fqdn}" -} - -output "sshCommand" { - value = "ssh ${var.admin_username}@${azurerm_public_ip.lbpip.fqdn}" -} diff --git a/examples/azure-2-vms-loadbalancer-lbrules/provider.tf b/examples/azure-2-vms-loadbalancer-lbrules/provider.tf deleted file mode 100644 index bdf0583f3259..000000000000 --- a/examples/azure-2-vms-loadbalancer-lbrules/provider.tf +++ /dev/null @@ -1,6 +0,0 @@ -# provider "azurerm" { -# subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" -# client_id = "REPLACE-WITH-YOUR-CLIENT-ID" -# client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" -# tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" -# } diff --git a/examples/azure-2-vms-loadbalancer-lbrules/terraform.tfvars b/examples/azure-2-vms-loadbalancer-lbrules/terraform.tfvars deleted file mode 100644 index 824d4a691b61..000000000000 --- a/examples/azure-2-vms-loadbalancer-lbrules/terraform.tfvars +++ /dev/null @@ -1,6 +0,0 @@ -# resource_group = "myresourcegroup" -# rg_prefix = "rg" -# hostname = "myvm" -# dns_name = "mydnsname" -# location = "southcentralus" -# admin_password = "T3rr@f0rmP@ssword" From 632c33b6e602b7f400377536c40dae10f9a7ffc7 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Sun, 14 May 2017 00:52:36 -0500 Subject: [PATCH 74/77] reverting to Hashicorp's travis.yml --- .travis.yml | 69 ++++++++++++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8fef7822110d..7fe62879facf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,37 +1,42 @@ -sudo: required +dist: trusty +sudo: false +language: go +go: +- 1.8 -services: - - docker - -language: generic - -# on branches: ignore multiple commits that will queue build jobs, just run latest commit -git: - depth: 1 - -# establish environment variables +# add TF_CONSUL_TEST=1 to run consul tests +# they were causing timouts in travis env: - - TEST_DIR=examples/azure-vm-custom-image-new-storage-account + - CONSUL_VERSION=0.7.5 GOMAXPROCS=4 +# Fetch consul for the backend and provider tests +before_install: + - curl -sLo consul.zip https://releases.hashicorp.com/consul/${CONSUL_VERSION}/consul_${CONSUL_VERSION}_linux_amd64.zip + - unzip consul.zip + - mkdir ~/bin + - mv consul ~/bin + - export PATH="~/bin:$PATH" + +install: +# This script is used by the Travis build to install a cookie for +# go.googlesource.com so rate limits are higher when using `go get` to fetch +# packages that live there. +# See: https://github.com/golang/go/issues/12933 +- bash scripts/gogetcookie.sh +- go get github.com/kardianos/govendor +script: +- make vet vendor-status test +- GOOS=windows go build branches: only: - - master - - /^(?i:topic)-.*$/ - -# install terraform -before_deploy: - - export KEY=$(cat /dev/urandom | tr -cd 'a-z' | head -c 12) - - export PASSWORD=$KEY$(cat /dev/urandom | tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | tr -cd '0-9' | head -c 2) - - export EXISTING_RESOURCE_GROUP=donotdelete - - export EXISTING_IMAGE_URI=https://donotdeletedisks636.blob.core.windows.net/vhds/mywindowsimage20170510184809.vhd - - export EXISTING_STORAGE_ACCOUNT_NAME=donotdeletedisks636 - - export CUSTOM_IMAGE_NAME=mywindowsimage20170510184809 - -# terraform deploy + script -deploy: - - provider: script - skip_cleanup: true - script: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./deploy.ci.sh - on: - repo: harijayms/terraform - branch: topic-201-vm-custom-image-new-storage-account \ No newline at end of file + - master +notifications: + irc: + channels: + - irc.freenode.org#terraform-tool + skip_join: true + use_notice: true +matrix: + fast_finish: true + allow_failures: + - go: tip \ No newline at end of file From e94b929a0c75330c3ffe11388f6545d3a8cb7c3a Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Sun, 14 May 2017 00:57:42 -0500 Subject: [PATCH 75/77] reverting to branch travis.yml before branching to pr to Hashi --- .travis.yml | 69 +++++++++++++++++++++++++---------------------------- 1 file changed, 32 insertions(+), 37 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7fe62879facf..8fef7822110d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,42 +1,37 @@ -dist: trusty -sudo: false -language: go -go: -- 1.8 +sudo: required -# add TF_CONSUL_TEST=1 to run consul tests -# they were causing timouts in travis -env: - - CONSUL_VERSION=0.7.5 GOMAXPROCS=4 +services: + - docker + +language: generic + +# on branches: ignore multiple commits that will queue build jobs, just run latest commit +git: + depth: 1 -# Fetch consul for the backend and provider tests -before_install: - - curl -sLo consul.zip https://releases.hashicorp.com/consul/${CONSUL_VERSION}/consul_${CONSUL_VERSION}_linux_amd64.zip - - unzip consul.zip - - mkdir ~/bin - - mv consul ~/bin - - export PATH="~/bin:$PATH" +# establish environment variables +env: + - TEST_DIR=examples/azure-vm-custom-image-new-storage-account -install: -# This script is used by the Travis build to install a cookie for -# go.googlesource.com so rate limits are higher when using `go get` to fetch -# packages that live there. -# See: https://github.com/golang/go/issues/12933 -- bash scripts/gogetcookie.sh -- go get github.com/kardianos/govendor -script: -- make vet vendor-status test -- GOOS=windows go build branches: only: - - master -notifications: - irc: - channels: - - irc.freenode.org#terraform-tool - skip_join: true - use_notice: true -matrix: - fast_finish: true - allow_failures: - - go: tip \ No newline at end of file + - master + - /^(?i:topic)-.*$/ + +# install terraform +before_deploy: + - export KEY=$(cat /dev/urandom | tr -cd 'a-z' | head -c 12) + - export PASSWORD=$KEY$(cat /dev/urandom | tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | tr -cd '0-9' | head -c 2) + - export EXISTING_RESOURCE_GROUP=donotdelete + - export EXISTING_IMAGE_URI=https://donotdeletedisks636.blob.core.windows.net/vhds/mywindowsimage20170510184809.vhd + - export EXISTING_STORAGE_ACCOUNT_NAME=donotdeletedisks636 + - export CUSTOM_IMAGE_NAME=mywindowsimage20170510184809 + +# terraform deploy + script +deploy: + - provider: script + skip_cleanup: true + script: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./deploy.ci.sh + on: + repo: harijayms/terraform + branch: topic-201-vm-custom-image-new-storage-account \ No newline at end of file From 68a08f03fb71d33e26192a8186d13d2dfdb78c62 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Sun, 14 May 2017 01:00:16 -0500 Subject: [PATCH 76/77] reverting to Hashicorp's .travis.yml --- .travis.yml | 69 ++++++++++++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8fef7822110d..7fe62879facf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,37 +1,42 @@ -sudo: required +dist: trusty +sudo: false +language: go +go: +- 1.8 -services: - - docker - -language: generic - -# on branches: ignore multiple commits that will queue build jobs, just run latest commit -git: - depth: 1 - -# establish environment variables +# add TF_CONSUL_TEST=1 to run consul tests +# they were causing timouts in travis env: - - TEST_DIR=examples/azure-vm-custom-image-new-storage-account + - CONSUL_VERSION=0.7.5 GOMAXPROCS=4 +# Fetch consul for the backend and provider tests +before_install: + - curl -sLo consul.zip https://releases.hashicorp.com/consul/${CONSUL_VERSION}/consul_${CONSUL_VERSION}_linux_amd64.zip + - unzip consul.zip + - mkdir ~/bin + - mv consul ~/bin + - export PATH="~/bin:$PATH" + +install: +# This script is used by the Travis build to install a cookie for +# go.googlesource.com so rate limits are higher when using `go get` to fetch +# packages that live there. +# See: https://github.com/golang/go/issues/12933 +- bash scripts/gogetcookie.sh +- go get github.com/kardianos/govendor +script: +- make vet vendor-status test +- GOOS=windows go build branches: only: - - master - - /^(?i:topic)-.*$/ - -# install terraform -before_deploy: - - export KEY=$(cat /dev/urandom | tr -cd 'a-z' | head -c 12) - - export PASSWORD=$KEY$(cat /dev/urandom | tr -cd 'A-Z' | head -c 2)$(cat /dev/urandom | tr -cd '0-9' | head -c 2) - - export EXISTING_RESOURCE_GROUP=donotdelete - - export EXISTING_IMAGE_URI=https://donotdeletedisks636.blob.core.windows.net/vhds/mywindowsimage20170510184809.vhd - - export EXISTING_STORAGE_ACCOUNT_NAME=donotdeletedisks636 - - export CUSTOM_IMAGE_NAME=mywindowsimage20170510184809 - -# terraform deploy + script -deploy: - - provider: script - skip_cleanup: true - script: cd $TRAVIS_BUILD_DIR/$TEST_DIR && ./deploy.ci.sh - on: - repo: harijayms/terraform - branch: topic-201-vm-custom-image-new-storage-account \ No newline at end of file + - master +notifications: + irc: + channels: + - irc.freenode.org#terraform-tool + skip_join: true + use_notice: true +matrix: + fast_finish: true + allow_failures: + - go: tip \ No newline at end of file From 2223e13d44f46767a8a33f58e819ee09ac9fa033 Mon Sep 17 00:00:00 2001 From: anniehedgpeth Date: Sun, 14 May 2017 01:26:37 -0500 Subject: [PATCH 77/77] clean up --- .../provider.tf.example | 7 ------- .../azure-cdn-with-storage-account/terraform.tfvars | 8 -------- examples/azure-vm-from-user-image/provider.tf | 6 ------ examples/azure-vm-from-user-image/terraform.tfvars | 13 ------------- 4 files changed, 34 deletions(-) delete mode 100644 examples/azure-cdn-with-storage-account/provider.tf.example delete mode 100644 examples/azure-cdn-with-storage-account/terraform.tfvars delete mode 100644 examples/azure-vm-from-user-image/provider.tf delete mode 100644 examples/azure-vm-from-user-image/terraform.tfvars diff --git a/examples/azure-cdn-with-storage-account/provider.tf.example b/examples/azure-cdn-with-storage-account/provider.tf.example deleted file mode 100644 index 79291f7ca895..000000000000 --- a/examples/azure-cdn-with-storage-account/provider.tf.example +++ /dev/null @@ -1,7 +0,0 @@ -# provider "azurerm" { -# subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" -# client_id = "REPLACE-WITH-YOUR-CLIENT-ID" -# client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" -# tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" -# } - diff --git a/examples/azure-cdn-with-storage-account/terraform.tfvars b/examples/azure-cdn-with-storage-account/terraform.tfvars deleted file mode 100644 index bee98e4e11bc..000000000000 --- a/examples/azure-cdn-with-storage-account/terraform.tfvars +++ /dev/null @@ -1,8 +0,0 @@ -# Replace with relevant values - -# resource_group = "myresourcegroup" -# rg_prefix = "rg" -# hostname = "myvm" -# dns_name = "mydnsname" -# location = "southcentralus" -# admin_password = "T3rr@f0rmP@ssword" diff --git a/examples/azure-vm-from-user-image/provider.tf b/examples/azure-vm-from-user-image/provider.tf deleted file mode 100644 index bdf0583f3259..000000000000 --- a/examples/azure-vm-from-user-image/provider.tf +++ /dev/null @@ -1,6 +0,0 @@ -# provider "azurerm" { -# subscription_id = "REPLACE-WITH-YOUR-SUBSCRIPTION-ID" -# client_id = "REPLACE-WITH-YOUR-CLIENT-ID" -# client_secret = "REPLACE-WITH-YOUR-CLIENT-SECRET" -# tenant_id = "REPLACE-WITH-YOUR-TENANT-ID" -# } diff --git a/examples/azure-vm-from-user-image/terraform.tfvars b/examples/azure-vm-from-user-image/terraform.tfvars deleted file mode 100644 index 15da2a9c6ca7..000000000000 --- a/examples/azure-vm-from-user-image/terraform.tfvars +++ /dev/null @@ -1,13 +0,0 @@ -# resource_group = "myresourcegroup" -# image_uri = "https://DISK.blob.core.windows.net/vhds/ORIGINAL-VM.vhd" -# primary_blob_endpoint = "https://DISK.blob.core.windows.net/" -# location = "southcentralus" -# os_type = "linux" -# address_space = "10.0.0.0/16" -# subnet_prefix = "10.0.0.0/24" -# storage_account_name = "STOR-ACCT-NAME" -# storage_account_type = "Standard_LRS" -# vm_size = "Standard_DS1_v2" -# hostname = "HOSTNAME" -# admin_username = "vmadmin" -# admin_password = "YOURPASSWORDHERE"