はじめに
Ansible Vault は機密性の高い変数を暗号化し、平文のシークレットを公開することなく Playbook と一緒に保存できるようにします。Playbook は、有効な Vault パスワードが提供された場合にのみ、その値を使用できます。
この実験では、暗号化された変数を作成し、パスワードがない場合に失敗することを確認した後、Vault パスワードファイルを使用して Playbook を正常に実行します。
Vault 実践プロジェクトの作成
このステップでは、インベントリ、グループ変数ディレクトリ、Playbook ディレクトリ、およびレポートディレクトリを含むプロジェクトを作成します。
cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars/managed,playbooks,managed,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[managed]
host ansible_connection=local
EOF
暗号化された変数は inventory/group_vars/managed の下に配置されるため、他の変数ファイルと同様に managed グループに対して読み込まれます。異なる点は、Ansible が使用前にそれを復号化する必要があることです。
Vault パスワードファイルの作成
このステップでは、実験自動化のためのパスワードファイルを作成します。実際の業務では、このファイルを慎重に保護するか、プロンプトベースのワークフローを使用してください。 このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。これにより、LabEx が各ステップを個別に実行する場合でもコマンドが安定します。
cd /home/labex/project/rhce-ansible
cat > vault_pass.txt <<'EOF'
labex-vault-pass
EOF
chmod 600 vault_pass.txt
このパスワードファイルは実験ワークフロー専用です。chmod 600 モードは、所有者のみが読み書きできることを意味します。これは、シークレットを解除できるファイルを扱う際の最低限の習慣です。
ls -l vault_pass.txt
-rw------- に似た権限であることを確認してください。グループや他のユーザーが読み取れる場合は、chmod 600 コマンドを再実行してください。
暗号化された変数の作成
このステップでは、ansible-vault encrypt_string を使用して app_secret という名前の暗号化された変数を作成します。暗号化されたファイルは、他のグループ変数ファイルと同様に読み込むことができます。
このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。
cd /home/labex/project/rhce-ansible
ansible-vault encrypt_string --vault-password-file vault_pass.txt 'redhat' --name app_secret > inventory/group_vars/managed/vault.yml
このコマンドは、app_secret という名前の暗号化された YAML 変数を書き込みます。変数名は読み取り可能ですが、値 redhat は Vault ブロック内に格納されます。
sed -n "1,8p" inventory/group_vars/managed/vault.yml
ファイルには app_secret: !vault と $ANSIBLE_VAULT; ヘッダーが表示されるはずです。このファイル内に平文のシークレットが表示されてはいけません。
シークレットを使用する Playbook の作成
このステップでは、app_secret を参照する Playbook を作成します。Vault パスワードがない場合、Ansible はこの変数を復号化できません。
このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。
cd /home/labex/project/rhce-ansible
cat > playbooks/use-vault.yml <<'EOF'
---
- name: Use an encrypted variable
hosts: managed
gather_facts: false
tasks:
- name: Write secret-derived file
ansible.builtin.copy:
dest: /home/labex/project/rhce-ansible/managed/secret.txt
content: |
secret={{ app_secret }}
mode: '0600'
EOF
Playbook は app_secret を通常の変数のように使用します。これが Vault の目的です。Playbook のロジックをクリーンに保ちつつ、機密値は保存時に暗号化されたままになります。
ansible-playbook playbooks/use-vault.yml > reports/vault-missing.txt 2>&1 || true
Vault パスワードが提供されていないため、この実行は失敗することが予想されます。出力はレポートにリダイレクトされるため、実験を停止せずに失敗の内容を確認できます。
grep -Ei "vault|decrypt|password|secret" reports/vault-missing.txt
フィルタリングされたエラーには、Vault、復号化(decryption)、パスワード、またはシークレットに関する言及が含まれているはずです。また、検証ではまだ managed/secret.txt ファイルが存在しないことが期待されている点にも注目してください。
Vault パスワードを使用した Playbook の実行
このステップでは、Vault パスワードファイルを指定して、Ansible が変数を復号化し、保護された出力ファイルを書き込めるようにします。 このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。
cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/use-vault.yml --vault-password-file vault_pass.txt | tee reports/vault-run.txt
これで Ansible は app_secret を復号化し、実行時に平文の値を copy タスクに渡すことができます。ディスク上の暗号化されたファイルは暗号化されたままです。
sudo ls -l managed/secret.txt && cat managed/secret.txt
ファイルはモード 600 であり、secret=redhat が含まれているはずです。これは、生成されたシークレットファイルを保護しつつ、Playbook が復号化された値を使用したことを証明しています。
まとめ
Vault で暗号化された変数を作成し、パスワードなしでは Playbook がそれを使用できないことを確認しました。その後、Vault パスワードファイルを使用して Playbook を実行し、シークレットを復号化して適用することに成功しました。


