はじめに
「Azure と一貫性をのある API を持つ Azure Stack なら、Ansible を使って Virtual Machine を作れるはずだ」ということで、ASDK を利用して実際に試してみました。結論から言うと、Ansible 2.4 でサービスプリンシパルを使うと、Ansible で Azure Stack 上に Virtual Machine を作れました。
環境
- ASDK 1901 @物理コンテナ
- Ubuntu 18.04 on ASDK 1901
Ansible 2.7.7
pip install ansible[azure]
でインストールした Ansible 2.7.7 だと、Virtual Network の作成がエラーになります。
"msg": "Error creating or updating virtual network myVnet - Azure Error: NoRegisteredProviderFound\nMessage: No registered resource provider found for location 'local' and API version '2017-11-01' for type 'virtualNetworks'. The supported api-versions are '2014-12-01-preview, 2015-05-01-preview, 2015-06-15, 2016-03-30, 2016-06-01, 2016-07-01, 2016-08-01, 2016-09-01, 2016-10-01, 2016-11-01, 2016-12-01, 2017-03-01, 2017-04-01, 2017-06-01, 2017-08-01, 2017-09-01, 2017-10-01'. The supported locations are 'local'."
エラーの原因は、Azure Stack が Ansible の利用している 2017-11-01 の ネットワークの API をサポートしていないことです。1901 Update の Azure Stack がサポートするネットワークの API は 2017-10-01 です。わずか一か月。惜しい。
Ansible 2.4.0
Ansible が利用する API のバージョンを下げるために、Ansible そのもののバージョンを下げます。マネージドディスクと可用性セットをサポートする 2.4 が最終防衛線だと考えるので、2.4 を入れなおします。
pip install ansible[azure]\==2.4
Azure CLI の認証情報を利用して Ansible を利用しようとしたのですが、Azure CLI で Azure Stack にログインしている状態でも、Ansible の認証がエラーになりました。原因が特定出来なかったので、/etc/credentails
ファイルにサービスプリンシパルの情報を記載する方式で認証を突破します。Azure AD に作成したサービスプリンシパルを、 Azure Stack 上のサブスクリプションの IAM に追加するのを忘れずに。
[default]
subscription_id=81373782-f242-4e53-9a9e-ee9168ecc0f3
client_id=c6957708-cc0a-xxxx-xxxx-xxxxxxxxxxxx
secret=fd495ddd-e536-xxxx-xxxx-xxxxxxxxxxxx
tenant=50f9de73-a175-xxxx-xxxx-xxxxxxxxxxxx
cloud_environment=https://management.local.azurestack.external
普段の Ansible のように /etc/credentails
を記入すると、Ansible は AzureCloud を操作しようとします。Azure Stack を操作する際は、cloud_environment
に Azure Stack の ARM エンドポイントの FQDN を記入します。こうすることで、Ansible は cloud_environment
に記載された Azure Stack にアクセスします。
Playbookを書く際の注意点はリージョン名です。利用する Azure Stack のリージョン名を明記しましょう。今回は ASDK を利用したので、Playbook 上のリージョン名は local
です。
- name: Create Azure VM
hosts: localhost
connection: local
tasks:
- name: Create resource group
azure_rm_resourcegroup:
name: myResourceGroup
location: local
まとめ
Ansible を利用することで Azure と同じように Azure Stack 上にも Virtual Machine を作れることがわかりました。Ansible は、Terraform の様にAzure Stack が別のモジュールになっていません。そのため、Azure と Azure Stack で同じ Playbook を利用することも夢ではありません。
ただし、同じモジュールで異なる環境を操作することになるので、Azure Stack 特有の次の点に注意しましょう。
- Azure Stack の API バージョンに対応した Ansible を利用する
- Ansible に Azure Stack の ARM エンドポイントを設定する
- リージョン名を 利用される Azure Stack のリージョン名にする