1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Ansible】HCP Vaultでサーバーの認証情報を登録・取得したい

1
Last updated at Posted at 2026-03-31

はじめに

近年、AWS・Azure・GCPといった複数のクラウドサービスを組み合わせて利用するケースが増えています。しかし、それぞれの環境で認証情報を個別に管理すると、運用の手間やセキュリティリスクが発生する可能性があります。
HCP Vaultを利用すれば、クラウド問わず一元的に認証情報を管理でき、マルチクラウド環境でも同じ運用・セキュリティポリシーを適用できます。これにより、認証情報管理の手間を大幅に削減し、安全かつ効率的なシークレット管理が実現できます。
本記事では、Ansibleを使ってHCP Vaultで認証情報を登録・取得する方法を解説します。
HCP VaultとAnsibleを組み合わせた、認証情報の管理・自動化の推進にお役立てください。

TL;DR

この記事を読めば、以下のことがわかります

  • AnsibleでHCP Vaultに認証情報を自動登録する方法
  • HCP Vaultから認証情報を取得し、Playbookで活用する方法
  • HCP Vault関連のPlaybookを書く時のポイント

前提条件

  • Initial Root Tokenが作成済みであること
    • あくまでも動作確認なので、このトークンを使用します
    • 環境変数ANSIBLE_HASHI_VAULT_TOKENに設定します

実行環境

  • Ansible
    • ansible-core: 2.19.3
  • Ansible Collection
    • community.hashi_vault: 7.1.0
  • Python library
    • hvac: 2.4.0

詳細

1. Playbook実行前の準備(環境変数の設定)

  • Playbookを実行する環境で以下のように環境変数を設定します

    export ANSIBLE_HASHI_VAULT_ADDR=https://<Vault Server Address>:<Vault Server Port>/
    export ANSIBLE_HASHI_VAULT_TOKEN=<Initial Root Token>
    

2. サーバーのユーザー名・パスワード登録用Playbookの実行

  • 実行コマンド

    ansible-navigator run vault_server_cred_register.yml
    
  • Playbook例

    • ポイント
      1. 保管するシークレットエンジン(今回は、test_servers)の存在確認をして、存在しなかった場合は作成します
      2. シークレットエンジンに対して、サーバーごとのログインに必要なユーザー名とパスワードを保管します
    vault_server_cred_register.yml
    ---
    - name: Register server credentials to HCP Vault
      hosts: localhost
      connection: local
      gather_facts: false
      vars:
        # Vaultのマウントポイント
        vault_mount_point: test_servers/
        # 登録するデータ
        server_creds:
          - hostname: server01
            username: user01
            password: p@ssw0rd01
          - hostname: server02
            username: user02
            password: p@ssw0rd02
      tasks:
        # Vaultに現在マウントされているシークレットエンジン一覧を取得
        - name: Get list of mounted engines
          community.hashi_vault.vault_read:
            url: "{{ lookup('env', 'ANSIBLE_HASHI_VAULT_ADDR') }}"
            token: "{{ lookup('env', 'ANSIBLE_HASHI_VAULT_TOKEN') }}"
            validate_certs: false
            path: "sys/mounts"
          register: __mount_list
    
        # 指定パスにKV v2シークレットエンジンがなければマウント
        - name: Mount KV v2 engine if not exists
          community.hashi_vault.vault_write:
            url: "{{ lookup('env', 'ANSIBLE_HASHI_VAULT_ADDR') }}"
            token: "{{ lookup('env', 'ANSIBLE_HASHI_VAULT_TOKEN') }}"
            validate_certs: false
            path: "sys/mounts/{{ vault_mount_point }}"
            data:
              type: kv
              options:
                version: 2
          when:
            - __mount_list.data.data[vault_mount_point] is not defined
    
        # 各サーバーのユーザー名とパスワードをVaultに登録
        - name: Register username and password to Vault per server
          community.hashi_vault.vault_kv2_write:
            url: "{{ lookup('env', 'ANSIBLE_HASHI_VAULT_ADDR') }}"
            token: "{{ lookup('env', 'ANSIBLE_HASHI_VAULT_TOKEN') }}"
            validate_certs: false
            engine_mount_point: "{{ vault_mount_point }}"
            path: "{{ item.hostname }}"
            data:
              username: "{{ item.username }}"
              password: "{{ item.password }}"
          loop: "{{ server_creds }}"
    
  • 実行結果

    • 以下のような階層構造で、サーバーの認証情報が保管されます
    test_servers/               # KV v2シークレットエンジンのマウントポイント
    ├── server01/               # サーバーごとのパス
    │   ├── username            # ユーザー名(シークレットのキー)
    │   └── password            # パスワード(シークレットのキー)
    └── server02/
        ├── username
        └── password
    
    • 以下のように認証情報が登録されます(認証情報の中身はあえて表示させています)

      server_cred.png

