Tutorial: Administración del tráfico web con Azure Application Gateway mediante AnsibleTutorial: Manage web traffic with Azure Application Gateway using Ansible

Importante

Para ejecutar los cuadernos de estrategias de ejemplo de este tutorial, se requiere Ansible 2.7 (o cualquier versión posterior).Ansible 2.7 (or later) is required to run the sample playbooks in this article.

Azure Application Gateway es un equilibrador de carga de tráfico web que permite administrar el tráfico a las aplicaciones web.Azure Application Gateway is a web traffic load balancer that enables you to manage traffic to your web applications. En función del puerto y la dirección IP de origen, los equilibradores de carga tradicionales enrutan el tráfico a un puerto y una dirección IP de destino.Based on the source IP address and port, traditional load balancers route traffic to a destination IP address and port. Application Gateway proporciona un mayor nivel de control donde se puede enrutar el tráfico según la dirección URL.Application Gateway gives you a finer level of control where traffic can be routed based on the URL. Por ejemplo, podría definir que, si images es la ruta de acceso a la dirección URL, el tráfico se enrute a un conjunto de servidores específico (conocido como grupo) configurado para las imágenes.For example, you could define that if images is URL's path, traffic is routed to a specific set of servers (known as a pool) configured for images.

En este tutorial, se usa Ansible para:In this tutorial, Ansible is used to:

  • Configurar una redSet up a network
  • Creación de dos instancias de contenedor de Azure con imágenes HTTPDCreate two Azure container instances with HTTPD images
  • Creación de una puerta de enlace de aplicación que funciona con las instancias de contenedor de Azure del clúster de servidoresCreate an application gateway that works with the Azure container instances in the server pool

Requisitos previosPrerequisites

  • Suscripción de Azure: Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.Azure subscription: If you don't have an Azure subscription, create a free account before you begin.

Crear un grupo de recursosCreate a resource group

El código del cuaderno de estrategias de esta sección crea un grupo de recursos de Azure.The playbook code in this section creates an Azure resource group. Un grupo de recursos es un contenedor lógico en el que se configuran los recursos de Azure.A resource group is a logical container in which Azure resources are configured.

Guarde el siguiente cuaderno de estrategias como rg.yml:Save the following playbook as rg.yml:

- hosts: localhost
  vars:
    resource_group: myResourceGroup
    location: eastus 
  tasks:
    - name: Create a resource group
      azure_rm_resourcegroup:
        name: "{{ resource_group }}"
        location: "{{ location }}"

Antes de ejecutar el cuaderno de estrategias, vea las notas siguientes:Before running the playbook, see the following notes:

  • El nombre del grupo de recursos es myResourceGroup.The resource group name is myResourceGroup. Este valor se utiliza a lo largo del tutorial.This value is used throughout the tutorial.
  • El grupo de recursos se crea en la ubicación eastus.The resource group is created in the eastus location.

Ejecute el comando de estrategias con el comando ansible-playbook:Run the playbook using the ansible-playbook command:

ansible-playbook rg.yml

Crear recursos de redCreate network resources

El código del cuaderno de estrategias de esta sección crea una red virtual para permitir que la puerta de enlace de aplicación se comunique con otros recursos.The playbook code in this section creates a virtual network to enable the application gateway to communicate with other resources.

Guarde el siguiente cuaderno de estrategias como vnet_create.yml:Save the following playbook as vnet_create.yml:

- hosts: localhost
  vars:
    resource_group: myResourceGroup
    location: eastus 
    vnet_name: myVNet 
    subnet_name: myAGSubnet 
    publicip_name: myAGPublicIPAddress
    publicip_domain: mydomain
  tasks:
    - name: Create a virtual network
      azure_rm_virtualnetwork:
        name: "{{ vnet_name }}"
        resource_group: "{{ resource_group }}"
        address_prefixes_cidr:
            - 10.1.0.0/16
            - 172.100.0.0/16
        dns_servers:
            - 127.0.0.1
            - 127.0.0.2

    - name: Create a subnet
      azure_rm_subnet:
        name: "{{ subnet_name }}"
        virtual_network_name: "{{ vnet_name }}"
        resource_group: "{{ resource_group }}"
        address_prefix_cidr: 10.1.0.0/24

    - name: Create a public IP address
      azure_rm_publicipaddress:
        resource_group: "{{ resource_group }}" 
        allocation_method: Dynamic
        name: "{{ publicip_name }}"
        domain_name_label: "{{ publicip_domain }}"

