소개
Ansible Vault 는 민감한 변수를 암호화하여 일반 텍스트 형태의 비밀 정보가 노출되지 않도록 플레이북과 함께 저장할 수 있게 해줍니다. 플레이북은 유효한 vault 비밀번호를 제공할 때만 해당 값을 사용할 수 있습니다.
이번 실습에서는 암호화된 변수를 생성하고, 비밀번호가 없을 때 발생하는 오류를 확인한 뒤, vault 비밀번호 파일을 사용하여 플레이북을 성공적으로 실행해 보겠습니다.
Vault 실습 프로젝트 생성
이 단계에서는 인벤토리, 그룹 변수 디렉터리, 플레이북 디렉터리 및 보고서 디렉터리를 포함한 프로젝트를 생성합니다.
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; 헤더가 표시되어야 합니다. 이 파일에서 일반 텍스트 형태의 비밀 정보는 보이지 않아야 합니다.
비밀 정보를 사용하는 플레이북 작성
이 단계에서는 app_secret을 참조하는 플레이북을 작성합니다. 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
플레이북은 일반 변수처럼 app_secret을 사용합니다. 이것이 바로 Vault 의 핵심입니다. 플레이북 로직은 깔끔하게 유지하면서 민감한 값은 저장된 상태에서 암호화된 채로 유지할 수 있습니다.
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 비밀번호와 함께 플레이북 실행
이 단계에서는 Ansible 이 변수를 복호화하고 보호된 출력 파일을 작성할 수 있도록 vault 비밀번호 파일을 제공합니다. 이 단계의 명령어를 실행하기 전에 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이라는 내용이 포함되어 있어야 합니다. 이는 플레이북이 복호화된 값을 사용하면서도 생성된 비밀 파일은 여전히 보호하고 있음을 증명합니다.
요약
Vault 로 암호화된 변수를 생성하고, 비밀번호 없이는 플레이북이 이를 사용할 수 없음을 확인한 뒤, vault 비밀번호 파일을 사용하여 플레이북을 실행함으로써 비밀 정보를 복호화하고 적용하는 방법을 배웠습니다.


