教學課程:使用 Ansible 將應用程式部署至 Azure 中的虛擬機器擴展集

重要

需要 Ansible 2.7 (或更新版本)才能執行本文中的範例劇本。

Azure 虛擬機擴展集 是一項 Azure 功能,可讓您設定一組相同的負載平衡 VM。 擴展集不需要額外的成本,而且是從虛擬機建置的。 您只需支付基礎計算資源的費用,例如 VM 實例、負載平衡器或受控磁碟記憶體。 使用擴展集,可提供管理和自動化層級,以執行和調整您的應用程式。 您可以改為手動建立和管理個別 VM。 不過,使用擴展集有兩個主要優點。 它們內建於 Azure 中,並會自動調整虛擬機以符合應用程式需求。

在本文中,您將學會如何:

  • 擷取一組 Azure VM 的主機資訊
  • 複製並建置範例應用程式
  • 在延伸集上安裝 JRE (Java Runtime Environment)
  • 將 Java 應用程式部署至擴展集

必要條件

  • Azure 訂用帳戶:如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶
  • 虛擬機擴展集:如果您還沒有擴展集,您可以使用 Ansible 設定擴展集。
  • git - git 可用來下載本教學課程中使用的 Java 範例。
  • Java SE 開發工具套件 (JDK) - JDK 用來建置範例 Java 專案。
  • Apache Maven - Apache Maven 可用來建置範例 Java 專案。

取得主機資訊

本節中的劇本程式代碼會擷取虛擬機群組的主機資訊。 程序代碼會取得指定資源群組內的公用IP位址和負載平衡器,並在清查中建立名為 scalesethosts 的主機群組。

將下列範例劇本儲存為 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 }}"

準備應用程式以進行部署

本節中的劇本程序代碼會使用 git 從 GitHub 複製 Java 範例專案,並建置專案。

將下列劇本儲存為 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"

使用下列命令執行範例 Ansible 劇本:

ansible-playbook app.yml

執行劇本之後,您會看到類似下列結果的輸出:

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

將應用程式部署至擴展集

本節中的劇本程式代碼可用來:

  • 在名為的主機群組上安裝 JRE saclesethosts
  • 將 Java 應用程式部署至名為 的主機群組 saclesethosts

有兩種方式可取得範例劇本:

  • 下載劇本 ,並將它儲存至 vmss-setup-deploy.yml

  • 建立名為 vmss-setup-deploy.yml的新檔案。 將下列程式代碼插入新檔案中:

- 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

在執行劇本之前,請參閱下列附註:

  • 在區 vars 段中,將 {{ admin_password }} 佔位元取代為您自己的密碼。

  • 若要搭配密碼使用 ssh 連線類型,請安裝 sshpass 程式:

    Ubuntu:

    apt-get install sshpass
    

    Centos:

    yum install sshpass
    
  • 在某些環境中,您可能會看到使用 SSH 密碼而非金鑰的錯誤。 如果您收到該錯誤,您可以將下列這一行新增至 /etc/ansible/ansible.cfg~/.ansible.cfg來停用主機金鑰檢查:

    [defaults]
    host_key_checking = False
    

使用下列命令執行劇本:

ansible-playbook vmss-setup-deploy.yml

執行 ansible-playbook 命令的輸出表示範例 Java 應用程式已安裝至擴展集的主機群組:

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

驗證結果

瀏覽至擴展集負載平衡器的 URL,以確認工作的結果:

Java app running in a scale set in Azure.

下一步