Antes de ejecutar el cuaderno de estrategias, vea las notas siguientes:Before running the playbook, see the following notes:

  • La sección vars contiene los valores que se usan para crear los recursos d red.The vars section contains the values that are used to create the network resources.
  • Deberá cambiar estos valores para su entorno específico.You'll need to change these values for your specific environment.

Ejecute el comando de estrategias con el comando ansible-playbook:Run the playbook using the ansible-playbook command:

ansible-playbook vnet_create.yml

Creación de servidoresCreate servers

El código del cuaderno de estrategias de esta sección crea dos instancias de contenedor de Azure con imágenes HTTPD para usarlos como servidores web para la puerta de enlace de aplicación.The playbook code in this section creates two Azure container instances with HTTPD images to be used as web servers for the application gateway.

Guarde el siguiente cuaderno de estrategias como aci_create.yml:Save the following playbook as aci_create.yml:

- hosts: localhost
  vars:
    resource_group: myResourceGroup
    location: eastus 
    aci_1_name: myACI1
    aci_2_name: myACI2
  tasks:
    - name: Create a container with httpd image 
      azure_rm_containerinstance:
        resource_group: "{{ resource_group }}"
        name: "{{ aci_1_name }}"
        os_type: linux
        ip_address: public
        location: "{{ location }}"
        ports:
          - 80
        containers:
          - name: mycontainer
            image: httpd
            memory: 1.5
            ports:
              - 80

    - name: Create another container with httpd image 
      azure_rm_containerinstance:
        resource_group: "{{ resource_group }}"
        name: "{{ aci_2_name }}"
        os_type: linux
        ip_address: public
        location: "{{ location }}"
        ports:
          - 80
        containers:
          - name: mycontainer
            image: httpd
            memory: 1.5
            ports:
              - 80

Ejecute el comando de estrategias con el comando ansible-playbook:Run the playbook using the ansible-playbook command:

ansible-playbook aci_create.yml

Creación de la puerta de enlace de aplicacionesCreate the application gateway

El código del cuaderno de estrategias de esta sección crea una puerta de enlace de aplicación denominada myAppGateway.The playbook code in this section creates an application gateway named myAppGateway.

Guarde el siguiente cuaderno de estrategias como appgw_create.yml:Save the following playbook as appgw_create.yml:

- hosts: localhost
  connection: local
  vars:
    resource_group: myResourceGroup
    vnet_name: myVNet
    subnet_name: myAGSubnet
    location: eastus
    publicip_name: myAGPublicIPAddress
    appgw_name: myAppGateway
    aci_1_name: myACI1
    aci_2_name: myACI2
  tasks:
    - name: Get info of Subnet
      azure_rm_resource_facts:
        api_version: '2018-08-01'
        resource_group: "{{ resource_group }}"
        provider: network
        resource_type: virtualnetworks
        resource_name: "{{ vnet_name }}"
        subresource:
          - type: subnets
            name: "{{ subnet_name }}"
      register: subnet

    - name: Get info of backend server 2
      azure_rm_resource_facts:
        api_version: '2018-04-01'
        resource_group: "{{ resource_group }}"
        provider: containerinstance
        resource_type: containergroups
        resource_name: "{{ aci_1_name }}"
      register: aci_1_output
    - name: Get info of backend server 2
      azure_rm_resource_facts:
        api_version: '2018-04-01'
        resource_group: "{{ resource_group }}"
        provider: containerinstance
        resource_type: containergroups
        resource_name: "{{ aci_2_name }}"
      register: aci_2_output

    - name: Create instance of Application Gateway
      azure_rm_appgateway:
        resource_group: "{{ resource_group }}"
        name: "{{ appgw_name }}"
        sku:
          name: standard_small
          tier: standard
          capacity: 2
        gateway_ip_configurations:
          - subnet:
              id: "{{ subnet.response[0].id }}"
            name: appGatewayIP
        frontend_ip_configurations:
          - public_ip_address: "{{ publicip_name }}"
            name: appGatewayFrontendIP
        frontend_ports:
          - port: 80
            name: appGatewayFrontendPort
        backend_address_pools:
          - backend_addresses:
              - ip_address: "{{ aci_1_output.response[0].properties.ipAddress.ip }}"
              - ip_address: "{{ aci_2_output.response[0].properties.ipAddress.ip }}"
            name: appGatewayBackendPool
        backend_http_settings_collection:
          - port: 80
            protocol: http
            cookie_based_affinity: enabled
            name: appGatewayBackendHttpSettings
        http_listeners:
          - frontend_ip_configuration: appGatewayFrontendIP
            frontend_port: appGatewayFrontendPort
            name: appGatewayHttpListener
        request_routing_rules:
          - rule_type: Basic
            backend_address_pool: appGatewayBackendPool
            backend_http_settings: appGatewayBackendHttpSettings
            http_listener: appGatewayHttpListener
            name: rule1

