1. Ansible vault란?
ansible vault는 ansible실행에 필요한 민감정보를 암호화/복호화합니다. github같은 공개된 코드저장소에 ansible 민감정보를 관리할때 꼭 사용해야 합니다.
ansible vault를 사용하면 아래그림 오른쪽처럼 민감정보가 암호화됩니다.
그리고 ansible을 실행할 때 암호화된 값을 복호화합니다. 복호화키는 암호화에 사용한 비밀번호와 동일합니다. 복호화 키는 --ask-vault-pass인자로 전달합니다.
ansible-playbook -i inventory playbook.yaml --ask-vault-pass {복호화 키}
2. 사용방법
처음 민감정보 파일을 생성하는 경우 ansible-vault create명령어를 사용합니다. 암호화에 사용한 키는 복호화할때 사용됩니다.
ansible-vault create {파일경로}
기존에 있는 파일 내용을 암호화하려면 ansible-vault encrypt명령어를 사용합니다. 암호화에 사용한 키는 복호화할때 사용됩니다.
ansible-vault encrypt {파일경로}
암호화된 값을 복호화해서 보려면 ansible-vault view명령어를 사용합니다. 암호화 할때 사용한 비밀번호를 알아야합니다. ansible-vault decrypt명령어로도 복호화할 수 있지만 권장하지 않습니다. 실수로 복호화된 값을 코드 저장소에 업로드할 수 있기 때문입니다.
ansible-vault view {파일경로}
암호화된 값을 수정하려면 ansible-vault edit명령어를 사용합니다. 암호화 할때 사용한 비밀번호를 알아야합니다.
ansible-vault edit {파일경로}
3. 예제
github링크: https://github.com/choisungwook/ansible_practice/tree/main/examples/playbook_ansible_vault
아래 playbook예제는 /tmp/password.txt파일 생성을 생성할 때, password.txt파일 내용을 복호화한 값을 파일 내용으로 사용합니다.
- name: Create users
hosts: localhost
vars_files:
- password.txt
tasks:
- name: Create password file
ansible.builtin.lineinfile:
path: /tmp/password.txt
line: "password={{ password }}"
create: true
mode: '0600'
password.txt파일을 ansible-vault create파일로 생성합니다. 암호화/복호화 키는 1234로 설정합니다. 그리고 파일 내용도 1234로 설정합니다.
$ ansible-vault create password.txt
# 파일 내용
password: 1234
이제 playbook을 실행해봅시다. playbook을 실행할 때 --ask-vault-pass인자를 사용합니다. --ask-vault-pass는 암호화를 풀기 위한 복호화키를 입력하게 합니다. 복호화키는 암호화할 때 사용한 1234입니다.
ansible-playbook playbook.yaml --ask-vault-pass
playbook을 실행한 후 /tmp/password.txt내용을 확인해보세요. ansible-vault가 복호화한 값이 파일 내용에 있습니다.
cat /tmp/password.txt
4. (중요) 쉘 스크립트에서 ansible-vault 사용 방법
쉘 스크립트에서 ansible-vault를 사용하려면 --ask-vault-pass는 적절하지 않습니다. --ask-vault-pass는 사용자가 복호화키를 입력하는 과정이 있기 때문입니다.
따라서, 스크립트에서 ansible-vault를 사용하려면 복호화키를 파일에 저장합니다.
하지만, 파일에 복호화키가 노출되므로 보안위험이 발생합니다. 따라서 복호화키 파일을 안전한 외부 저장소에 저장해야 합니다. 외부 저장소는 AWS Secret Manager, Hashicorp Vault 등이 있습니다. 그리고 ansible-vault를 실행할 때 --vault-password-file인자에 외부 저장소의 복호화 키를 조회하는 스크립트 파일을 설정합니다.
5. AWS SecretManager와 Ansible vault연동 예제
github링크: https://github.com/choisungwook/ansible_practice/tree/main/examples/playbook_ansible_vault
AWS SecretManager를 외부 저장소를 사용하는 예제를 실습해보겠습니다.
AWS CLI로 SecretManager를 생성하고 복호화키를 저장합니다.
aws secretsmanager create-secret --name ansible/password \
--description "Secrets for ansible-vault descryption" \
--secret-string file://vault-password.json
복호화 키는 vault-password.json파일에 있습니다.
{
"ansible_vault_password": "1234"
}
AWS console에서 SecretManager값을 확인해보면 복호화키 1234가 생성되었습니다.
AWS SecretManager에 있는 복호화키 값을 가져오는 쉘스크립트파일을 생성합니다.
$ vi get-vault-password.sh
#!/bin/sh
aws secretsmanager get-secret-value --secret-id ansible/password | jq -r .SecretString | jq -r .ansible_vault_password
이전 예제에서 사용한 playbook을 그대로 사용하겠습니다. playbook을 실행할 때 생성한 쉘스크립트파일 경로를 설정합니다.
ansible-playbook playbook.yaml --vault-password-file ./get-vault-password.sh
'연재 시리즈' 카테고리의 다른 글
Ansible playbook 변수 (0) | 2024.01.20 |
---|---|
Ansible playbook 실패 제어 (0) | 2024.01.19 |
Ansible playbook (0) | 2024.01.14 |
Ansible 사용방법 (0) | 2024.01.12 |
Ansible 소개 (1) | 2024.01.09 |