たそ@ITインフラ初心者

taso@初心者エンジニア

新卒4年目 エンジニアが適当に語るブログてす

AnsibleでAzureを触る 入門編

はじめに

たそ(taso_int)です。
この記事はAnsible Advent Calendar 2024の8日目の記事になります。
AnsibleでAzureリソースを構築する導入部分について書きます。
何回かLTとかで話した内容だったりするので纏めておこうと思いました。
AnsibleとAzureについての説明は省きます。
Terraformなんてなかったんだ。

公式情報

learn.microsoft.com

Azure資格情報を登録

さっさと触りたい方はここを読み飛ばしいただいても大丈夫です。

クラウドリソースをAnsibleで操作する場合、基本的にコントロールノード側にクラウドリソースをさわるための資格情報が必要になります。
AWSであれば、アクセスキーとシークレットキーですし、Google Cloudであれば、サービスアカウントになります。
Azureではサービスプリンシパルが必要になります。

サービスプリンシパルの作成はAzure Portalやコマンドでも作成可能です。

Azure Portalではサービスプリンシパルという直接の項目はなくアプリの登録から実行できます。
アプリを登録したあとに、アプリをクリックして、証明書とシークレットを選択します。
クライアントシークレットを選択して、新しいクライアントシークレットで作成をします。
ここでシークレットIDが作成されます。(一度しか表示されないので、メモをしましょう)

サービスプリンシパルを利用するためには、サブスクリプションIDとテナントIDとアプリケーションIDとシークレットIDが必要になります。
また極力このサービスプリンシパルは外部に出さないように、特にGitHubとかに載せないように
またアプリケーションに対して、適切なロールを付与しておきましょう。

CLIでの作成は以下を参考に(恐らくCLIの方が簡単かも)

learn.microsoft.com

ここで作成した情報をコントロールノード側に登録させておく必要があります。
方法としては2つあり、

  • ~/.azure/credentialsを作成する
  • Ansible 環境変数を定義する

~/.azure/credentialsを作成する場合は以下のように書きます。

[default]
subscription_id=<subscription_id>
client_id=<service_principal_app_id>
secret=<service_principal_password>
tenant=<service_principal_tenant_id>

Ansible 環境変数を定義する場合は以下のようにコマンドを実行します。

export AZURE_SUBSCRIPTION_ID=<subscription_id>
export AZURE_CLIENT_ID=<service_principal_app_id>
export AZURE_SECRET=<service_principal_password>
export AZURE_TENANT=<service_principal_tenant_id>

Azure Cloud Shellで簡単に試す

サービスプリンシパルを作成し登録することで、AnsibleでAzureリソースを触れますが、サービスプリンシパルの作成や登録が少し面倒です。
そこでAzure Cloud shellでAnsibleを使う方法があります。

Azure Cloud shellではすでにAzure側で認証が済んでいるためサービスプリンシパルの作成は不要になります。
そして、Ansibleがなんとデフォルトでインストールされています。

Azure Portalを開いて、右上のターミナルぽいアイコンをクリックします。
初期設定を済ませておきます。(コスト面が気になりますが、個人的にはストレージアカウントはあった方が良い)

$ ansible --version
ansible [core 2.15.12]
  config file = None
  configured module search path = ['/home/taso/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /opt/ansible/lib/python3.9/site-packages/ansible
  ansible collection location = /home/taso/.ansible/collections:/usr/share/ansible/collections
  executable location = /opt/ansible/bin/ansible
  python version = 3.9.19 (main, Aug 23 2024, 00:07:48) [GCC 11.2.0] (/opt/ansible/bin/python)
  jinja version = 3.1.4
  libyaml = True

ansible-core等のバージョンをカスタマイズしたい場合はpythonで仮想環境(venv)を作るのもありです。

接続するまで

Azureリソースを触るazure.azcollectionコレクションをインストールします

ansible-galaxy collection install azure.azcollection

コレクションに必要な依存関係もインストールします。

pip install -r ~/.ansible/collections/ansible_collections/azure/azcollection/requirements.txt

接続確認をansibleコマンドで確認します。

ansible localhost -m azure.azcollection.azure_rm_subscription_info

localhost | SUCCESSが出力されれば成功です。

エラーが出た場合は以下を確認してみましょう。

  • サービスプリンシパルの情報が正しいか(資格情報を間違って登録されている。そもそも資格情報が認識できてない)
  • コレクション類がインストールされていおり、Ansibleがコレクション類を取得できているか

playbookを実行する

試しにリソースグループを作成するPlaybook(azure_rg.yml)を作成してみましょう。

---
- hosts: localhost
  gather_facts: false

  tasks:
    - name: create resource group
      azure.azcollection.azure_rm_resourcegroup:
       name: test_taso #リソースグループ名
       location: japaneast

ansible-playbookコマンドで試してみます。

ansible-playbook azure_rg.yml

changedになれば成功です。Azure portal側でも作成されています。

azure.azcollectionではAzureリソースの作成やVMの情報を取得するプラグイン等を提供しています。
以下が一覧なので、作成したいAzureリソースと対応するモジュールを探して、作成してみましょう。
注意点としては、Terraformとは異なり、リソース依存関係を自動で処理してくれないため作成順番には気を付けましょう。

docs.ansible.com

最後に

ここまで読んでいただきありがとうございました。
GitHub上でAzure×Ansibleのハンズオンコード類を作ろうと思っております。

github.com

頑張ります(笑)