Antes de ejecutar el cuaderno de estrategias, vea las notas siguientes:Before running the playbook, see the following notes:

  • appGatewayIP se define en el bloque gateway_ip_configurations.appGatewayIP is defined in the gateway_ip_configurations block. Se necesita una referencia de subred para la configuración IP de la puerta de enlace.A subnet reference is required for IP configuration of the gateway.
  • appGatewayBackendPool se define en el bloque backend_address_pools.appGatewayBackendPool is defined in the backend_address_pools block. Una puerta de enlace de aplicaciones debe tener al menos un grupo de direcciones de servidores back-end.An application gateway must have at least one back-end address pool.
  • appGatewayBackendHttpSettings se define en el bloque backend_http_settings_collection.appGatewayBackendHttpSettings is defined in the backend_http_settings_collection block. Especifica que se use el puerto 80 y un protocolo HTTP para la comunicación.It specifies that port 80 and an HTTP protocol are used for communication.
  • appGatewayHttpListener se define en el bloque backend_http_settings_collection.appGatewayHttpListener is defined in the backend_http_settings_collection block. Agente de escucha predeterminado asociado con appGatewayBackendPool.It's the default listener associated with appGatewayBackendPool.
  • appGatewayFrontendIP se define en el bloque frontend_ip_configurations.appGatewayFrontendIP is defined in the frontend_ip_configurations block. Asigna myAGPublicIPAddress a appGatewayHttpListener.It assigns myAGPublicIPAddress to appGatewayHttpListener.
  • rule1 se define en el bloque request_routing_rules.rule1 is defined in the request_routing_rules block. La regla de enrutamiento predeterminada asociada a appGatewayHttpListener.It's the default routing rule associated with appGatewayHttpListener.

Ejecute el comando de estrategias con el comando ansible-playbook:Run the playbook using the ansible-playbook command:

ansible-playbook appgw_create.yml

La puerta de enlace de aplicaciones puede tardar varios minutos en crearse.It might take several minutes for the application gateway to be created.

Prueba de la puerta de enlace de aplicacionesTest the application gateway

  1. En la sección Creación de un grupo de recursos, debe especificar una ubicación.In the Create a resource group section, you specify a location. Tenga en cuenta su valor.Note its value.

  2. En la sección Creación de recursos de red, debe especificar el dominio.In the Create network resources section, you specify the domain. Tenga en cuenta su valor.Note its value.

  3. Para la dirección URL de prueba, reemplace el siguiente patrón por la ubicación y el dominio: http://<domain>.<location>.cloudapp.azure.com.For the test URL by replacing the following pattern with the location and domain: http://<domain>.<location>.cloudapp.azure.com.

  4. Vaya a la dirección URL de prueba.Browse to the test URL.

  5. Si ve la página siguiente significa que la puerta de enlace de aplicación funciona según lo previsto.If you see the following page, the application gateway is working as expected.

    Prueba correcta de una puerta de enlace de aplicación que funciona

Limpieza de recursosClean up resources

Cuando ya no los necesite, elimine los recursos creados en este artículo.When no longer needed, delete the resources created in this article.

Guarde el siguiente código como cleanup.yml:Save the following code as cleanup.yml:

- hosts: localhost
  vars:
    resource_group: myResourceGroup
  tasks:
    - name: Delete a resource group
      azure_rm_resourcegroup:
        name: "{{ resource_group }}"
        state: absent

Use el comando ansible-playbook para ejecutar el cuaderno de estrategias:Run the playbook using the ansible-playbook command:

ansible-playbook cleanup.yml

Pasos siguientesNext steps