티스토리 뷰

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 }}"
        

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함