本記事はFIXERが提供する「cloud.config Tech Blog」に掲載された「AnsibleでKeyVaultにsecretを入れたい! #Azureリレー」を再編集したものです。
概要
手元のWindows PCにWSLでubuntu 18.04を導入し、そこからAnsibleを使用してAzureのKeyVaultを管理する方法を調べてみたので、その手順を説明したいと思います。
KeyVaultが作成されたAzure環境をお持ちな状態を前提に、下記の順で説明します。
・Ansibleの実行環境の用意
・Ansible実行用のService Principalの作成
・Ansibleを動かすファイルの用意
・Azure認証情報の設定
・playbookの実行
Ansibleの実行環境の用意
まずはWindows上でUbuntuが動く状態に整えます。
詳細は検索していただければ分かると思いますが、大きくは下記になります。
・「Windows の機能の有効化または無効化」から「Windows Subsystem for Linux」を有効化します
・Microsoft Storeで「Ubuntu」を検索し、「Ubuntu 18.04 LTS」を入手します
Ubuntuの入手が完了したらMicrosoft StoreなどからUbuntuを起動し、初期設定(ユーザ名とパスワードの設定)を実施してください。
Ubuntuの準備が整ったら、下記のコマンドでAnsibleが使用できる状態に整えます。
Bash
sudo apt-get update && sudo apt-get install -y libssl-dev libffi-dev python3-dev python3-pip
sudo pip3 install ansible[azure]
これで準備完了です。
Ansibleを動かすファイルの用意
Ubuntu上で下記のPlaybookを作成します。ファイル名は test.yml とでもしましょう。~ 配下に保存していただけたらと思います。
test.yml
- hosts: all
tasks:
- name: Create a secret
azure_rm_keyvaultsecret:
secret_name: TestSecret
secret_value: SecretValue
keyvault_uri: https://<keyvault名>.vault.azure.net/
この定義でKeyVaultにsecretが追加できます。
使用したAnsibleモジュールの詳細は下記を参照ください。
https://docs.ansible.com/ansible/latest/modules/azure_rm_keyvaultsecret_module.html
Ansible実行用のService Principalの作成
Ansibleを実行する際にAzureとの認証を実現するService Principalを作成します。
通常のAzureアカウントでも動作すると思いますが、自動化スクリプト等では必要な権限のみを保持したService Principalを使用するのが良いです。
az cli が導入された環境で、下記のコマンドを作成します。
az ad sp create-for-rbac --name ansibleKvSp --role contributor --scopes /subscriptions/<サブスクリプションID>/resourceGroups/<keyvaultが所属するリソースグループ名>
これで、KeyVaultの所属するリソースグループに対するContributor権限を持つService Principalが作成されます。
下記の出力が出て後から使用するので、安全な場所に保管しましょう。
{
"appId": "xxx-xxx-xxx-xxx-xxx",
"displayName": "ansibleKvSp",
"name": "http://ansibleKvSp",
"password": "xxx-xxx-xxx-xxx-xxx",
"tenant": "xxx-xxx-xxx-xxx-xxx"
}
これだけで良いように思えますが、実は足りていません。
このService Principalは、「KeyVaultのリソースへのアクセス権」を持っていますが、「KeyVaultのsecretを操作する権限」は持っていない状態です。
別途付与しましょう。
下記のコマンドを実行します。
Bash
az keyvault set-policy -n --spn <上記のappIdの値> --secret-permissions get set list
これで指定のKeyVaultのsecretに対して「getとsetとlist」の権限を持ったService Principalになりました。
Azure認証情報の設定
AnsibleがAzure環境にアクセスできるように設定を入れましょう。
Ubuntu内に ~/.azure フォルダを作成し、~/.azure/credentials ファイルを作成します。
[default]
subscription_id=<サブスクリプションID>
client_id=<Service PrincipalのAppIdの値>
secret=<Service Principalのpasswordの値>
tenant=<Service Principalのtenantの値>
これでAnsibleがPlaybook実行時に認証できるようになります。
playbookの実行
いよいよ実行です。
下記のコマンドでPlaybookを実行してみましょう。
ansible-playbook -i localhost, -c local test.yml
どうですか?
secretは追加されましたか?
今回はAnsibleでKeyVaultのsecretを操作する方法を駆け足で紹介してみました。
このままだとSecret値をyamlファイルにべた書きすることになってしまうので、値の作成部分は別途作りこみが必要です。
そこもAnsibleのモジュールを使えば簡単に実現できたりするので、いろいろ調べてみるのはいかがでしょうか?
FIXER Inc. 松枝 宏樹
名古屋事業所所属。
得意分野はC#、ASP.NET、terraformなど。
最近はdocker、K8s関連を勉強中。
[転載元]