はじめに
たそ(taso_int)です。
この記事はAnsible Advent Calendar 2024の8日目の記事になります。
AnsibleでAzureリソースを構築する導入部分について書きます。
何回かLTとかで話した内容だったりするので纏めておこうと思いました。
AnsibleとAzureについての説明は省きます。
Terraformなんてなかったんだ。
公式情報
Azure資格情報を登録
さっさと触りたい方はここを読み飛ばしいただいても大丈夫です。
クラウドリソースをAnsibleで操作する場合、基本的にコントロールノード側にクラウドリソースをさわるための資格情報が必要になります。
AWSであれば、アクセスキーとシークレットキーですし、Google Cloudであれば、サービスアカウントになります。
Azureではサービスプリンシパルが必要になります。
サービスプリンシパルの作成はAzure Portalやコマンドでも作成可能です。
Azure Portalではサービスプリンシパルという直接の項目はなくアプリの登録から実行できます。
アプリを登録したあとに、アプリをクリックして、証明書とシークレットを選択します。
クライアントシークレットを選択して、新しいクライアントシークレットで作成をします。
ここでシークレットIDが作成されます。(一度しか表示されないので、メモをしましょう)
サービスプリンシパルを利用するためには、サブスクリプションIDとテナントIDとアプリケーションIDとシークレットIDが必要になります。
また極力このサービスプリンシパルは外部に出さないように、特にGitHubとかに載せないように
またアプリケーションに対して、適切なロールを付与しておきましょう。
ここで作成した情報をコントロールノード側に登録させておく必要があります。
方法としては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とは異なり、リソース依存関係を自動で処理してくれないため作成順番には気を付けましょう。
最後に
ここまで読んでいただきありがとうございました。
GitHub上でAzure×Ansibleのハンズオンコード類を作ろうと思っております。
頑張ります(笑)