En el artículo de hoy voy a hablar de Packer, una herramienta con la cual podemos crear nuestras imágenes customizadas para crear máquinas virtuales (a partir de ahora VM) en Azure.

Packer es una herramienta open source de Hashicorp (los mismos de Terraform) que nos permite crear nuestras imágenes customizadas.

En este artículo vamos a crear una VM Windows Server 2019, partiendo de una VM base disponible en la galería de VM de Azure.

Como ya estoy harto de ver ejemplos de cómo crear VM Windows con Packer instalando un IIS, en este artículo vamos a “añadir” a nuestra imagen lo siguiente:

-Vamos a instalar Chocolatey. Chocolatey es un gestor de software para entornos Windows. Sería el equivalente de apt-get de Debian o Ubuntu

-Una vez instalado Chocolatey, con este vamos a instalar Terraform e Inspec.

Esta imagen que vamos a crear, por ejemplo  la puedo usar para realizar mis pruebas con Terraform e Inspec.

Una vez explicado brevemente que es Packer y que tipo de imagen vamos a crear, nos ponemos manos a la obra.

Los pasos a seguir son:

1) Instalar Packer a  en nuestra máquina través de chocolatey. Para ello desde la línea de comandos en modo administrador ejecutar:

choco install packer -y

NOTA: En caso de no tener Chocolatey instalado, la instalación de este es tan fácil como realizar lo siguiente:

a) Ejecutar Powershell en modo administración

b) Lanzar el siguiente comando en la consola de Powershell:

Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString(‘https://chocolatey.org/install.ps1’))

2) Si tampoco tuvierais instalado azure cli, pues instalarlo también a través de Chocolatey ejecutando el siguiente comando.

choco install azure-cli –y

3) El siguiente paso es logarse a través de azure cli, para ello hacemos:

az login

4) Se abre una ventana del navegador para que hagamos login con nuestro usuario de Azure.

5) Una vez ya autenticados volvemos a la línea de comandos. Creamos un grupo de recursos de Azure llamado packer dentro de la location West Europe.

az group create -n packer -l westeurope

Es en este grupo de recursos donde quedara alojada la imagen de nuestra VM.

6) Ahora vamos a crear un Service principal, también con azure cli. El comando a ejecutar es este:

az ad sp create-for-rbac –query “{ client_id: appId, client_secret: password, tenant_id: tenant }”

Necesitamos crear un Service Principal de cara a poder crear nuestra imagen.

7) El comando anterior nos crea el service principal y nos devuelve la información relevante al service principal creado. Esta información debemos de almacenarla para usarla a posteriori.

8) Ahora ejecutamos el siguiente comando para saber cuál es nuestro subscriptionid.

az account show

9) Nuestro siguiente paso es crearnos las siguientes variables de entorno con los valores del service principal y subscriptionid.

10) Ahora nos creamos una carpeta llamada PackerWindowsImage.

mkdir PackerWindowsImage

11) Ahora en línea de comando ponemos lo siguiente para obtener todas aquellas máquinas virtuales con S.O Microsoft de la galería de VM de  Azure  disponibles en la región West Europe

az vm image list –publisher Microsoft  –location westeurope

Nota: Este comando devuelve las imágenes más comunes. Para un listado completo de imágenes añadir el parámetro –all . Por ejemplo:

az vm image list –publisher Microsoft –all

12) Se nos devuelve las imágenes disponibles en base a esa búsqueda. En nuestro caso vamos a crear con Packer una imagen de Windows Server 2019. Es por ello que nos copiamos la siguiente información:

13) Ahora dentro de la carpeta PackerWindowsImage creamos un fichero llamado windowspacker.json con el siguiente contenido:

A través de ficheros json es como definimos las imágenes que se van a crear con Packer.

A continuación comento cada una de las partes del json:

– Variables

En esta parte definimos las variables que van a ser usadas en otros sitios/partes del json. En nuestro caso estamos definiendo 4 variables, diciendo que el valor se obtiene de variables de entorno. Recordad que estas variables de entorno las hemos creado en un paso anterior.

