教程:使用 Ansible 将应用部署到 Azure 中的虚拟机规模集

重要

运行本文中的示例 playbook 需要 Ansible 2.7(或更高版本)。

Azure 虚拟机规模集是一项 Azure 功能,可让你配置一组相同的、负载均衡的 VM。 规模集不需要额外的成本,它们是从虚拟机构建的。 只需为基础的计算资源(例如 VM 实例、负载均衡器或托管磁盘存储)付费。 使用规模集时,会提供管理层和自动层来运行和缩放应用程序。 你可以改为手动创建和管理各个 VM。 但是,使用规模集有两个主要优点。 它们内置于 Azure 中,并自动缩放虚拟机以满足应用程序需求。

在本文中,学习如何:

  • 检索一组 Azure VM 的主机信息
  • 克隆并构建示例应用
  • 在规模集上安装 JRE(Java 运行时环境)
  • 将 Java 应用程序部署到规模集

先决条件

  • Azure 订阅:如果没有 Azure 订阅,请在开始之前创建一个免费帐户。
  • git - git 用于下载本教程中使用的 Java 示例。
  • Java SE 开发工具包 (JDK) - 此 JDK 用于生成示例 Java 项目。
  • Apache Maven - Apache Maven 用于构建示例 Java 项目。

获取主机信息

本部分中的 playbook 代码检索一组虚拟机的主机信息。 该代码获取指定资源组中的公共 IP 地址和负载均衡器,并在清单中创建名为 scalesethosts 的主机组。

将以下示例 playbook 保存为 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 }}"

准备用于部署的应用程序

本部分中的 playbook 代码使用 git 从 GitHub 克隆 Java 示例项目并构建项目。

将以下 playbook 保存为 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 playbook:

ansible-playbook app.yml

运行 playbook 后,可看到类似于以下结果的输出:

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

将应用程序部署到规模集

本部分中的 playbook 代码用于:

  • 在名为 saclesethosts 的主机组上安装 JRE
  • 将 Java 应用程序部署到名为 saclesethosts 的主机组

可通过两种方式获取示例 playbook:

  • 下载 playbook 并将其保存到 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

运行 playbook 之前,请参阅以下说明:

  • vars 部分中,请将 {{ admin_password }} 占位符替换为你自己的密码。

  • 若要将 ssh 连接类型与密码一起使用,请安装 sshpass 程序:

    Ubuntu:

    apt-get install sshpass
    
  • 在某些环境中,可能会看到有关使用 SSH 密码而不是密钥的错误。 如果收到该错误,可通过将以下行添加到 /etc/ansible/ansible.cfg~/.ansible.cfg 来禁用主机密钥检查:

    [defaults]
    host_key_checking = False
    

使用以下命令运行 playbook:

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 来验证工作结果:

在 Azure 的规模集中运行的 Java 应用。

后续步骤