このページの本文へ

FIXER cloud.config Tech Blog

AnsibleでAzure KeyVaultのsecretを操作したい!

2020年05月19日 11時00分更新

文● 松枝 宏樹/FIXER

  • この記事をはてなブックマークに追加
  • 本文印刷

 本記事は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関連を勉強中。

[転載元]
 

■関連サイト

カテゴリートップへ