Ansible HashiCorp Vault

 

https://tekunabe.hatenablog.jp/entry/2022/04/08/ansible_retrieve_secrets_from_vault
https://tekunabe.hatenablog.jp/entry/2022/04/07/vault_intro

 

前提: 
Python 3.9.14
Rocky Linux 9.1
ansible [core 2.15.2]
Vault: v1.14.1
コントロールノード -> ターゲットノードの公開鍵認証設定済み
ターゲットノードでvisudo設定済み


-- 1. HashiCorp Vaultインストールと設定

-- 1.1 HashiCorp Vaultインストール
dnf install -y yum-utils
dnf config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
dnf -y install vault

vault --version


-- 1.2 HashiCorp Vault起動

vault server -dev

別ターミナル起動

export VAULT_ADDR='http://127.0.0.1:8200'

vault login

-- 1.3 シークレットの追加

vault kv list secret/
vault kv put secret/user01 password=user01
vault kv put secret/user02 password=user02

vault kv list secret/
vault kv get secret/user01
vault kv get secret/user02


-- 1.4 ポリシーの追加

vault policy write policy01 - << EOF
path "secret/data/*" {
  capabilities = ["read"]
}
EOF

vault policy list
vault policy read policy01

-- 1.5 トークンの生成

vault token create -policy=policy01

 

 

-- 2. Ansibleインストールと設定
-- 2.1 Ansibleインストール

su - ansible

python -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install ansible-core
ansible --version


-- 2.2 Ansible側の追加作業

pip install hvac

export ANSIBLE_HASHI_VAULT_TOKEN=hvs.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export ANSIBLE_HASHI_VAULT_ADDR='http://127.0.0.1:8200'

ansible-galaxy collection install community.hashi_vault

ansible-galaxy collection list

 

-- 2.3 設定ファイル作成

vim ansible.cfg

[defaults]

forks = 10
log_path = $HOME/.ansible/ansible.log
host_key_checking = True
gathering = smart
transport = smart

 

-- 2.4 インベントリファイル作成

vim inventory.ini

localhost
mmm190


[server]
192.168.137.191


-- 2.5 ansible動作確認

ansible server -i inventory.ini -m ansible.builtin.ping

tail $HOME/.ansible/ansible.log

 

-- 2.6 プレイブック作成

vim playbook.yml

---
- hosts: server

  become: true
  gather_facts: true

  vars:
    accounts:
      - name: user01
        uid: 4001
        password: "{{ lookup('community.hashi_vault.hashi_vault', 'secret=secret/data/user01:password') }}"
      - name: user02
        uid: 4002
        password: "{{ lookup('community.hashi_vault.hashi_vault', 'secret=secret/data/user02:password') }}"
  tasks:

    - name: Add users
      ansible.builtin.user:
        name: "{{ item['name'] }}"
        uid: "{{ item['uid'] }}"
        password: "{{ item['password'] | password_hash('sha512') }}"
        state: present
      loop:
        "{{ accounts }}"
      no_log: true

 


-- 2.7 プレイブック実行

ansible-playbook -i inventory.ini playbook.yml --syntax-check

ansible-playbook -i inventory.ini playbook.yml