チュートリアル: Ansible を使用して Azure リソースの動的インベントリを構成する

重要

この記事のサンプル プレイブックを実行するには、Ansible 2.8 (以降) が必要です。

注意事項

この記事では、間もなくサポート終了 (EOL) 状態になる Linux ディストリビューションである CentOS について説明します。 適宜、使用と計画を検討してください。 詳細については、「CentOS のサポート終了に関するガイダンス」を参照してください。

Ansible 動的インベントリ機能を使用すると、静的インベントリ ファイルを維持する負担が取り除かれます。

このチュートリアルでは、Azure の動的インベントリ プラグインを使用して、Ansible インベントリを設定します。

この記事では、次のことについて説明します。

  • 2 つのテスト用仮想マシンを構成する
  • Azure 仮想マシンにタグを追加する
  • 動的インベントリの生成
  • 条件付きおよびキー付きのグループを使用してグループ メンバーシップを設定する
  • 動的インベントリ内のグループに対してプレイブックを実行する

前提条件

  • Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。

Azure VM の作成

  1. Azure portal にサインインします。

  2. Cloud Shell を開きます。

  3. このチュートリアル用の仮想マシンを保持する Azure リソース グループを作成します。

    重要

    この手順で作成する Azure リソース グループには、名前をすべて小文字で指定する必要があります。 それ以外の場合、動的インベントリの生成は失敗します。

    az group create --resource-group ansible-inventory-test-rg --location eastus
    
  4. 次の手法のいずれかを使用して、Azure に 2 つの Linux 仮想マシンを作成します。

    • Ansible プレイブック - Ansible プレイブックから仮想マシンを作成する方法については、「Ansible を使用して Azure で基本的な Linux 仮想マシンを作成する」および「Ansible を使用して Azure で基本的な Windows 仮想マシンを作成する」を参照してください。

    • Azure CLI - Cloud Shell で次の各コマンドを発行して、2 つの仮想マシンを作成します。

      az vm create \
      --resource-group ansible-inventory-test-rg \
      --name win-vm \
      --image MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest \
      --admin-username azureuser \
      --admin-password <password>
      
      az vm create \
      --resource-group ansible-inventory-test-rg \
      --name linux-vm \
      --image CentOS85Gen2 \
      --admin-username azureuser \
      --admin-password <password>
      

      <password> をパスワードに置き換えます。

アプリケーション ロール タグを追加する

タグは、Azure リソースを整理および分類するために使用されます。 Azure VM にアプリケーション ロールを割り当てると、Azure 動的インベントリ内でグループ名としてタグを使用できます。

次のコマンドを実行して VM タグを更新します。

az vm update \
--resource-group ansible-inventory-test-rg \
--name linux-vm \
--set tags.applicationRole='message-broker' 

az vm update \
--resource-group ansible-inventory-test-rg \
--name win-vm \
--set tags.applicationRole='web-server' 

Azure のタグ付けの戦略の詳細については、「タグ付けの戦略を定義する」を参照してください。

動的インベントリの生成

Ansible では Azure 動的インベントリ プラグインが提供されています。

次の手順でこのプラグインの使用方法を示します。

  1. myazure_rm.yml という名前の動的インベントリを作成します。

    plugin: azure_rm
    include_vm_resource_groups:
      - ansible-inventory-test-rg
    auth_source: auto
    

    キー ポイント:

    • Ansible は、インベントリ ファイルの名前と拡張子を使用して、使用するインベントリ プラグインを識別します。 Azure 動的インベントリ プラグインを使用するには、ファイルの末尾が azure_rm で、拡張子が yml または yaml である必要があります。
  2. 次のコマンドを実行して、リソース グループ内の VM に対してクエリを実行します。

    ansible-inventory -i myazure_rm.yml --graph
    
  3. コマンドを実行すると、次の出力のような結果が表示されます。

    @all:
      |--@ungrouped:
      |  |--linux-vm_cdb4
      |  |--win-vm_3211
    

両方の VM がグループ ungrouped に属しています。これは、Ansible インベントリ内の all グループの子です。

キー ポイント:

  • 既定では、Azure 動的インベントリ プラグインはグローバルに一意の名前を返します。 VM 名の後に余分な文字が含まれているのはそのためです。 これは、動的インベントリに plain_host_names: yes を追加することで無効にできます。

Azure VM hostvars を検索する

次のコマンドを実行して、すべての hostvars を表示します。

ansible-inventory -i myazure_rm.yml --list
{
    "_meta": {
        "hostvars": {
            "linux-vm_cdb4": {
                "ansible_host": "52.188.118.79",
                "availability_zone": null,
                "computer_name": "linux-vm",
                "default_inventory_hostname": "linux-vm_cdb4",
                "id": "/subscriptions/<subscriptionid>/resourceGroups/ansible-inventory-test-rg/providers/Microsoft.Compute/virtualMachines/linux-vm",
                "image": {
                    "offer": "CentOS",
                    "publisher": "OpenLogic",
                    "sku": "7.7",
                    "version": "latest"
                },
                ...,
                "tags": {
                    "applicationRole": "message-broker"
                },
                ...
            },
            "win-vm_3211": {
                "ansible_host": "52.188.112.110",
                "availability_zone": null,
                "computer_name": "win-vm",
                "default_inventory_hostname": "win-vm_3211",
                "id": "/subscriptions/<subscriptionid>/resourceGroups/ansible-inventory-test-rg/providers/Microsoft.Compute/virtualMachines/win-vm",
                "image": {
                    "offer": "WindowsServer",
                    "publisher": "MicrosoftWindowsServer",
                    "sku": "2019-Datacenter",
                    "version": "latest"
                },
                ...
                "tags": {
                    "applicationRole": "web-server"
                },
                ...
            }
        }
    },
    ...
    }
}

