Automation with Hashicorp Packer #9: Azure Image & multiple providers

3 min read 2 hours ago
Published on Oct 22, 2024 This response is partially generated with the help of AI. It may contain inaccuracies.

Table of Contents

Introduction

In this tutorial, we will explore how to automate image creation using Hashicorp Packer, specifically focusing on Azure images and managing multiple providers. Packer is a versatile tool that allows us to build custom images for various platforms, including AWS, Azure, and GCP. This guide will provide step-by-step instructions to effectively utilize the Azure RM provisioner.

Step 1: Install Hashicorp Packer

Before diving into image creation, ensure you have Packer installed on your machine.

  • Visit the Hashicorp Packer website.
  • Download the appropriate version for your operating system.
  • Follow the installation instructions specific to your OS.
  • Verify the installation by running the command in your terminal:
    packer version
    

Step 2: Set Up Azure Credentials

To create images in Azure, you need to configure your Azure credentials.

  • Log in to the Azure portal.
  • Create a new service principal:
    az ad sp create-for-rbac --name <your_service_principal_name> --role Contributor --scopes /subscriptions/<your_subscription_id>
    
  • Take note of the output, especially the appId, password, and tenant.
  • Set the environment variables in your terminal:
    export AZURE_CLIENT_ID=<appId>
    export AZURE_CLIENT_SECRET=<password>
    export AZURE_TENANT_ID=<tenant>
    

Step 3: Create a Packer Template

You will now create a Packer template that specifies how to build the Azure image.

  • Create a new JSON file (e.g., azure-image.json).
  • Define the builders and provisioners in the template:
    {
      "builders": [
        {
          "type": "azure-arm",
          "client_id": "{{env `AZURE_CLIENT_ID`}}",
          "client_secret": "{{env `AZURE_CLIENT_SECRET`}}",
          "tenant_id": "{{env `AZURE_TENANT_ID`}}",
          "subscription_id": "<your_subscription_id>",
          "resource_group": "<your_resource_group>",
          "image": "<your_image_name>",
          "managed_image_resource_group_name": "<your_resource_group>",
          "os_type": "Linux"
        }
      ],
      "provisioners": [
        {
          "type": "shell",
          "inline": [
            "echo Hello World"
          ]
        }
      ]
    }
    

Step 4: Build the Azure Image

With your template created, you can now build the image.

  • Run the following command in your terminal:

    packer build azure-image.json
    
  • Monitor the output for any errors and confirm that the image is successfully created.

Step 5: Manage Multiple Providers

To create images across multiple providers, extend your Packer template.

  • Add additional builders for each cloud provider you want to support:

    {
      "builders": [
        {
          "type": "azure-arm",
          ...
        },
        {
          "type": "amazon-ebs",
          "access_key": "{{env `AWS_ACCESS_KEY`}}",
          "secret_key": "{{env `AWS_SECRET_KEY`}}",
          "region": "us-east-1",
          "source_ami": "<source_ami_id>",
          "instance_type": "t2.micro",
          "ssh_username": "ubuntu"
        }
      ]
    }
    
  • Update the provisioners as needed for each provider.

Conclusion

In this tutorial, we covered the essentials of automating image creation with Hashicorp Packer, focusing on Azure and managing multiple providers. Key steps included installing Packer, configuring Azure credentials, creating a Packer template, and building the image.

Now that you have the foundational knowledge, consider exploring advanced features of Packer or integrating your workflow with CI/CD pipelines for even greater automation.