Programing

Ansible : 별도의 Vault 파일에서 인벤토리 파일의 일부 변수를 암호화하는 방법은 무엇입니까?

crosscheck 2020. 11. 30. 07:50
반응형

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

이와 비슷한 것을 할 수 있습니다.

  1. 암호 파일 (한 줄에 암호가있는 일반 텍스트 파일)을 만듭니다.
  2. 를 작성 ansible.cfg하여 ansible 프로젝트 폴더에

    [defaults]
    vault_password_file = <path/to/your/password/file>
    
  3. 각본 파일을 만듭니다 (예를 들어 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 }}'"`
    
  4. (예를 들어 변수 파일을 만듭니다 vars.yml)

    my_secure_variable: "X_my_secret_X"
    
  5. 변수 파일을 암호화합니다 (를 사용하여 ansible 프로젝트 위치에서 ansible.cfg).

    ansible-vault encrypt vars.yml
    
  6. 플레이 북 실행 (를 사용하여 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.

참고URL : https://stackoverflow.com/questions/30209062/ansible-how-to-encrypt-some-variables-in-an-inventory-file-in-a-separate-vault

반응형