Azure から情報をプルすることで、動的インベントリによって Azure VM ごとに hostvars が設定されます。 その hostvars が、次に Ansible インベントリ内の VM グループ メンバーシップを決定します。

グループ メンバーシップを conditional_groups に割り当てる

各条件付きグループは、2 つの部分で構成されます。 グループの名前と、グループにメンバーを追加する条件です。

プロパティ image.offer を使用して、linux-vm の条件付きグループ メンバーシップを作成します。

動的インベントリ myazure_rm.yml を開き、次の conditional_group を追加します。

plugin: azure_rm
include_vm_resource_groups:
  - ansible-inventory-test-rg
auth_source: auto
conditional_groups:
  linux: "'CentOS' in image.offer"
  windows: "'WindowsServer' in image.offer"

オプション --graph を指定して ansible-inventory を実行します。

ansible-inventory -i myazure_rm.yml --graph
@all:
  |--@linux:
  |  |--linux-vm_cdb4
  |--@ungrouped:
  |--@windows:
  |  |--win-vm_3211

出力から、VM がグループ ungrouped に関連付けられなくなったのを確認できます。 代わりに、それぞれが動的インベントリによって作成された新しいグループに割り当てられています。

キー ポイント:

  • 条件付きグループを使用すると、インベントリ内の特定のグループに名前を付け、hostvars を使用してそれらを設定できます。

keyed_groups を使用してグループ メンバーシップを割り当てる

キー付きグループでは、条件付きグループと同じようにグループ メンバーシップが割り当てられますが、キー付きグループを使用する場合は、グループ名も動的に設定されます。

動的インベントリ myazure_rm.yml に次の keyed_group を追加します。

plugin: azure_rm
include_vm_resource_groups:
  - ansible-inventory-test-rg
auth_source: auto
conditional_groups:
  linux: "'CentOS' in image.offer"
  windows: "'WindowsServer' in image.offer"
keyed_groups:
 - key: tags.applicationRole

オプション --graph を指定して ansible-inventory を実行します。

ansible-inventory -i myazure_rm.yml --graph
@all:
  |--@_message_broker:
  |  |--linux-vm_cdb4
  |--@_web_server:
  |  |--win-vm_3211
  |--@linux:
  |  |--linux-vm_cdb4
  |--@ungrouped:
  |--@windows:
  |  |--win-vm_3211

出力から、さらに 2 つのグループ _message_broker_web_server が表示されます。 キー付きグループを使用すると、タグ applicationRole によってグループ名とグループ メンバーシップが設定されます。

キー ポイント:

  • 既定では、キー付きグループには区切り記号が含まれます。 区切り記号を削除するには、キー プロパティの下に separator: "" を追加します。

グループ名パターンを使用してプレイブックを実行する

サブグループを対象とするには、動的インベントリによって作成されたグループを使用します。

  1. 次のコンテンツを含む win_ping.yml という名前のプレイブックを作成します。

    ---
    - hosts: windows
      gather_facts: false
    
      vars_prompt:
        - name: username
          prompt: "Enter local username"
          private: false
        - name: password
          prompt: "Enter password"
    
      vars:
        ansible_user: "{{ username }}"
        ansible_password: "{{ password }}"
        ansible_connection: winrm
        ansible_winrm_transport: ntlm
        ansible_winrm_server_cert_validation: ignore
    
      tasks:
        - name: run win_ping
          win_ping:
    
  2. プレイブック win_ping.yml を実行します。

    ansible-playbook win_ping.yml -i myazure_rm.yml
    

    確認を求められたら、Azure Windows VM の usernamepassword を入力します。

    Enter local username: azureuser
    Enter password:
    
    PLAY [windows] **************************************************************************************************************************************
    
    TASK [run win_ping] *********************************************************************************************************************************
    ok: [win-vm_3211]
    
    PLAY RECAP ******************************************************************************************************************************************
    win-vm_3211                : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    

    重要

    エラー winrm or requests is not installed: No module named 'winrm' が発生した場合は、コマンド pip install "pywinrm>=0.3.0" を使用して pywinrm をインストールします。

  3. 次のコンテンツを含む ping.yml という名前の 2 つ目のプレイブックを作成します。

    ---
    - hosts: all
      gather_facts: false
    
      vars_prompt:
        - name: username
          prompt: "Enter ssh user"
        - name: password
          prompt: "Enter password for ssh user"
    
      vars:
        ansible_user: "{{ username }}"
        ansible_password: "{{ password }}"
        ansible_ssh_common_args: '-o StrictHostKeyChecking=no'
    
      tasks:
        - name: run ping
          ping:
    
  4. プレイブック ping.yml を実行します。

    ansible-playbook ping.yml -i myazure_rm.yml
    

    確認を求められたら、Azure Linux VM の usernamepassword を入力します。

    Enter ssh username: azureuser
    Enter password for ssh user:
    
    PLAY [linux] *******************************************************************************************************
    
    TASK [run ping] ****************************************************************************************************
    ok: [linux-vm_cdb4]
    
    PLAY RECAP *********************************************************************************************************
    linux-vm_cdb4              : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
    

リソースをクリーンアップする

  1. az group delete を実行して、リソース グループを削除します。 リソース グループ内のすべてのリソースが削除されます。

    az group delete --name <resource_group>
    
  2. az group show を使用して、リソース グループが削除されたことを確認します。

    az group show --name <resource_group>
    

次のステップ