Personaliza tus imagenes de Azure con Packer

Buenos dias Brainers de Azure! Vamos a comenzar con una serie de entradas de IAAS en Azure. En esta serie veremos como contruir imágenes personalizadas para poder usarlas en nuestra subscripción de Azure mediante IAAC (infrastructure as a code) usando Packer. Packer es una herramienta gratuita para creación y gestion de imágenes en diferentes clouds, tanto privadas como públicas.

Comencemos con la instalación. Packer se puede instalar en practicamente cualquier SO. Para ello, nos dirigimos a la pagina de Packer. No requiere de instalación, es un binario que podemos ejecutar desde nuestra shell preferida. Una vez tengamos el fichero descomprimido y en el directorio que hemos elegido, veamos las opciones que nos da la aplicacion.

Para comenzar a usar packer debemos configurar una entidad de servicio para autenticar la aplicacion con nuestra subscripción de Azure. Para ello seguir el siguiente enlace.
https://docs.microsoft.com/en-us/powershell/azure/create-azure-service-principal-azureps?view=azps-1.8.0

Una vez tenemos la aplicación en nuestro equipo y la SPN creada, vamos a escribir nuestro código para personalizar nuestra imágen. En primer lugar debemos conectar con nuestra subscripción de azure. Para ello, nos dirigimos a nuestro editor de código preferido. En mi caso voy a usar Visaul Studio Code.

A continuacion crear un nuevo fichero con extension .json. Packer utilia este lenguaje, al igual que las templates de azure. Copiar el siguiente código

{
  "builders": [{
    "type": "azure-arm",

    "client_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx",
    "client_secret": "ppppppp-pppp-pppp-pppp-ppppppppppp",
    "tenant_id": "zzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz",
    "subscription_id": "yyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyy",

    "managed_image_resource_group_name": "myPackerGroup",
    "managed_image_name": "myPackerImage",

    "os_type": "Windows",
    "image_publisher": "MicrosoftWindowsServer",
    "image_offer": "WindowsServer",
    "image_sku": "2016-Datacenter",

    "communicator": "winrm",
    "winrm_use_ssl": true,
    "winrm_insecure": true,
    "winrm_timeout": "3m",
    "winrm_username": "packer",

    "azure_tags": {
        "dept": "Engineering",
        "task": "Image deployment"
    },

    "location": "East US",
    "vm_size": "Standard_DS2_v2"
  }],
  "provisioners": [{
    "type": "powershell",
    "inline": [
      "Add-WindowsFeature Web-Server",
      "& $env:SystemRoot\\System32\\Sysprep\\Sysprep.exe /oobe /generalize /quiet /quit",
      "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 } }"
    ]
  }]
}

Debeis sustituir el primer bloque por vuestras credenciales y vuestra subscripción. En el ejemplo que os he puesto vamos a crear una imágen de windows server añadiendo el rol de IIS y vamos a hacer un sysprep de la VM. Packer nos va a crear unos recursos temporales en nuestra subscripción para crear la VM y luego generar la imagen.

Para ejecutar packer, abrimos powershell y nos vamos al directorio donde esta packer y nuestro fichero json. Ejecutamos «Packer.exe build Nombredenuestrofichero.json«

Una vez termine de ejecutarse, eliminará estos recursos y tendremos nuestra imágen creada lista para desplegarla como una plantilla.

En el portal de Azure podemos ver como se han eliminado los recursos que packer habia creado para completar la creación de la imágen y ha generado el recurso imagen «mypackerimage»

En el próximo post veremos como crear una shared image gallery para administrar nuestras imágenes, crear versiones de estas y la posibilidad de desplegar una imágen entre nuestras diferentes subscripciones, algo que por defecto, Azure no permite sin crear una galeria de imágenes compartidas.

¿Que os parece esta herramienta? realmente es util cuando tenemos proyectos grandes cuando necesitamos tener diferentes imágenes para nuestras maquinas y cuando el proyecto se divide en varias subscripciones.

Un saludo Brainiers y nos vemos en la siguiente entrada!