Ansible : 별도의 Vault 파일에서 인벤토리 파일의 일부 변수를 암호화하는 방법은 무엇입니까?
설정
다음 예제와 유사한 Ansible 인벤토리 파일을 고려하십시오 .
[san_diego]
host1
host2
[san_francisco]
host3
host4
[west_coast]
san_diego
san_francisco
[west_coast:vars]
db_server=foo.example.com
db_host=5432
db_password=top secret password
문제
전체 파일이 아닌 Ansible 볼트db_password
에 일부 변수 (예 :) 를 저장하고 싶습니다 .
Vault로 암호화 된 ansible 파일을 암호화되지 않은 인벤토리 파일로 어떻게 가져올 수 있습니까?
내가 시도한 것
암호화 된 vars 파일을 만들고 다음을 사용하여 가져 오기를 시도했습니다.
include: secrets
있는 상태 ansible-playbook
로 응답 :
ERROR: variables assigned to group must be in key=value form
아마도 include
문을 변수로 구문 분석하려고했기 때문일 것 입니다.
문제가 group_hosts 당 암호화되지 않은 및 암호화 된 vars 파일을 모두 갖는 것이라면.
이 ansible 기능을 사용할 수 있습니다. http://docs.ansible.com/ansible/playbooks_best_practices.html#best-practices-for-variables-and-vaults
group_vars/
san_diego/
vars.yml # unencrypted yaml file
vault.yml # encrypted yaml file
Ansible은 자동으로 vault.yml을 암호화 된 yaml 파일로 읽습니다.
업데이트 : 아래 솔루션 도 좋은 솔루션입니다 (Ansible 2.3 이후)
Ansible 2.3부터는 단일 암호화 변수를 암호화 할 수 있습니다 . IMO, doco가 꽤 간결 해 보이기 때문에 연습이 필요합니다.
주어진 예 : mysql_password: password123
(main.yml 내)
다음과 같은 명령을 실행하십시오.
ansible-vault encrypt_string password123 --ask-vault-pass
그러면 다음이 생성됩니다.
!vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653236336462626566653063336164663966303231363934653561363964363833
3136626431626536303530376336343832656537303632313433360a626438346336353331
Encryption successful
이것을 main.yml에 붙여 넣으십시오.
mysql_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653236336462626566653063336164663966303231363934653561363964363833
3136626431626536303530376336343832656537303632313433360a626438346336353331
플레이 북 실행 :
즉, ansible-playbook -i hosts main.yml --ask-vault-pass
디버그를 통해 확인 :
- debug:
msg: "mysql Pwd: {{ mysql_password }}"
현재 Ansible 2.3에서는 암호화 된 변수와 암호화되지 않은 변수를 모두 일반 yaml에 포함 할 수 있습니다. 암호화 된 변수의 형식은 다음과 같습니다.
dbServer: PlainDatabaseServer
dbName: PlainDatabaseName
dbUser: PlainUser
dbPasswd: !vault |
$ANSIBLE_VAULT;1.1;AES256
63633363616165656538656537323835343634633063386137353637646663333939623464666437
6263383933656635316436313934366564316337623435350a386362613838373363393534383232
39663162363066313431623466363763356466376538613532333731613538373431623239626330
6463373238366630360a623566616535376339326431363465663431623462356238636333306663
6439
다음 명령문과 함께 비밀번호 또는 비밀번호 파일을 사용하여 변수를 암호화 할 수 있습니다.
ansible-vault encrypt_string "dummy" --vault-password-file pass-ansible.txt
이 문은 위의 yaml에서 dbPasswd 변수에 표시된 텍스트를 반환합니다.
암호화 된 변수를 사용하는 플레이 북을 실행하려면 다음 변수를 추가하십시오.
ansible-playbook playbooks/myplaybook --vault-password-file pass-ansible.txt
또는 플레이 북을 실행할 때 비밀번호를 묻는 --ask-vault-pass로 동일한 작업을 수행 할 수 있습니다.
ansible-playbook playbooks/myplaybook --ask-vault-pass
이와 비슷한 것을 할 수 있습니다.
- 암호 파일 (한 줄에 암호가있는 일반 텍스트 파일)을 만듭니다.
를 작성
ansible.cfg
하여 ansible 프로젝트 폴더에[defaults] vault_password_file = <path/to/your/password/file>
각본 파일을 만듭니다 (예를 들어
playbook.yml
)- name: my ansible playbook hosts: 127.0.0.1 vars_files: - 'vars.yml' tasks: - name: print secure variable debug: msg="my secure variable '{{ my_secure_variable }}'"`
(예를 들어 변수 파일을 만듭니다
vars.yml
)my_secure_variable: "X_my_secret_X"
변수 파일을 암호화합니다 (를 사용하여 ansible 프로젝트 위치에서
ansible.cfg
).ansible-vault encrypt vars.yml
플레이 북 실행 (를 사용하여 ansible 프로젝트 위치에서
ansible.cfg
)ansible-playbook -i "localhost," playbook.yml
다음과 유사한 출력이 표시되어야합니다.
$ ansible-playbook playbook.yml -i 'localhost,'
PLAY [my ansible playbook] ****************************************************
GATHERING FACTS ***************************************************************
ok: [127.0.0.1]
TASK: [print secure variable] *************************************************
ok: [127.0.0.1] => {
"msg": "my secure variable 'X_my_secret_X' "
}
PLAY RECAP ********************************************************************
127.0.0.1 : ok=2 changed=0 unreachable=0 failed=0
It depends on your workflow. You can use a group_vars
file as per Sebastian Stigler suggestion or if you want to use an inventory file, you can just add another "ini-like" file in an inventory directory and encrypt it.
$ mkdir my_inventory/
$ cat >> hosts << EOF
[san_diego]
host1
host2
[san_francisco]
host3
host4
[west_coast]
san_diego
san_francisco
EOF
$ cat >> inventory_crypted_vars << EOF
[west_coast:vars]
db_server=foo.example.com
db_host=5432
db_password=top secret password
EOF
Then, use -i my_inventory/
in your command line, or create a local ansible.cfg
containing:
[defaults]
hostfile = ./my_inventory/
and you should be set. Ansible will merge both files at run time.
Use ansible-vault encrypt my_inventory/inventory_crypted_vars
before committing and you're set.
You probably want a pre-commit hook to ensure that you're not committing unencrypted version of the file. For instance a pre-commit hook like this would do the trick (adjust FILES_PATTERN
accordingly).
You can use group_vars (see http://docs.ansible.com/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable).
Create a subdirectory in your playbook named group_vars
.
There you create a file named west_coast
and put the following entries in it:
---
db_server: foo.example.com
db_host: 5432
db_password: top secret password
This file can then be converted to an ansible vault.
'Programing' 카테고리의 다른 글
AlertDialog의 setCancelable (false) 메서드가 작동하지 않습니다. (0) | 2020.11.30 |
---|---|
Postgresql 잘림 속도 (0) | 2020.11.30 |
Bootstrap 4의 열 중앙에 콘텐츠 배치 (0) | 2020.11.30 |
Java의 var 키워드에 람다 식을 할당 할 수없는 이유는 무엇입니까? (0) | 2020.11.30 |
Django의 contrib.auth에서 모델 사용자의 이메일 필드를 고유하게 만드는 방법 (0) | 2020.11.30 |