Skip to main content

Ejemplo Azure

En este ejemplo vamos a utilizar Ansible para configurar un CentOS en Azure.

El proyecto se encuentra en azure-ansible

  • Hardening usando una collection lista
  • Actualización del sistema operativo
  • Resolv.conf
  • MOTD
  • Instalación de Docker
  • NTP

La propuesta es no utilizar scripts, solamente playbooks de Ansible. No voy a explicar playbooks de Ansible, pero sí cómo podemos utilizarlos.

Existe el plugin de Ansible, pero en el caso de este proyecto vamos a copiar los playbooks dentro de la VM del source y ejecutar los playbooks desde dentro de la máquina para configurarla, por eso el uso de localhost.

Para que el playbook se ejecute es necesario tener Ansible instalado y las collections necesarias. Por eso fue separado un provisioner shell para primero dejar todo preparado para después solamente ejecutar el playbook.

Source Azure

En el caso del source para Azure es necesario prestar atención a algunos detalles

Una vez que use_azure_cli_auth = true, previamente necesitas ejecutar el comando az login. Esto facilitará no tener que pasar los siguientes parámetros que dejé comentados si es necesario.

  • client_id = var.client_id
  • client_secret = var.client_secret
  • tenant_id = var.tenant_id
  • subscription_id = var.subscription_id

Observa que para estos parámetros preferí obtenerlos de variables y estas usan valores exportados anteriormente. Esto ya ayudará en caso de pipelines.

Ejemplo:

variable "client_secret" {
description = "AZURE Client Secret"
type = string
default = env("AZURE_CLIENT_SECRET")
}

En ese caso sería necesario exportar.

export ARM_CLIENT_ID=xxxxx-xxxx-xxxx-xxx-xxx
export ARM_CLIENT_SECRET=xxxxx-xxxx-xxxx-xxx-xxx
export ARM_SUBSCRIPTION_ID=xxxxx-xxxx-xxxx-xxx-xxx
export ARM_TENANT_ID=xxxxx-xxxx-xxxx-xxx-xxx

Las nubes nombran las regiones y VMs de forma diferente. Por eso creé un map para ambos y solamente pasamos 1 valor y automáticamente ya buscará el nombre correcto. Queda la sugerencia. Esto es muy bueno para varios sources al mismo tiempo.

Otro detalle es que elegí una imagen que no es community, o sea, free, por lo que es necesario pasar el plan también.

source "azure-arm" "azure" {

# client_id = var.client_id
# client_secret = var.client_secret
# tenant_id = var.tenant_id
# subscription_id = var.subscription_id

use_azure_cli_auth = true

plan_info {
plan_publisher = var.image_publisher
plan_product = var.image_offer
plan_name = var.image_sku
}

os_type = "Linux"
image_publisher = var.image_publisher
image_offer = var.image_offer
image_sku = var.image_sku

managed_image_resource_group_name = "packer"
managed_image_name = local.full_image_name

azure_tags = var.vm_tags

# Vea los maps en locals y conditions en las variables.

location = local.map_regions[var.region]["azure"]
vm_size = var.instance_sizes["azure"]
}

Ejecutando el proyecto

packer init . --upgrade
packer build "./vars/centos7.pkr.hcl" .