教程:使用 Ansible 将应用部署到 Azure 中的虚拟机规模集
重要
运行本文中的示例 playbook 需要 Ansible 2.7(或更高版本)。
Azure 虚拟机规模集是一项 Azure 功能,可让你配置一组相同的、负载均衡的 VM。 规模集不需要额外的成本,它们是从虚拟机构建的。 只需为基础的计算资源(例如 VM 实例、负载均衡器或托管磁盘存储)付费。 使用规模集时,会提供管理层和自动层来运行和缩放应用程序。 你可以改为手动创建和管理各个 VM。 但是,使用规模集有两个主要优点。 它们内置于 Azure 中,并自动缩放虚拟机以满足应用程序需求。
在本文中,学习如何:
- 检索一组 Azure VM 的主机信息
- 克隆并构建示例应用
- 在规模集上安装 JRE(Java 运行时环境)
- 将 Java 应用程序部署到规模集
先决条件
- Azure 订阅:如果没有 Azure 订阅,请在开始之前创建一个免费帐户。
安装 Ansible - 执行以下任一选项:
- 在 Linux 虚拟机上安装和配置 Ansible
- 配置 Azure Cloud Shell,另外,如果无法访问 Linux 虚拟机,请使用 Ansible 创建虚拟机。
- 虚拟机规模集:如果还没有规模集,可以使用 Ansible 创建规模集。
- 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 来验证工作结果: