AnsibleでKeyVaultにsecretを入れたい! #Azureリレー
2020-05-13
azblob://2022/11/11/eyecatch/2020-05-13-set-secret-in-keyvault-with-ansible-000.jpg

先週の櫻井さんの リソース名やタグはどのようにつけるの?Azure CAF #Azure リレー 引き続き、毎週水曜日にAzure関連の記事を挙げるAzure リレー第11回を担当します。櫻井さんの記事は曖昧にすると後々直せなくなって後悔しがちな名前付けについて解説されていて参考になります。ぜひ、読まれていない方は読んでみてください。

概要

手元の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が使用できる状態に整えます。

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 とでもしましょう。~ 配下に保存していただけたらと思います。

- 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を操作する権限」は持っていない状態です。

別途付与しましょう。
下記のコマンドを実行します。

az keyvault set-policy -n <KeyVault名> --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のモジュールを使えば簡単に実現できたりするので、いろいろ調べてみるのはいかがでしょうか?