3. サーバーのユーザー名・パスワード確認用Playbookの実行

  • 実行コマンド

    ansible-navigator run vault_server_cred_display.yml -i hosts.yml
    
  • インベントリ例

    • ポイント
      1. Lookupプラグインでcommunity.hashi_vault.hashi_vaultを指定することで、認証情報を取得可能です
        • 変数inventory_hostnameを使うことで、ホスト名にもとづいた認証情報の取得がしやすくなります
        • インベントリでurltokenを指定しなくても動くのは、community.hashi_vault.hashi_vaultがデフォルトで環境変数ANSIBLE_HASHI_VAULT_ADDRANSIBLE_HASHI_VAULT_TOKENを見にいく仕様だからです
    hosts.yml
    ---
    all:
      hosts:
         server01:
           ansible_host: 192.0.2.1
           ansible_user: >-
             {{ lookup('community.hashi_vault.hashi_vault',
             'secret=test_servers/data/' + inventory_hostname + ':username', validate_certs=false) }}
           ansible_password: >-
             {{ lookup('community.hashi_vault.hashi_vault',
             'secret=test_servers/data/' + inventory_hostname + ':password', validate_certs=false) }}
         server02:
           ansible_host: 192.0.2.2
           ansible_user: >-
             {{ lookup('community.hashi_vault.hashi_vault',
             'secret=test_servers/data/' + inventory_hostname + ':username', validate_certs=false) }}
           ansible_password: >-
             {{ lookup('community.hashi_vault.hashi_vault',
             'secret=test_servers/data/' + inventory_hostname + ':password', validate_certs=false) }}
    
  • Playbook例

    vault_server_cred_display.yml
    ---
    - name: Fetch server credential and display
      hosts: all
      gather_facts: false
      tasks:
        - name: Display server info
          ansible.builtin.debug:
            msg:
              - "IP Address: {{ ansible_host }}"
              - "Username: {{ ansible_user }}"
              - "Password: {{ ansible_password }}"
    
  • 実行結果

    • 以下のように、実行ログにサーバーの認証情報が表示されます(以下は実行ログの一部を抜粋)
    TASK [Display server info] *****************************************************
    ok: [server01] => {
        "msg": [
            "IP Address: 192.0.2.1",
            "Username: user01",
            "Password: p@ssw0rd01"
        ]
    }
    ok: [server02] => {
        "msg": [
            "IP Address: 192.0.2.2",
            "Username: user02",
            "Password: p@ssw0rd02"
        ]
    }
    

さいごに

本記事では、AnsibleとHCP Vaultを組み合わせて、認証情報の登録・取得を自動化する方法を紹介しました。
これにより、クラウドを問わず、セキュアかつ効率的に認証情報を管理できることがご理解いただけたかと思います。
運用の自動化やセキュリティ強化を目指す方は、ぜひHCP VaultとAnsibleの活用を検討してみてください。

参考URL


1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?