Ansible incluye un conjunto de módulos para interactuar con Azure Resource Manager, lo que le brinda las herramientas para crear y orquestar fácilmente la infraestructura en la nube de Microsoft Azure.

Requisitos

El uso de los módulos de Azure Resource Manager requiere tener módulos específicos de Azure SDK instalados en el host que ejecuta Ansible.

$ pip install'ansible[azure]'

Si está ejecutando Ansible desde la fuente, puede instalar las dependencias desde el directorio raíz del repositorio de Ansible.

$ pip install .[azure]

También puede ejecutar Ansible directamente en Azure Cloud Shell, donde Ansible está preinstalado.

Autenticarse con Azure

El uso de los módulos de Azure Resource Manager requiere la autenticación con la API de Azure. Puede elegir entre dos estrategias de autenticación:

  • Nombre de usuario / contraseña de Active Directory
  • Credenciales de principal de servicio

Siga las instrucciones para la estrategia que desea usar, luego continúe con Proporcionar credenciales a los módulos de Azure para obtener instrucciones sobre cómo usar realmente los módulos y autenticarse con la API de Azure.

Utilizando Service Principal

Ahora hay un tutorial oficial detallado que describe cómo crear una entidad de servicio.

Después de recorrer el tutorial, tendrá:

  • Su ID de cliente, que se encuentra en el cuadro “ID de cliente” en la página “Configurar” de su aplicación en Azure Portal.
  • Tu clave secreta, generada cuando creaste la aplicación. No puede mostrar la clave después de la creación. Si perdió la clave, debe crear una nueva en la página “Configurar” de su aplicación.
  • Y finalmente, una identificación de inquilino. Es un UUID (por ejemplo, ABCDEFGH-1234-ABCD-1234-ABCDEFGHIJKL) que apunta al AD que contiene su aplicación. Lo encontrará en la URL desde el portal de Azure o en los “puntos de conexión de vista” de cualquier URL determinada.

Uso de nombre de usuario / contraseña de Active Directory

Para crear un nombre de usuario / contraseña de Active Directory:

  • Conéctese al Portal clásico de Azure con su cuenta de administrador
  • Cree un usuario en su AAD predeterminado. NO debe activar la autenticación multifactor
  • Vaya a Configuración – Administradores
  • Haga clic en Agregar e ingrese el correo electrónico del nuevo usuario.
  • Marque la casilla de verificación de la suscripción que desea probar con este usuario.
  • Inicie sesión en Azure Portal con este nuevo usuario para cambiar la contraseña temporal por una nueva. No podrá utilizar la contraseña temporal para el inicio de sesión de OAuth.

Proporcionar credenciales a los módulos de Azure

Los módulos ofrecen varias formas de proporcionar sus credenciales. Para una herramienta de CI / CD como Ansible Tower o Jenkins, lo más probable es que desee utilizar variables de entorno. Para el desarrollo local, es posible que desee almacenar sus credenciales en un archivo dentro de su directorio de inicio. Y, por supuesto, siempre puede pasar credenciales como parámetros a una tarea dentro de un libro de jugadas. El orden de precedencia son los parámetros, luego las variables de entorno y finalmente un archivo que se encuentra en su directorio de inicio.

Usar variables de entorno

Para pasar las credenciales de la entidad de servicio a través del entorno, defina las siguientes variables:

  • AZURE_CLIENT_ID
  • AZURE_SECRET
  • AZURE_SUBSCRIPTION_ID
  • AZURE_TENANT

Para pasar el nombre de usuario / contraseña de Active Directory a través del entorno, defina las siguientes variables:

  • AZURE_AD_USER
  • CONTRASEÑA_AZURA
  • AZURE_SUBSCRIPTION_ID

Para pasar el nombre de usuario / contraseña de Active Directory en ADFS a través del entorno, defina las siguientes variables:

  • AZURE_AD_USER
  • CONTRASEÑA_AZURA
  • AZURE_CLIENT_ID
  • AZURE_TENANT
  • AZURE_ADFS_AUTHORITY_URL

“AZURE_ADFS_AUTHORITY_URL” es opcional. Es necesario solo cuando tiene su propia autoridad ADFS como https://yourdomain.com/adfs.

Almacenamiento en un archivo

Cuando se trabaja en un entorno de desarrollo, puede ser conveniente almacenar las credenciales en un archivo. Los módulos buscarán credenciales en $HOME/.azure/credentials. Este archivo es un archivo de estilo ini. Se verá de la siguiente manera:

[default]
subscription_id=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
client_id=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
secret=xxxxxxxxxxxxxxxxx
tenant=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Nota

Si sus valores secretos contienen caracteres que no son ASCII, debe Codificación de URL ellos para evitar errores de inicio de sesión.

