github.com/mmcquillan/packer@v1.1.1-0.20171009221028-c85cf0483a5d/website/source/docs/builders/azure.html.md (about)

     1  ---
     2  description: 'Packer supports building VHDs in Azure Resource manager.'
     3  layout: docs
     4  page_title: 'Azure - Builders'
     5  sidebar_current: 'docs-builders-azure'
     6  ---
     7  
     8  # Azure Resource Manager Builder
     9  
    10  Type: `azure-arm`
    11  
    12  Packer supports building VHDs in [Azure Resource Manager](https://azure.microsoft.com/en-us/documentation/articles/resource-group-overview/). Azure provides new users a [$200 credit for the first 30 days](https://azure.microsoft.com/en-us/free/); after which you will incur costs for VMs built and stored using Packer.
    13  
    14  Unlike most Packer builders, the artifact produced by the ARM builder is a VHD (virtual hard disk), not a full virtual machine image. This means you will need to [perform some additional steps](https://github.com/Azure/packer-azure/issues/201) in order to launch a VM from your build artifact.
    15  
    16  Azure uses a combination of OAuth and Active Directory to authorize requests to the ARM API. Learn how to [authorize access to ARM](/docs/builders/azure-setup.html).
    17  
    18  The documentation below references command output from the [Azure CLI](https://azure.microsoft.com/en-us/documentation/articles/xplat-cli-install/).
    19  
    20  ## Configuration Reference
    21  
    22  The following configuration options are available for building Azure images. In addition to the options listed here, a
    23  [communicator](/docs/templates/communicator.html) can be configured for this
    24  builder.
    25  
    26  ### Required:
    27  
    28  -   `client_id` (string) The Active Directory service principal associated with your builder.
    29  
    30  -   `client_secret` (string) The password or secret for your service principal.
    31  
    32  -   `subscription_id` (string) Subscription under which the build will be performed. **The service principal specified in `client_id` must have full access to this subscription.**
    33  -   `capture_container_name` (string) Destination container name. Essentially the "directory" where your VHD will be organized in Azure.  The captured VHD's URL will be https://<storage_account>.blob.core.windows.net/system/Microsoft.Compute/Images/<capture_container_name>/<capture_name_prefix>.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.vhd.
    34  
    35  -   `image_publisher` (string) PublisherName for your base image. See [documentation](https://azure.microsoft.com/en-us/documentation/articles/resource-groups-vm-searching/) for details.
    36  
    37      CLI example `azure vm image list-publishers -l westus`
    38  
    39  -   `image_offer` (string) Offer for your base image. See [documentation](https://azure.microsoft.com/en-us/documentation/articles/resource-groups-vm-searching/) for details.
    40  
    41      CLI example `azure vm image list-offers -l westus -p Canonical`
    42  
    43  -   `image_sku` (string) SKU for your base image. See [documentation](https://azure.microsoft.com/en-us/documentation/articles/resource-groups-vm-searching/) for details.
    44  
    45      CLI example `azure vm image list-skus -l westus -p Canonical -o UbuntuServer`
    46  
    47  -   `location` (string) Azure datacenter in which your VM will build.
    48  
    49      CLI example `azure location list`
    50      
    51  #### VHD or Managed Image
    52  
    53  The Azure builder can create either a VHD, or a managed image. If you
    54  are creating a VHD, you **must** start with a VHD.  Likewise, if you
    55  want to create a managed image you **must** start with a managed
    56  image.  When creating a VHD the following two options are required.
    57  
    58  -   `capture_container_name` (string) Destination container name. Essentially the "directory" where your VHD will be 
    59      organized in Azure.  The captured VHD's URL will be https://<storage_account>.blob.core.windows.net/system/Microsoft.Compute/Images/<capture_container_name>/<capture_name_prefix>.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.vhd.
    60      
    61  -   `capture_name_prefix` (string) VHD prefix. The final artifacts will be named `PREFIX-osDisk.UUID` and 
    62      `PREFIX-vmTemplate.UUID`.
    63  
    64  -   `resource_group_name` (string) Resource group under which the final artifact will be stored.
    65  
    66  -   `storage_account` (string) Storage account under which the final artifact will be stored.
    67  
    68  When creating a managed image the following two options are required.
    69  
    70  -   `managed_image_name` (string) Specify the managed image name where the result of the Packer build will be saved. The
    71       image name must not exist ahead of time, and will not be overwritten. If this value is set, the value 
    72       `managed_image_resource_group_name` must also be set. See [documentation](https://docs.microsoft.com/en-us/azure/storage/storage-managed-disks-overview#images) 
    73       to learn more about managed images.
    74       
    75  -   `managed_image_resource_group_name` (string) Specify the managed image resource group name where the result of the Packer build will be 
    76       saved.  The resource group must already exist. If this value is set, the value `managed_image_name` must also be 
    77       set. See [documentation](https://docs.microsoft.com/en-us/azure/storage/storage-managed-disks-overview#images) to 
    78       learn more about managed images.
    79  
    80  ### Optional:
    81  
    82  -   `azure_tags` (object of name/value strings) - the user can define up to 15 tags. Tag names cannot exceed 512
    83      characters, and tag values cannot exceed 256 characters. Tags are applied to every resource deployed by a Packer
    84      build, i.e. Resource Group, VM, NIC, VNET, Public IP, KeyVault, etc.
    85  
    86  -   `cloud_environment_name` (string) One of `Public`, `China`, `Germany`, or
    87      `USGovernment`. Defaults to `Public`. Long forms such as
    88      `USGovernmentCloud` and `AzureUSGovernmentCloud` are also supported.
    89      
    90  -   `custom_data_file` (string) Specify a file containing custom data to inject into the cloud-init process. The contents
    91      of the file are read, base64 encoded, and injected into the ARM template. The custom data will be passed to 
    92      cloud-init for processing at the time of provisioning. See [documentation](http://cloudinit.readthedocs.io/en/latest/topics/examples.html)
    93      to learn more about custom data, and how it can be used to influence the provisioning process.
    94  
    95  -   `custom_managed_image_name` (string) Specify the source managed image's name to use.  If this value is set, do not set
    96      image_publisher, image_offer, image_sku, or image_version. If this value is set, the value
    97      `custom_managed_image_resource_group_name` must also be set. See [documentation](https://docs.microsoft.com/en-us/azure/storage/storage-managed-disks-overview#images)
    98      to learn more about managed images.
    99  
   100  -   `custom_managed_image_resource_group_name` (string) Specify the source managed image's resource group used to use.  If this
   101      value is set, do not set image_publisher, image_offer, image_sku, or image_version. If this value is set, the
   102      value `custom_managed_image_name` must also be set. See [documentation](https://docs.microsoft.com/en-us/azure/storage/storage-managed-disks-overview#images)
   103      to learn more about managed images.
   104  
   105  -   `image_version` (string) Specify a specific version of an OS to boot from. Defaults to `latest`. There may be a
   106      difference in versions available across regions due to image synchronization latency. To ensure a consistent
   107      version across regions set this value to one that is available in all regions where you are deploying.
   108  
   109      CLI example `azure vm image list -l westus -p Canonical -o UbuntuServer -k 16.04.0-LTS`
   110  
   111  -   `image_url` (string) Specify a custom VHD to use. If this value is set, do not set image\_publisher, image\_offer,
   112      image\_sku, or image\_version.
   113      
   114  -   `managed_image_storage_account_type` (string) Specify the storage
   115      account type for a managed image.  Valid values are Standard_LRS
   116      and Premium\_LRS.  The default is Standard\_LRS.
   117                  
   118  -   `object_id` (string) Specify an OAuth Object ID to protect WinRM certificates
   119      created at runtime. This variable is required when creating images based on
   120      Windows; this variable is not used by non-Windows builds. See `Windows`
   121      behavior for `os_type`, below.
   122  
   123  -   `os_disk_size_gb` (int32) Specify the size of the OS disk in GB (gigabytes).  Values of zero or less than zero are
   124      ignored.
   125  
   126  -   `os_type` (string) If either `Linux` or `Windows` is specified Packer will
   127      automatically configure authentication credentials for the provisioned machine. For
   128      `Linux` this configures an SSH authorized key. For `Windows` this
   129      configures a WinRM certificate.
   130  
   131  -   `temp_compute_name` (string) temporary name assigned to the VM.  If this value is not set, a random value will be 
   132      assigned.  Knowing the resource group and VM name allows one to execute commands to update the VM during a Packer 
   133      build, e.g. attach a resource disk to the VM.
   134  
   135  -   `temp_resource_group_name` (string) temporary name assigned to the resource group.  If this value is not set, a random
   136      value will be assigned.
   137  
   138  -   `tenant_id` (string) The account identifier with which your `client_id` and `subscription_id` are associated. If not
   139      specified, `tenant_id` will be looked up using `subscription_id`.
   140  
   141  -   `private_virtual_network_with_public_ip` (boolean) This value allows you to set a `virtual_network_name` and obtain
   142      a public IP. If this value is not set and `virtual_network_name` is defined Packer is only allowed to be executed
   143      from a host on the same subnet / virtual network.
   144  
   145  -   `virtual_network_name` (string) Use a pre-existing virtual network for the VM. This option enables private
   146      communication with the VM, no public IP address is **used** or **provisioned** (unless you set `private_virtual_network_with_public_ip`).
   147  
   148  -   `virtual_network_resource_group_name` (string) If virtual\_network\_name is set, this value **may** also be set. If
   149      virtual\_network\_name is set, and this value is not set the builder attempts to determine the resource group
   150      containing the virtual network. If the resource group cannot be found, or it cannot be disambiguated, this value
   151      should be set.
   152  
   153  -   `virtual_network_subnet_name` (string) If virtual\_network\_name is set, this value **may** also be set. If
   154      virtual\_network\_name is set, and this value is not set the builder attempts to determine the subnet to use with
   155      the virtual network. If the subnet cannot be found, or it cannot be disambiguated, this value should be set.
   156  
   157  -   `vm_size` (string) Size of the VM used for building. This can be changed
   158      when you deploy a VM from your VHD. See
   159      [pricing](https://azure.microsoft.com/en-us/pricing/details/virtual-machines/) information. Defaults to `Standard_A1`.
   160  
   161      CLI example `azure vm sizes -l westus`
   162  
   163  ## Basic Example
   164  
   165  Here is a basic example for Azure.
   166  
   167  ``` json
   168  {
   169      "type": "azure-arm",
   170  
   171      "client_id": "fe354398-d7sf-4dc9-87fd-c432cd8a7e09",
   172      "client_secret": "keepitsecret&#*$",
   173      "resource_group_name": "packerdemo",
   174      "storage_account": "virtualmachines",
   175      "subscription_id": "44cae533-4247-4093-42cf-897ded6e7823",
   176      "tenant_id": "de39842a-caba-497e-a798-7896aea43218",
   177  
   178      "capture_container_name": "images",
   179      "capture_name_prefix": "packer",
   180  
   181      "os_type": "Linux",
   182      "image_publisher": "Canonical",
   183      "image_offer": "UbuntuServer",
   184      "image_sku": "14.04.4-LTS",
   185  
   186      "azure_tags": {
   187        "dept": "engineering"
   188      },
   189  
   190      "location": "West US",
   191      "vm_size": "Standard_A2"
   192  }
   193  ```
   194  
   195  ## Deprovision
   196  
   197  Azure VMs should be deprovisioned at the end of every build. For Windows this means executing sysprep, and for Linux this means executing the waagent deprovision process.
   198  
   199  Please refer to the Azure [examples](https://github.com/hashicorp/packer/tree/master/examples/azure) for complete examples showing the deprovision process.
   200  
   201  ### Windows
   202  
   203  The following provisioner snippet shows how to sysprep a Windows VM. Deprovision should be the last operation executed by a build.
   204  
   205  ``` json
   206  {
   207    "provisioners": [
   208      {
   209        "type": "powershell",
   210        "inline": [
   211          "if( Test-Path $Env:SystemRoot\\windows\\system32\\Sysprep\\unattend.xml ){ rm $Env:SystemRoot\\windows\\system32\\Sysprep\\unattend.xml -Force}",
   212          "& $Env:SystemRoot\\System32\\Sysprep\\Sysprep.exe /oobe /generalize /shutdown /quiet"
   213        ]
   214      }
   215    ]
   216  }
   217  ```
   218  
   219  In some circumstances the above isn't enough to reliably know that the sysprep is actually finished generalizing the image, the code below will wait for sysprep to write the image status in the registry and will exit after that. The possible states, in case you want to wait for another state, [are documented here](https://technet.microsoft.com/en-us/library/hh824815.aspx)
   220  
   221  ``` json
   222  {
   223      "provisioners": [
   224      {
   225          "type": "powershell",
   226          "inline": [
   227              "& $env:SystemRoot\\System32\\Sysprep\\Sysprep.exe /oobe /generalize /quiet /quit",
   228              "while($true) { $imageState = Get-ItemProperty HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup\\State | Select ImageState; if($imageState.ImageState -ne 'IMAGE_STATE_GENERALIZE_RESEAL_TO_OOBE') { Write-Output $imageState.ImageState; Start-Sleep -s 10  } else { break } }"
   229          ]
   230      }
   231    ]
   232  }
   233  
   234  
   235  ```
   236  
   237  ### Linux
   238  
   239  The following provisioner snippet shows how to deprovision a Linux VM. Deprovision should be the last operation executed by a build.
   240  
   241  ``` json
   242  {
   243   "provisioners": [
   244     {
   245       "execute_command": "chmod +x {{ .Path }}; {{ .Vars }} sudo -E sh '{{ .Path }}'",
   246       "inline": [
   247         "/usr/sbin/waagent -force -deprovision+user && export HISTSIZE=0 && sync"
   248       ],
   249       "inline_shebang": "/bin/sh -x",
   250       "type": "shell"
   251     }
   252   ]
   253  }
   254  ```
   255  
   256  To learn more about the Linux deprovision process please see WALinuxAgent's [README](https://github.com/Azure/WALinuxAgent/blob/master/README.md).
   257  
   258  #### skip\_clean
   259  
   260  Customers have reported issues with the deprovision process where the builder hangs. The error message is similar to the following.
   261  
   262      Build 'azure-arm' errored: Retryable error: Error removing temporary script at /tmp/script_9899.sh: ssh: handshake failed: EOF
   263  
   264  One solution is to set skip\_clean to true in the provisioner. This prevents Packer from cleaning up any helper scripts uploaded to the VM during the build.
   265  
   266  ## Defaults
   267  
   268  The Azure builder attempts to pick default values that provide for a just works experience. These values can be changed by the user to more suitable values.
   269  
   270  -   The default user name is packer not root as in other builders. Most distros on Azure do not allow root to SSH to a VM hence the need for a non-root default user. Set the ssh\_username option to override the default value.
   271  -   The default VM size is Standard\_A1. Set the vm\_size option to override the default value.
   272  -   The default image version is latest. Set the image\_version option to override the default value.
   273  
   274  ## Implementation
   275  
   276  ~&gt; **Warning!** This is an advanced topic. You do not need to understand the implementation to use the Azure
   277  builder.
   278  
   279  The Azure builder uses ARM
   280  [templates](https://azure.microsoft.com/en-us/documentation/articles/resource-group-authoring-templates/) to deploy
   281  resources. ARM templates allow you to express the what without having to express the how.
   282  
   283  The Azure builder works under the assumption that it creates everything it needs to execute a build. When the build has
   284  completed it simply deletes the resource group to cleanup any runtime resources. Resource groups are named using the
   285  form `packer-Resource-Group-<random>`. The value `<random>` is a random value that is generated at every invocation of
   286  packer. The `<random>` value is re-used as much as possible when naming resources, so users can better identify and
   287  group these transient resources when seen in their subscription.
   288  
   289  > The VHD is created on a user specified storage account, not a random one created at runtime. When a virtual machine
   290  > is captured the resulting VHD is stored on the same storage account as the source VHD. The VHD created by Packer must
   291  > persist after a build is complete, which is why the storage account is set by the user.
   292  
   293  The basic steps for a build are:
   294  
   295  1.  Create a resource group.
   296  2.  Validate and deploy a VM template.
   297  3.  Execute provision - defined by the user; typically shell commands.
   298  4.  Power off and capture the VM.
   299  5.  Delete the resource group.
   300  6.  Delete the temporary VM's OS disk.
   301  
   302  The templates used for a build are currently fixed in the code. There is a template for Linux, Windows, and KeyVault.
   303  The templates are themselves templated with place holders for names, passwords, SSH keys, certificates, etc.
   304  
   305  ### What's Randomized?
   306  
   307  The Azure builder creates the following random values at runtime.
   308  
   309  -   Administrator Password: a random 32-character value using the *password alphabet*.
   310  -   Certificate: a 2,048-bit certificate used to secure WinRM communication. The certificate is valid for 24-hours, which starts roughly at invocation time.
   311  -   Certificate Password: a random 32-character value using the *password alphabet* used to protect the private key of the certificate.
   312  -   Compute Name: a random 15-character name prefixed with pkrvm; the name of the VM.
   313  -   Deployment Name: a random 15-character name prefixed with pkfdp; the name of the deployment.
   314  -   KeyVault Name: a random 15-character name prefixed with pkrkv.
   315  -   OS Disk Name: a random 15-character name prefixed with pkros.
   316  -   Resource Group Name: a random 33-character name prefixed with packer-Resource-Group-.
   317  -   SSH Key Pair: a 2,048-bit asymmetric key pair; can be overridden by the user.
   318  
   319  The default alphabet used for random values is **0123456789bcdfghjklmnpqrstvwxyz**. The alphabet was reduced (no
   320  vowels) to prevent running afoul of Azure decency controls.
   321  
   322  The password alphabet used for random values is **0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ**.
   323  
   324  ### Windows
   325  
   326  The Windows implementation is very similar to the Linux build, with the exception that it deploys a template to
   327  configure KeyVault. Packer communicates with a Windows VM using the WinRM protocol. Windows VMs on Azure default to
   328  using both password and certificate based authentication for WinRM. The password is easily set via the VM ARM template,
   329  but the certificate requires an intermediary. The intermediary for Azure is KeyVault. The certificate is uploaded to a
   330  new KeyVault provisioned in the same resource group as the VM. When the Windows VM is deployed, it links to the
   331  certificate in KeyVault, and Azure will ensure the certificate is injected as part of deployment.
   332  
   333  The basic steps for a Windows build are:
   334  
   335  1.  Create a resource group.
   336  2.  Validate and deploy a KeyVault template.
   337  3.  Validate and deploy a VM template.
   338  4.  Execute provision - defined by the user; typically shell commands.
   339  5.  Power off and capture the VM.
   340  6.  Delete the resource group.
   341  7.  Delete the temporary VM's OS disk.
   342  
   343  A Windows build requires two templates and two deployments. Unfortunately, the KeyVault and VM cannot be deployed at
   344  the same time hence the need for two templates and deployments. The time required to deploy a KeyVault template is
   345  minimal, so overall impact is small.
   346  
   347  > The KeyVault certificate is protected using the object\_id of the SPN. This is why Windows builds require object\_id,
   348  > and an SPN. The KeyVault is deleted when the resource group is deleted.
   349  
   350  See the [examples/azure](https://github.com/hashicorp/packer/tree/master/examples/azure) folder in the packer project
   351  for more examples.