Esercitazione: Distribuire app in set di scalabilità di macchine virtuali in Azure tramite Ansible

Importante

Per eseguire i playbook di esempio contenuti in questo articolo, è necessario usare Ansible 2.7 (o versioni successive).

I set di scalabilità di macchine virtuali di Azure sono una funzionalità di Azure che permette di configurare un gruppo di macchine virtuali con bilanciamento del carico identiche. Non sono previsti costi aggiuntivi per i set di scalabilità, in quanto vengono creati dalle macchine virtuali. Si paga solo per le risorse di calcolo sottostanti, come le istanze di macchina virtuale, il bilanciamento del carico o l'archiviazione su Managed Disks. I set di scalabilità forniscono i livelli di automazione e gestione per eseguire e ridimensionare le applicazioni. È comunque possibile creare e gestire manualmente singole macchine virtuali. Tuttavia, l'uso di set di scalabilità offre due importanti vantaggi. Sono integrati in Azure e ridimensionano automaticamente le macchine virtuale in base alle esigenze dell'applicazione.

In questo articolo vengono illustrate le operazioni seguenti:

  • Recuperare informazioni sull'host per un gruppo di macchine virtuali di Azure
  • Clonare e compilare l'app di esempio
  • Installare JRE (Java Runtime Environment) in un set di scalabilità
  • Distribuire l'applicazione Java in un set di scalabilità

Prerequisiti

  • Sottoscrizione di Azure: se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.
  • git - git viene usato per scaricare un esempio di Java usato in questa esercitazione.
  • Java SE Development Kit (JDK) - JDK viene usato per compilare il progetto Java di esempio.
  • Apache Maven - Apache Maven viene usato per compilare il progetto Java di esempio.

Ottenere informazioni sugli host

Il codice del playbook in questa sezione consente di recuperare informazioni sull'host per un gruppo di macchine virtuali. Il codice ottiene gli indirizzi IP pubblici e il bilanciamento del carico all'interno di un gruppo di risorse specificato e crea un gruppo host denominato scalesethosts nell'inventario.

Salvare il playbook di esempio seguente come get-hosts-tasks.yml:

- name: Get facts for all Public IPs within a resource groups
  azure_rm_publicipaddress_info:
    resource_group: "{{ resource_group }}"
  register: output_ip_address

- name: Get loadbalancer info
  azure_rm_loadbalancer_info:
    resource_group: "{{ resource_group }}"
    name: "{{ loadbalancer_name }}"
  register: output

- name: Add all hosts
  add_host:
    groups: scalesethosts
    hostname: "{{ output_ip_address.publicipaddresses[0].ip_address }}_{{ item.properties.frontendPort }}"
    ansible_host: "{{ output_ip_address.publicipaddresses[0].ip_address }}"
    ansible_port: "{{ item.properties.frontendPort }}"
    ansible_ssh_user: "{{ admin_username }}"
    ansible_ssh_pass: "{{ admin_password }}"
  with_items:
    - "{{ output.ansible_info.azure_loadbalancers[0].properties.inboundNatRules }}"

Preparare un'applicazione per la distribuzione

Il codice del playbook in questa sezione usa git per clonare un progetto di esempio Java da GitHub e compila il progetto.

Salvare il playbook seguente come app.yml:

- hosts: localhost
  vars:
    repo_url: https://github.com/spring-guides/gs-spring-boot.git
    workspace: ~/src/helloworld

  tasks:
  - name: Git Clone sample app
    git:
      repo: "{{ repo_url }}"
      dest: "{{ workspace }}"

  - name: Build sample app
    shell: mvn package chdir="{{ workspace }}/complete"

Eseguire il playbook di Ansible di esempio con il comando seguente:

ansible-playbook app.yml

Dopo avere eseguito il playbook, viene visualizzato un output simile ai risultati seguenti:

PLAY [localhost] 

TASK [Gathering Facts] 
ok: [localhost]

TASK [Git Clone sample app] 
changed: [localhost]

TASK [Build sample app] 
changed: [localhost]

PLAY RECAP 
localhost                  : ok=3    changed=2    unreachable=0    failed=0

Distribuire l'applicazione in un set di scalabilità

Il codice del playbook in questa sezione viene usato per:

  • Installare JRE in un gruppo host denominato saclesethosts
  • Distribuire l'applicazione Java in un gruppo host denominato saclesethosts

È possibile ottenere il playbook di esempio in due modi:

  • Scaricare il playbook e salvarlo in vmss-setup-deploy.yml.

  • Creare un file denominato vmss-setup-deploy.yml. Inserire il codice seguente nel nuovo file:

- hosts: localhost
  vars:
    resource_group: myResourceGroup
    scaleset_name: myScaleSet
    loadbalancer_name: myScaleSetLb
    admin_username: azureuser
    admin_password: "{{ admin_password }}"
  tasks:
  - include: get-hosts-tasks.yml

- name: Install JRE on a scale set
  hosts: scalesethosts
  become: yes
  vars:
    workspace: ~/src/helloworld
    admin_username: azureuser

  tasks:
  - name: Install JRE
    apt:
      name: default-jre
      update_cache: yes

  - name: Copy app to Azure VM
    copy:
      src: "{{ workspace }}/complete/target/gs-spring-boot-0.1.0.jar"
      dest: "/home/{{ admin_username }}/helloworld.jar"
      force: yes
      mode: 0755

  - name: Start the application
    shell: java -jar "/home/{{ admin_username }}/helloworld.jar" >/dev/null 2>&1 &
    async: 5000
    poll: 0

Prima di eseguire il playbook, vedere le note seguenti:

  • Nella sezione vars sostituire il segnaposto {{ admin_password }} con la propria password.

  • Per usare il tipo di connessione ssh con le password, installare il programma sshpass:

    Ubuntu:

    apt-get install sshpass
    

    CentOS:

    yum install sshpass
    
  • In alcuni ambienti potrebbe essere visualizzato un errore sull'uso di una password SSH invece di una chiave. Se si riceve questo errore, è possibile disabilitare il controllo della chiave dell'host aggiungendo la riga seguente a /etc/ansible/ansible.cfg o ~/.ansible.cfg:

    [defaults]
    host_key_checking = False
    

Eseguire il playbook con il comando seguente:

ansible-playbook vmss-setup-deploy.yml

L'output prodotto dall'esecuzione del comando ansible-playbook indica che l'applicazione Java di esempio è stata installata nel gruppo host del set di scalabilità:

PLAY [localhost]

TASK [Gathering Facts]
ok: [localhost]

TASK [Get facts for all Public IPs within a resource groups]
ok: [localhost]

TASK [Get loadbalancer info]
ok: [localhost]

TASK [Add all hosts]
changed: [localhost] ...

PLAY [Install JRE on scale set]

TASK [Gathering Facts]
ok: [40.114.30.145_50000]
ok: [40.114.30.145_50003]

TASK [Copy app to Azure VM]
changed: [40.114.30.145_50003]
changed: [40.114.30.145_50000]

TASK [Start the application]
changed: [40.114.30.145_50000]
changed: [40.114.30.145_50003]

PLAY RECAP
40.114.30.145_50000        : ok=4    changed=3    unreachable=0    failed=0
40.114.30.145_50003        : ok=4    changed=3    unreachable=0    failed=0
localhost                  : ok=4    changed=1    unreachable=0    failed=0

Verificare i risultati

Verificare i risultati delle varie operazioni eseguite passando all'URL del servizio di bilanciamento del carico per il set di scalabilità:

Java app running in a scale set in Azure.

Passaggi successivi