ansible vault 可以將資料加密,保護敏感資料。

可以參考官方: Encrypting content with Ansible Vault — Ansible Documentation

或是中文可以參考 Vault — ansible中文權威指南 1.0.1 documentation

ansible vault 的指令集如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$ ansible-vault
usage: ansible-vault [-h] [--version] [-v] {create,decrypt,edit,view,encrypt,encrypt_string,rekey} ...

encryption/decryption utility for Ansible data files

positional arguments:
  {create,decrypt,edit,view,encrypt,encrypt_string,rekey}
    create              Create new vault encrypted file
    decrypt             Decrypt vault encrypted file
    edit                Edit vault encrypted file
    view                View vault encrypted file
    encrypt             Encrypt YAML file
    encrypt_string      Encrypt a string
    rekey               Re-key a vault encrypted file

加密的方式可以選擇加密整個檔案或是特定變數,個人覺得使用方法很有彈性,可以搭配自己的情境做選擇。

加密檔案

我們先準備一個放有資料庫帳密的 config.yml 檔案

1
2
3
db:
  username: dev
  password: secret

使用 ansible-vault encrypt 加密檔案,指令如下

1
2
3
4
$ ansible-vault encrypt config.yml
New Vault password:
Confirm New Vault password:
Encryption successful

指令會要求你輸入密碼跟確認密碼,輸入後加密就完成了。

加密後的 config.yml 如下:

1
2
3
4
5
6
7
8
$ cat config.yml
$ANSIBLE_VAULT;1.1;AES256
31663732653730363438366439663038666136666462396434333830303037373736353238376131
3332663034326465383638386662663530666533613439390a346562623437346137656632323737
31623830316564353034613661323762313738343438663235373662393733666533653462343264
6330366433646566310a313363363665393562623237393939366630346130613338366632373438
31666238653235613939326333343637633361616532663032313762363937306532316530373435
3138343238366438353062333638303738363234393634636439

想要看加密的檔案內容,可以用以下指令:

1
2
$ ansible-vault view config.yml
Vault password:

指令會要求你輸入密碼,輸入正確的話,就可以看到原始內容

加密變數

如果覺得只有一個密碼卻要加密整個檔案很麻煩,可以試試只加密一個變數的方式

假設我們要將密碼 secret 加密,並指令 password 變數名稱,可以使用以下指令:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ ansible-vault encrypt_string secret --name 'password'
New Vault password:
Confirm New Vault password:
Encryption successful
password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          62613436303334623932376565646635643632346364656136636666356233623532613235393138
          3632653136313439323530653239353965643661303166660a303238656537386163613638363935
          35613039653632393939633363333161373861383935393633306462316333643662633766323837
          3966326262613962310a373035366163623862376130373161353733633034613134336135343030
          3834

ps. 指令變數名稱的參數 --name 是非必要的

加密變數搭配 ansible playbook

我們來建立一個簡單的 playbook play.yml 來印出解密的密碼,並放入剛剛加密的 password 變數,檔案內容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
---
- hosts: localhost
  vars:
    password: !vault |
      $ANSIBLE_VAULT;1.1;AES256
      62613436303334623932376565646635643632346364656136636666356233623532613235393138
      3632653136313439323530653239353965643661303166660a303238656537386163613638363935
      35613039653632393939633363333161373861383935393633306462316333643662633766323837
      3966326262613962310a373035366163623862376130373161353733633034613134336135343030
      3834
  tasks:
    - name: print password
      ansible.builtin.debug:
        msg: decrypt password is {{password}}

接下來我們來執行 playbook,輸入指令時請記得加上 –ask-vault-pass 並跟隨指示輸入密碼,否則會得到失敗的訊息 {"msg": "Attempting to decrypt but no vault secrets found"}

執行指令的過程如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$ ansible-playbook play.yml --ask-vault-pass
Vault password:
PLAY [localhost] *************************************************************************

TASK [Gathering Facts] *************************************************************************
ok: [localhost]

TASK [print password] *************************************************************************
ok: [localhost] => {
    "msg": "decrypt password is secret"
}

PLAY RECAP *************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

我們可以看到加密的變數 password 成功解密並顯示在畫面上了。

使用密碼檔案

vault 密碼不一定要手動輸入,也可以從檔案讀取

1
$ echo test > vault_password
1
$ ansible-playbook play.yml --vault-password-file vault_password

Reference