チュートリアル: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 サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
  • 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
    

    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.

次のステップ