Es posible almacenar varios conjuntos de credenciales dentro del archivo de credenciales creando varias secciones. Cada sección se considera un perfil. Los módulos buscan el [default] perfil automáticamente. Defina AZURE_PROFILE en el entorno o pase un parámetro de perfil para especificar un perfil específico.

Pasando como parámetros

Si desea pasar credenciales como parámetros a una tarea, use los siguientes parámetros para la entidad de servicio:

  • Identificación del cliente
  • secreto
  • suscripción_id
  • inquilino

O bien, pase los siguientes parámetros para el nombre de usuario / contraseña de Active Directory:

  • ad_user
  • contraseña
  • suscripción_id

O bien, pase los siguientes parámetros para el nombre de usuario / contraseña de ADFS:

  • ad_user
  • contraseña
  • Identificación del cliente
  • inquilino
  • adfs_authority_url

“Adfs_authority_url” es opcional. Es necesario solo cuando tiene su propia autoridad ADFS como https://yourdomain.com/adfs.

Otros entornos de nube

Para usar una nube de Azure que no sea la nube pública predeterminada (por ejemplo, Azure China Cloud, Azure US Government Cloud, Azure Stack), pase el argumento “cloud_environment” a los módulos, configúrelo en un perfil de credencial o establezca “AZURE_CLOUD_ENVIRONMENT” Variable ambiental. El valor es un nombre de nube según lo definido por Azure Python SDK (por ejemplo, “AzureChinaCloud”, “AzureUSGovernment”; el valor predeterminado es “AzureCloud”) o una URL de descubrimiento de metadatos de Azure (para Azure Stack).

Creando Máquinas Virtuales

Hay dos formas de crear una máquina virtual, ambas con el módulo azure_rm_virtualmachine. Podemos crear una cuenta de almacenamiento, una interfaz de red, un grupo de seguridad y una dirección IP pública y pasar los nombres de estos objetos al módulo como parámetros, o podemos dejar que el módulo haga el trabajo por nosotros y acepte los valores predeterminados que elija.

Creación de componentes individuales

Un módulo de Azure está disponible para ayudarlo a crear una cuenta de almacenamiento, red virtual, subred, interfaz de red, grupo de seguridad e IP pública. Aquí hay un ejemplo completo de cómo crear cada uno de estos y pasar los nombres al azure.azcollection.azure_rm_virtualmachine módulo al final:

-name: Create storage account
  azure.azcollection.azure_rm_storageaccount:resource_group: Testing
    name: testaccount001
    account_type: Standard_LRS

-name: Create virtual network
  azure.azcollection.azure_rm_virtualnetwork:resource_group: Testing
    name: testvn001
    address_prefixes:"10.10.0.0/16"-name: Add subnet
  azure.azcollection.azure_rm_subnet:resource_group: Testing
    name: subnet001
    address_prefix:"10.10.0.0/24"virtual_network: testvn001

-name: Create public ip
  azure.azcollection.azure_rm_publicipaddress:resource_group: Testing
    allocation_method: Static
    name: publicip001

-name: Create security group that allows SSH
  azure.azcollection.azure_rm_securitygroup:resource_group: Testing
    name: secgroup001
    rules:-name: SSH
        protocol: Tcp
        destination_port_range:22access: Allow
        priority:101direction: Inbound

-name: Create NIC
  azure.azcollection.azure_rm_networkinterface:resource_group: Testing
    name: testnic001
    virtual_network: testvn001
    subnet: subnet001
    public_ip_name: publicip001
    security_group: secgroup001

-name: Create virtual machine
  azure.azcollection.azure_rm_virtualmachine:resource_group: Testing
    name: testvm001
    vm_size: Standard_D1
    storage_account: testaccount001
    storage_container: testvm001
    storage_blob: testvm001.vhd
    admin_username: admin
    admin_password: Password!network_interfaces: testnic001
    image:offer: CentOS
      publisher: OpenLogic
      sku:'7.1'version: latest

Cada uno de los módulos de Azure ofrece una variedad de opciones de parámetros. No todas las opciones se muestran en el ejemplo anterior. Consulte cada módulo individual para obtener más detalles y ejemplos.

Crear una máquina virtual con opciones predeterminadas

Si simplemente desea crear una máquina virtual sin especificar todos los detalles, también puede hacerlo. La única advertencia es que necesitará una red virtual con una subred ya en su grupo de recursos. Suponiendo que ya tiene una red virtual con una subred existente, puede ejecutar lo siguiente para crear una máquina virtual:

