Öğretici: Ansible kullanarak Azure Application Gateway ile web trafiğini yönetme

Önemli

Bu makaledeki örnek playbook'ları çalıştırmak için Ansible 2.7 (veya üzeri) gereklidir.

Azure Application Gateway, web uygulamalarınıza trafiği yönetmenizi sağlayan bir web trafiği yük dengeleyicisidir. Geleneksel yük dengeleyiciler, kaynak IP adresine ve bağlantı noktasına göre trafiği bir hedef IP adresine ve bağlantı noktasına yönlendirir. Application Gateway, trafiğin URL'ye göre yönlendirilebileceği daha iyi bir denetim düzeyi sunar. Örneğin, URL'nin yoluysa images trafiğin görüntüler için yapılandırılmış belirli bir sunucu kümesine (havuz olarak bilinir) yönlendirildiğini tanımlayabilirsiniz.

Bu makalede şunları öğreneceksiniz:

  • Ağ ayarlama
  • HTTPD görüntüleriyle iki Azure kapsayıcı örneği oluşturma
  • Sunucu havuzundaki Azure kapsayıcı örnekleriyle çalışan bir uygulama ağ geçidi oluşturma

Önkoşullar

  • Azure aboneliği: Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

Bir kaynak grubu oluşturun

Bu bölümdeki playbook kodu bir Azure kaynak grubu oluşturur. Kaynak grubu, Azure kaynaklarının yapılandırıldığı mantıksal bir kapsayıcıdır.

Aşağıdaki playbook'u rg.yml olarak kaydedin.

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

Playbook'u çalıştırmadan önce aşağıdaki notlara bakın:

  • Kaynak grubu adı şeklindedir myResourceGroup. Bu değer eğitim boyunca kullanılır.
  • Kaynak grubu eastus konumunda oluşturulur.

Ansible-playbook kullanarak playbook'u çalıştırın

ansible-playbook rg.yml

Ağ kaynakları oluşturma

Bu bölümdeki playbook kodu, uygulama ağ geçidinin diğer kaynaklarla iletişim kurmasını sağlamak için bir sanal ağ oluşturur.

Aşağıdaki playbook'u vnet_create.yml olarak kaydedin.

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

Playbook'u çalıştırmadan önce aşağıdaki notlara bakın:

  • vars bölümü, ağ kaynaklarını oluşturmak için kullanılan değerleri içerir.
  • Belirli bir ortamınız için bu değerleri değiştirmeniz gerekir.

Ansible-playbook kullanarak playbook'u çalıştırın

ansible-playbook vnet_create.yml

Sunucu oluşturma

Bu bölümdeki playbook kodu, uygulama ağ geçidi için web sunucusu olarak kullanılacak HTTPD görüntüleriyle iki Azure kapsayıcı örneği oluşturur.

Aşağıdaki playbook'u aci_create.yml olarak kaydedin.

- 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

Ansible-playbook kullanarak playbook'u çalıştırın

ansible-playbook aci_create.yml

Uygulama ağ geçidi oluşturma

Bu bölümdeki playbook kodu, myAppGateway adlı bir uygulama ağ geçidi oluşturur.

Aşağıdaki playbook'u appgw_create.yml olarak kaydedin.

- 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 1
      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_v2
          tier: standard_v2
          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

Playbook'u çalıştırmadan önce aşağıdaki notlara bakın:

  • appGatewayIP bloğunda gateway_ip_configurations tanımlanır. Ağ geçidinin IP yapılandırması için bir alt ağ başvurusu gereklidir.
  • appGatewayBackendPool bloğunda backend_address_pools tanımlanır. Bir uygulama ağ geçidinin en az bir arka uç adres havuzu olmalıdır.
  • appGatewayBackendHttpSettings bloğunda backend_http_settings_collection tanımlanır. İletişim için 80 numaralı bağlantı noktasının ve http protokollerinin kullanıldığını belirtir.
  • appGatewayHttpListener bloğunda backend_http_settings_collection tanımlanır. appGatewayBackendPool ile ilişkilendirilmiş varsayılan dinleyicidir.
  • appGatewayFrontendIP bloğunda frontend_ip_configurations tanımlanır. myAGPublicIPAddress öğesini appGatewayHttpListener'a atar.
  • rule1 bloğunda request_routing_rules tanımlanır. AppGatewayHttpListener ile ilişkili varsayılan yönlendirme kuralıdır.

Ansible-playbook kullanarak playbook'u çalıştırın

ansible-playbook appgw_create.yml

Uygulama ağ geçidinin oluşturulması birkaç dakika sürebilir.

Uygulama ağ geçidini test edin

  1. Kaynak grubu oluştur bölümünde bir konum belirtirsiniz. Değerini not edin.

  2. Ağ kaynakları oluştur bölümünde etki alanını belirtirsiniz. Değerini not edin.

  3. Aşağıdaki deseni konum ve etki alanıyla değiştirerek test URL'si için: http://<domain>.<location>.cloudapp.azure.com.

  4. Test URL'sine göz atın.

  5. Aşağıdaki sayfayı görürseniz, uygulama ağ geçidi beklendiği gibi çalışıyor.

    Çalışan bir uygulama ağ geçidinin başarılı testi

Kaynakları temizle

  1. Aşağıdaki kodu olarak delete_rg.ymlkaydedin.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. ansible-playbook komutunu kullanarak playbook'u çalıştırın. Yer tutucuyu silinecek kaynak grubunun adıyla değiştirin. Kaynak grubundaki tüm kaynaklar silinir.

    ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
    

    Önemli noktalar:

    • Playbook'un register değişkeni ve debug bölümü nedeniyle, komut tamamlandığında sonuçlar görüntülenir.

Sonraki Adımlar