チュートリアル:Ansible を使用して Azure の仮想マシン スケール セットにアプリをデプロイする
重要
この記事のサンプル プレイブックを実行するには、Ansible 2.7 (以降) が必要です。
Azure Virtual Machine Scale Sets は、負荷分散が行われる同一の VM のグループを構成するための Azure 機能です。 スケール セットに追加コストはなく、仮想マシンから構築されます。 ユーザーは、VM インスタンス、ロード バランサー、マネージド ディスク ストレージなど、基本的なコンピューティング リソースに対してのみ支払います。 スケール セットには、アプリケーションの実行とスケーリングを行うための管理レイヤーと自動化レイヤーがあります。 代わりに手動で個々 の VM を作成し管理できます。 ただし、スケール セットの使用には、2 つの主な利点があります。 それらは Azure に組み込まれ、アプリケーションのニーズを満たすように自動的に仮想マシンを拡大縮小します。
この記事では、次のことについて説明します。
- Azure VM グループのホスト情報を取得する
- サンプル アプリを複製してビルドする
- スケール セットに JRE (Java Runtime Environment) をインストールする
- スケール セットに Java アプリケーションをデプロイする
前提条件
- Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
Ansible のインストール: 次のいずれかのオプションを実行します。
- Linux 仮想マシンに Ansible をインストールして構成する
- Azure Cloud Shell の構成 - アクセスできる Linux 仮想マシンがない場合は、Ansible で仮想マシンを作成できます。
- 仮想マシン スケール セット: スケール セットがまだない場合は、Ansible を使用してスケール セットを構成します。
- git - このチュートリアルでは、git を使用して Java サンプルをダウンロードします。
- Java SE Development Kit (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
スケール セットにアプリケーションをデプロイする
このセクションのプレイブック コードでは、次のことを行います。
saclesethosts
という名前のホスト グループに JRE をインストールするsaclesethosts
という名前のホスト グループに Java アプリケーションをデプロイする
サンプル プレイブックを取得するには、次の 2 つの方法があります。
プレイブックをダウンロードして、
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
環境によっては、キーの代わりに 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 にアクセスして、作業の結果を確認します。