Builders

Es en esta parte donde definimos que tipo de imagen vamos a crear, en nuestro caso decimos que va ser de Azure.

Como va ser una imagen de Azure, estamos obligados a definir el clientid, client secret, tenantid y subscriptionid. Estos valores son  obtenidos de la parte de variables definidas al principio del json, y la forma de recuperar estos valores es siguiendo la nomenclatura   {{user `{nombre_variable}`}}

Luego definimos cual va a ser el resource group donde va a quedar depositada la imagen creada así como el nombre de la imagen.

Después definimos cuál va a ser la imagen base de la galería de imágenes de Azure. Los valores a poner en esta sección lo obtuvimos de un paso anterior cuando usamos el comando az vm image list –publisher Microsoft –all

Recordad sustituir las partes de {REPLACE_ME} por los valores correspondientes.

En la siguiente parte configuramos como nos vamos a comunicar con la imagen (la máquina virtual vamos) que vamos a crear. Esto es imprescindible para poder customizar realmente nuestra imagen. Como es Windows, decimos que usamos WinRM. También decimos que vamos a comunicarnos por https (winrm_ssl_secure),  que no va a comprobar el certificado del servidor, que el tiempo máximo expresado en minutos para intentar conectar a través de winrm va a ser 3 minutos y que el usuario que va conectar por winrm se llama packer.

Ya por último viene la parte más importante, que es la parte de Provisioners, que es al fin y al cabo la parte que customiza nuestra imagen y la diferencia de ser la misma imagen de la galería de Azure que usamos como base para crear la nuestra. Es en esta parte de provisioners donde se configura cosas tales como el software que queremos instalar, instalación de certificados etc.. Al fin y al cabo todo lo que quieras customizar de tu imagen va en esta parte.

En nuestro ejemplo tenemos una parte donde decimos que vamos a ejecutar un script de Powershell, donde vamos a instalar Chocolatey, para después instalar Inspec y Terraform con el mismo Chocolatey.

Luego decimos que vamos a reiniciar la VM.

Por último vamos a ejecutar un script de Powershell ubicado en un fichero llamado  sysprep.ps1 en la carpeta scripts

Este fichero, lo que hace es usar la herramienta sysprep, que para el que no lo sepa es una herramienta utilizada para “generalizar”  en nuestro caso la VM creada , para que esta pueda ser usada para crear nuevas VM.

14) Una vez configurado el fichero correctamente lanzamos el comando que comprueba que nuestro fichero json es correcto.

packer validate windowspacker.json

15) Ahora ya si ya lanzamos el comando para crear la nueva imagen que es:

packer build windowspacker.json

16) El proceso demora un tiempo, eso es así. Ve a tomarte un café tranquilamente.

17) Una vez ya generado correctamente nuestra imagen,  ya podemos ir a Azure y más concretamente al resource group donde se ha creado nuestra imagen de Packer. Pulsamos en la imagen creada.

18) Ahora pulsamos en + Crear máquina virtual

19) Configuramos los valores de la máquina a crear, ya sabes usuario, pass, nombre máquina, tamaño etc…

20) Pulsamos en Review + create

21) Una vez creada la máquina nos conectamos por escritorio remoto.

22) Una vez dentro de la máquina, vamos a línea de comandos y lanzamos los siguientes comandos:

choco

inspec

terraform

Podéis ver como efectivamente se ha instalado correctamente este software.

También decir que si en algún momento queréis modificar la imagen creada, podéis volver a generar una nueva versión de la imagen usando el parámetro force al generar la imagen:

packer build -force windowspacker.json

El código usado en el artículo podéis encontarlo en el siguiente repositorio de Github:

https://github.com/recetasdevops/PackerPost

Esto es todo. Espero os haya gustado y hasta la próxima.

Leave a Reply

Your email address will not be published. Required fields are marked *