azure.azcollection.azure_rm_virtualmachine:resource_group: Testing
  name: testvm10
  vm_size: Standard_D1
  admin_username: chouseknecht
  ssh_password_enabled:falsessh_public_keys:" ssh_keys "image:offer: CentOS
    publisher: OpenLogic
    sku:'7.1'version: latest

Creación de una máquina virtual en zonas de disponibilidad

Si desea crear una máquina virtual en una zona de disponibilidad, considere lo siguiente:

  • Tanto el disco del sistema operativo como el disco de datos deben ser un “disco administrado”, no un “disco no administrado”.
  • Al crear una VM con el azure.azcollection.azure_rm_virtualmachine módulo, debe establecer explícitamente el managed_disk_type parámetro para cambiar el disco del sistema operativo a un disco administrado. De lo contrario, el disco del sistema operativo se convierte en un disco no administrado.
  • Cuando crea un disco de datos con el azure.azcollection.azure_rm_manageddisk módulo, debe especificar explícitamente el storage_account_type para convertirlo en un disco administrado. De lo contrario, el disco de datos será un disco no administrado.
  • Un disco administrado no requiere una cuenta de almacenamiento o un contenedor de almacenamiento, a diferencia de un disco no administrado. En particular, tenga en cuenta que una vez que se crea una máquina virtual en un disco no administrado, se crea automáticamente un contenedor de almacenamiento innecesario llamado “vhds”.
  • Cuando crea una dirección IP con la azure.azcollection.azure_rm_publicipaddress módulo, debe configurar el sku parámetro a standard. De lo contrario, la dirección IP no se puede utilizar en una zona de disponibilidad.

Script de inventario dinámico

Si no está familiarizado con los scripts de inventario dinámico de Ansible, consulte Introducción al inventario dinámico.

El script de inventario de Azure Resource Manager se llama azure_rm.py. Se autentica con la API de Azure exactamente igual que los módulos de Azure, lo que significa que definirá las mismas variables de entorno descritas anteriormente en Uso de variables de entorno, creará una $HOME/.azure/credentials archivo (también descrito anteriormente en Almacenamiento en un archivo), o pasar parámetros de línea de comando. Para ver las opciones de línea de comando disponibles, ejecute lo siguiente:

$ wget https://raw.githubusercontent.com/ansible-collections/community.general/main/scripts/inventory/azure_rm.py
$ ./azure_rm.py --help

Al igual que con todos los scripts de inventario dinámico, el script se puede ejecutar directamente, pasar como un parámetro al comando ansible o pasar directamente a ansible-playbook usando la opción -i. Independientemente de cómo se ejecute, el script genera JSON que representa todos los hosts que se encuentran en su suscripción de Azure. Puede limitar esto a solo los hosts que se encuentran en un conjunto específico de grupos de recursos de Azure, o incluso a un host específico.

Para un host determinado, el script de inventario proporciona las siguientes variables de host:

"ansible_host":"XXX.XXX.XXX.XXX","computer_name":"computer_name2","fqdn":null,"id":"/subscriptions/subscription-id/resourceGroups/galaxy-production/providers/Microsoft.Compute/virtualMachines/object-name","image":"offer":"CentOS","publisher":"OpenLogic","sku":"7.1","version":"latest","location":"westus","mac_address":"00-00-5E-00-53-FE","name":"object-name","network_interface":"interface-name","network_interface_id":"/subscriptions/subscription-id/resourceGroups/galaxy-production/providers/Microsoft.Network/networkInterfaces/object-name1","network_security_group":null,"network_security_group_id":null,"os_disk":"name":"object-name","operating_system_type":"Linux","plan":null,"powerstate":"running","private_ip":"172.26.3.6","private_ip_alloc_method":"Static","provisioning_state":"Succeeded","public_ip":"XXX.XXX.XXX.XXX","public_ip_alloc_method":"Static","public_ip_id":"/subscriptions/subscription-id/resourceGroups/galaxy-production/providers/Microsoft.Network/publicIPAddresses/object-name","public_ip_name":"object-name","resource_group":"galaxy-production","security_group":"object-name","security_group_id":"/subscriptions/subscription-id/resourceGroups/galaxy-production/providers/Microsoft.Network/networkSecurityGroups/object-name","tags":"db":"mysql","type":"Microsoft.Compute/virtualMachines","virtual_machine_size":"Standard_DS4"

Grupos de anfitriones

Por defecto, los hosts están agrupados por:

  • azur (todos los hosts)
  • nombre del lugar
  • nombre del grupo de recursos
  • nombre del grupo de seguridad
  • clave de etiqueta
  • etiqueta key_value
  • os_disk tipo_sistema_operativo (Windows / Linux)

Puede controlar las agrupaciones de hosts y la selección de hosts definiendo variables de entorno o creando un archivo azure_rm.ini en su directorio de trabajo actual.

