チュートリアル: Ansible を使用して Azure リソースの動的インベントリを構成する
重要
この記事のサンプル プレイブックを実行するには、Ansible 2.8 (以降) が必要です。
Ansible 動的インベントリ機能を使用すると、静的インベントリ ファイルを維持する負担が取り除かれます。
このチュートリアルでは、Azure の動的インベントリ プラグインを使用して、Ansible インベントリの情報を設定します。
この記事では、次のことについて説明します。
- 2 つのテスト用仮想マシンを構成する
- Azure 仮想マシンにタグを追加する
- 動的インベントリの生成
- 条件付きおよびキー付きのグループを使用してグループ メンバーシップを設定する
- 動的インベントリ内のグループに対してプレイブックを実行する
前提条件
- Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
- Azure サービス プリンシパル: サービス プリンシパルを作成して、appId、displayName、password、および tenant の値をメモします。
Ansible のインストール: 次のいずれかのオプションを実行します。
- Linux 仮想マシンに Ansible をインストールして構成する
- Azure Cloud Shell の構成 - アクセスできる Linux 仮想マシンがない場合は、Ansible で仮想マシンを作成できます。
Azure VM の作成
Azure portal にサインインします。
Cloud Shell を開きます。
このチュートリアル用の仮想マシンを保持する Azure リソース グループを作成します。
重要
この手順で作成する Azure リソース グループには、名前をすべて小文字で指定する必要があります。 それ以外の場合、動的インベントリの生成は失敗します。
az group create --resource-group ansible-inventory-test-rg --location eastus
次の手法のいずれかを使用して、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 Ubuntu2204 \ --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 動的インベントリ プラグインが提供されています。
次の手順でこのプラグインの使用方法を示します。
myazure_rm.yml
という名前の動的インベントリを作成します。plugin: azure_rm include_vm_resource_groups: - ansible-inventory-test-rg auth_source: auto
キー ポイント:
- Ansible は、インベントリ ファイルの名前と拡張子を使用して、使用するインベントリ プラグインを識別します。 Azure 動的インベントリ プラグインを使用するには、ファイルの末尾が
azure_rm
で、拡張子がyml
またはyaml
である必要があります。
- Ansible は、インベントリ ファイルの名前と拡張子を使用して、使用するインベントリ プラグインを識別します。 Azure 動的インベントリ プラグインを使用するには、ファイルの末尾が
次のコマンドを実行して、リソース グループ内の VM に対してクエリを実行します。
ansible-inventory -i myazure_rm.yml --graph
コマンドを実行すると、次の出力のような結果が表示されます。
@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": "0001-com-ubuntu-server-jammy",
"publisher": "Canonical",
"sku": "22_04-lts-gen2",
"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: "'ubuntu' 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
に関連付けられなくなったのを確認できます。 代わりに、それぞれの VM が動的インベントリによって作成された新しいグループに割り当てられています。
キー ポイント:
- 条件付きグループを使用すると、インベントリ内の特定のグループに名前を付け、
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: "'ubuntu' 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: ""
を追加します。
グループ名パターンを使用してプレイブックを実行する
サブグループを対象とするには、動的インベントリによって作成されたグループを使用します。
次のコンテンツを含む
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:
プレイブック
win_ping.yml
を実行します。ansible-playbook win_ping.yml -i myazure_rm.yml
確認を求められたら、Azure Windows VM の
username
とpassword
を入力します。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 をインストールします。次のコンテンツを含む
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:
プレイブック
ping.yml
を実行します。ansible-playbook ping.yml -i myazure_rm.yml
確認を求められたら、Azure Linux VM の
username
とpassword
を入力します。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
リソースをクリーンアップする
az group delete を実行して、リソース グループを削除します。 リソース グループ内のすべてのリソースが削除されます。
az group delete --name <resource_group>
az group show を使用して、リソース グループが削除されたことを確認します。
az group show --name <resource_group>