Vault

Ansible 1.5的新版本中, “Vault” 作為 ansible 的一項新功能可將例如passwords,keys等敏感資料檔案進行加密,而非存放在明文的 playbooks 或 roles 中. 這些 vault 檔案可以分散存放也可以集中存放.

通過`ansible-vault` 來編輯檔案,經常用到的命令如 –ask-vault-pass , –vault-password-file . 這裡,你可以在 ansible.cfg 中定義密碼檔案所在位置,這個選項就不需要在命令列中指定標誌了.

Vault可以加密些什麼

vault 可以加密任何 Ansible 使用的結構化資料檔案. 甚至可以包括 “group_vars/” 或 “host_vars/” inventory 變數, “include_vars” 或 “vars_files” 載入的變數, 通過 ansible-playbook 命令列使用 “-e @file.yml” 或 “-e @file.json” 命令傳輸的變數檔案. Role 變數和所有預設的變數都可以被 vault 加密.

因為 Ansible tasks, handlers等都是資料檔案, 所有的這些均可以被 vault 加密. 如果你不喜歡你使用的變數被洩漏,你可以將整個 task 檔案部分加密. 然後,這個工作量比較大而且可能給你的同事帶來不便哦 :)

建立加密檔案

執行如下命令,建立加密檔案:

ansible-vault create foo.yml

首先你將被提示輸出密碼, 經過Vault加密過的檔案如需檢視需同時輸入密碼後才能進行.

提供密碼後, 工具將載入你定義的 $EDITOR 的編輯工具預設是 vim, 一旦你關閉了編輯會話框,生成後的檔案將會是加密檔案.

預設加密方式是 AES (基於共享金鑰)

Editing加密檔案

編輯加密檔案,使用 ansible-vault edit . 該命令會先加密檔案為臨時檔案並允許你編輯這個檔案,當完成編輯後會儲存回你所命名的檔案並刪除臨時檔案:

ansible-vault edit foo.yml

金鑰更新加密檔案

如果你希望變更密碼,使用如下 命令:

ansible-vault rekey foo.yml bar.yml baz.yml

如上命令可以同時批量修改多個檔案的組織密碼並重新設定新密碼.

加密普通檔案

如果你希望加密一個已經存在的檔案,使用 ansible-vault encrypt . 該命令也可同時批量操作多個檔案:

ansible-vault encrypt foo.yml bar.yml baz.yml

解密已加密檔案

如果不希望繼續加密一個已經加密過的檔案,通過 ansible-vault decrypt 你可以永久解密. 命令將解密並儲存到硬碟上,這樣你不用再使用 ansible-vault edit 來編輯檔案了:

ansible-vault decrypt foo.yml bar.yml baz.yml

查閱已加密檔案

Available since Ansible 1.8

如果你不希望通過編輯的方式來檢視檔案, ansible-vault view 可以滿足你的需要:

ansible-vault view foo.yml bar.yml baz.yml

在Vault下執行Playbook

執行 vault 加密後的playbook檔案,最少需要提交如下兩個標誌之一. 互動式的指定 vault 的密碼檔案:

ansible-playbook site.yml --ask-vault-pass

該提示被用來解密(僅在記憶體中)任何 vault 加密訪問過的檔案. 目前這些檔案中所有的指令請求將被使用相同的密碼加密.

另外,密碼也可以定義在一個檔案或者一個指令碼中,但是需要 Ansible 1.7 以上的版本才能支援. 當使用該功能時,一定要確認密碼檔案的許可權是安全的以確保沒有人可以隨意訪問或者變更密碼檔案:

ansible-playbook site.yml --vault-password-file ~/.vault_pass.txt

ansible-playbook site.yml --vault-password-file ~/.vault_pass.py

密碼儲存一行一個

如果你使用的是指令碼而不是普通檔案,確保指令碼是可執行的,這樣密碼可以輸出至標準裝置.如果你的指令碼需要提示輸入資料,那提示可以被髮送到標準錯誤.

如果你是從持續整合系統(例如Jenkins)中使用 Ansible 的話上面的這種情況你會用的到.

(–vault-password-file 參數可以在 Ansible-Pull(拉取配置而非推送配置) 命令中被使用,儘管這將需要分發keys到對應的節點上,所以 這些瞭解這些隱性問題後 – vault 更傾向使用 push 方式)