NOTA: Un archivo .ini tendrá prioridad sobre las variables de entorno.

NOTA: El nombre del archivo .ini es el nombre base del script de inventario (en otras palabras, ‘azure_rm’) con una extensión ‘.ini’. Esto le permite copiar, renombrar y personalizar el script de inventario y tener archivos .ini coincidentes en el mismo directorio.

Controle la agrupación utilizando las siguientes variables definidas en el entorno:

  • AZURE_GROUP_BY_RESOURCE_GROUP = sí
  • AZURE_GROUP_BY_LOCATION = sí
  • AZURE_GROUP_BY_SECURITY_GROUP = sí
  • AZURE_GROUP_BY_TAG = sí
  • AZURE_GROUP_BY_OS_FAMILY = sí

Seleccione hosts dentro de grupos de recursos específicos asignando una lista separada por comas para:

  • AZURE_RESOURCE_GROUPS = resource_group_a, resource_group_b

Seleccione hosts para una clave de etiqueta específica asignando una lista de claves de etiqueta separadas por comas a:

  • AZURE_TAGS = clave1, clave2, clave3

Seleccione hosts para ubicaciones específicas asignando una lista de ubicaciones separadas por comas a:

  • AZURE_LOCATIONS = eastus, eastus2, westus

O bien, seleccione hosts para pares de clave: valor de etiqueta específicos asignando una lista de pares clave: valor separados por comas a:

  • AZURE_TAGS = clave1: valor1, clave2: valor2

Si no necesita el estado de energía, puede mejorar el rendimiento desactivando la búsqueda de estado de energía:

  • AZURE_INCLUDE_POWERSTATE = no

Se incluye un archivo azure_rm.ini de muestra junto con el script de inventario en aquí. Un archivo .ini contendrá lo siguiente:

[azure]
# Control which resource groups are included. By default all resources groups are included.
# Set resource_groups to a comma separated list of resource groups names.
#resource_groups=

# Control which tags are included. Set tags to a comma separated list of keys or key:value pairs
#tags=

# Control which locations are included. Set locations to a comma separated list of locations.
#locations=

# Include powerstate. If you don't need powerstate information, turning it off improves runtime performance.
# Valid values: yes, no, true, false, True, False, 0, 1.
include_powerstate=yes

# Control grouping with the following boolean flags. Valid values: yes, no, true, false, True, False, 0, 1.
group_by_resource_group=yes
group_by_location=yes
group_by_security_group=yes
group_by_tag=yes
group_by_os_family=yes

Ejemplos de

A continuación, se muestran algunos ejemplos que utilizan el script de inventario:

# Download inventory script
$ wget https://raw.githubusercontent.com/ansible-collections/community.general/main/scripts/inventory/azure_rm.py

# Execute /bin/uname on all instances in the Testing resource group
$ ansible -i azure_rm.py Testing -m shell -a "/bin/uname -a"# Execute win_ping on all Windows instances
$ ansible -i azure_rm.py windows -m win_ping

# Execute ping on all Linux instances
$ ansible -i azure_rm.py linux -m ping# Use the inventory script to print instance specific information
$ ./azure_rm.py --host my_instance_host_name --resource-groups=Testing --pretty

# Use the inventory script with ansible-playbook
$ ansible-playbook -i ./azure_rm.py test_playbook.yml

A continuación, se muestra una guía sencilla para ejercitar el script de inventario de Azure:

-name: Test the inventory script
  hosts: azure
  connection: local
  gather_facts: no
  tasks:-debug:msg:" inventory_hostname  has powerstate  powerstate "

Puede ejecutar el libro de jugadas con algo como:

$ ansible-playbook -i ./azure_rm.py test_azure_inventory.yml

Deshabilitar la validación de certificados en puntos de conexión de Azure

Cuando hay un proxy HTTPS presente, o cuando se usa Azure Stack, puede ser necesario deshabilitar la validación de certificados para los puntos de conexión de Azure en los módulos de Azure. Esta no es una práctica de seguridad recomendada, pero puede ser necesaria cuando el almacén de CA del sistema no se puede modificar para incluir el certificado de CA necesario. La validación de certificados se puede controlar estableciendo el valor “cert_validation_mode” en un perfil de credenciales, mediante la variable de entorno “AZURE_CERT_VALIDATION_MODE” o pasando el argumento “cert_validation_mode” a cualquier módulo de Azure. El valor predeterminado es “validar”; establecer el valor en “ignorar” evitará la validación de todos los certificados. El argumento del módulo tiene prioridad sobre un valor de perfil de credencial, que tiene prioridad sobre el valor del entorno.