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