Este grupo redactor ha estado por horas buscando para darle resolución a tus dudas, te regalamos la soluciones así que nuestro deseo es serte de mucha ayuda.
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 elmanaged_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 elstorage_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 elsku
parámetro astandard
. 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.
Reseñas y puntuaciones
Si te animas, puedes dejar un tutorial acerca de qué te ha gustado de esta reseña.