티스토리 뷰
API 키, DB 패스워드 같은 비밀 정보는 Git에 그냥 올리면 큰일나! Ansible Vault를 쓰면 이런 정보들을 안전하게 암호화해서 관리할 수 있다.
Vault로 암호화된 변수 파일 생성 (secrets.yml)
- 이렇게 생성된 secrets.yml 파일은 암호화되어 저장.
# 터미널에서 실행 ansible-vault create group_vars/all/secrets.yml # 암호 입력/확인 후, 에디터가 열리면 내용 입력 # 예: # db_user: myapp_user # db_password: "ThisIsASecretPassword!@#"
기존 파일 암호화/복호화/편집
ansible-vault encrypt vars/prod_secrets.yml # 기존 파일 암호화
ansible-vault decrypt vars/prod_secrets.yml # 암호화된 파일 복호화 (임시로)
ansible-vault edit vars/prod_secrets.yml # 암호화된 파일 내용 편집
ansible-vault rekey vars/prod_secrets.yml # 암호화된 파일의 암호 변경
Playbook에서 암호화된 변수 참조
- Playbook 실행 시 Vault 암호를 물어보거나 파일로 제공하면, Ansible이 자동으로 복호화해서 변수를 사용.
# playbook.yml # group_vars/all/secrets.yml 에 db_password 가 암호화되어 있다고 가정 - name: 데이터베이스 연결 테스트 hosts: dbservers vars_files: - group_vars/all/secrets.yml # Vault로 암호화된 파일 포함 tasks: - name: DB 사용자 및 암호 출력 (실제로는 이렇게 출력하지 마세요!) ansible.builtin.debug: msg: "DB User: {{ db_user }}, DB Password: {{ db_password }}" # 실제 작업에서는 DB 모듈의 password 파라미터 등에 사용
Playbook 실행 시 Vault 암호 입력 방법
- --ask-vault-pass: 실행 시 터미널에서 직접 암호 입력
ansible-playbook playbook.yml --ask-vault-pass
- --vault-password-file: 암호가 적힌 텍스트 파일 사용 (파일 권한 주의!)
# ~/.vault_pass.txt 파일에 암호 한 줄 저장 (권한 600) ansible-playbook playbook.yml --vault-password-file ~/.vault_pass.txt
- 환경 변수 ANSIBLE_VAULT_PASSWORD_FILE 사용
export ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_pass.txt ansible-playbook playbook.yml
Vault ID 사용 (여러 Vault 암호 관리)
- 각기 다른 암호로 여러 Vault 파일을 관리할 때 유용.
Vault 파일 생성 시 ID 지정:
ansible-vault create --vault-id dev@prompt secrets_dev.yml
ansible-vault create --vault-id prod@~/.prod_vault_pass.txt secrets_prod.yml
ansible.cfg 에 설정:
# ansible.cfg
[defaults]
vault_identity_list = dev@prompt, prod@~/.prod_vault_pass.txt
# 또는 vault_password_file = ~/.default_vault_pass.txt (기본 Vault 암호)
Playbook에서 각기 다른 Vault 파일 사용:
# playbook.yml
vars_files:
- secrets_dev.yml # dev@prompt 암호 사용
- secrets_prod.yml # prod@~/.prod_vault_pass.txt 암호 사용
단일 문자열 암호화 (ansible-vault encrypt_string) 및 Playbook에서 사용
# playbook.yml
- name: 암호화된 문자열 변수 사용
hosts: localhost
vars:
# 위에서 출력된 내용을 그대로 복사-붙여넣기
api_key_encrypted: !vault |
$ANSIBLE_VAULT;1.1;AES256
3363303130623236386162333230326338386630313265303931313163303131
63646230356230333338626438346630356261623330383336366262610a3030
6232623533313031383163323339376361623632633562313038303461623135
62393263303862336431353631623930303162653231626438633732360a3239
3262303139623739626261323664306263656365333831353839326562336664
3030326662623636623233643636383939333663306331623464616232303662
31
tasks:
- name: 암호화된 API 키 사용 (출력은 금지!)
ansible.builtin.debug:
msg: "API Key is: {{ api_key_encrypted }}" # 실제로는 이렇게 사용하지 않음
# 실제 사용 예:
# uri:
# url: "https://api.example.com/data"
# headers:
# X-Api-Key: "{{ api_key_encrypted }}"
- 변수 파일 전체가 아니라 특정 값만 암호화해서 Playbook에 직접 넣을 때 유용해.
# 터미널에서 실행 (암호 입력 필요) ansible-vault encrypt_string --ask-vault-pass 'mySuperSecretApiKey' --name 'api_key_encrypted' # 출력 결과 예시: # api_key_encrypted: !vault | # $ANSIBLE_VA normalmente ... (암호화된 문자열)
AWX/Tower에서 Vault 자격증명 사용 (개념)
- AWX UI에서 "자격증명(Credentials)" 생성 시 "Vault" 유형을 선택.
- Vault 암호를 입력하거나 암호 파일을 업로드.
- Job Template에 이 Vault 자격증명을 연결하면, 해당 Job Template 실행 시 AWX가 자동으로 Vault 파일을 복호화해줘.
Role 내부의 vars 또는 defaults 파일 중 민감한 파일 암호화
- 예를 들어 my_role/vars/secrets.yml 파일을 만들고 ansible-vault encrypt my_role/vars/secrets.yml 로 암호화.
- Role의 vars/main.yml 에서 include_vars: secrets.yml 로 불러오거나, Playbook에서 Role 호출 시 자동으로 로드돼.
Vault 암호를 환경 변수 또는 ansible.cfg로 설정하여 --ask-vault-pass 생략
- 환경 변수: export ANSIBLE_VAULT_PASSWORD_FILE=/path/to/vault_password_file
- ansible.cfg:
[defaults] vault_password_file = /path/to/vault_password_file
- 이렇게 설정하면 Playbook 실행 시 Vault 암호를 묻지 않아 CI/CD 환경에서 자동화하기 편해. (파일 보안 철저히!)
암호화된 파일과 일반 파일을 함께 사용하는 Playbook
- Vault는 암호화되지 않은 파일과 완벽하게 호환돼. 필요한 부분만 암호화해서 사용할 수 있어.
# playbook.yml - name: 일반 변수와 Vault 변수 혼용 hosts: all vars_files: - vars/common_settings.yml # 일반 YAML 파일 - vars/secret_settings.yml # Vault로 암호화된 파일 tasks: - name: 설정값 사용 ansible.builtin.debug: msg: "일반 설정: {{ common_setting_value }}, 비밀 설정: {{ secret_api_key }}"
'ansible' 카테고리의 다른 글
AWX 입문: 웹 UI로 Ansible 관리하기 (0) | 2025.06.05 |
---|---|
똑똑한 자동화: 조건문(Conditionals)과 반복문(Loops) (0) | 2025.06.05 |
재사용성 UP! Ansible Role 만들기 (0) | 2025.06.05 |
코드처럼 관리: 변수(Variables)와 Jinja2 템플릿 활용 (2) | 2025.06.05 |
누구에게? Inventory 파일 마스터하기 (0) | 2025.06.05 |
댓글