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" .