ansible基礎-加密
一 簡介
注:本文demo使用ansible2.7穩定版
眾所周知,ansible是很火的一個自動化部署工具,在ansible控制節點內,存放著當前環境服務的所有服務的配置資訊,其中自然也包括一些敏感的資訊,例如明文密碼、IP地址等等。
從安全形度來講,這些敏感資料的檔案不應該以明文的形式存在。此時就用到了ansible加密的特性。
ansible通過命令列「ansible-vault」給你目標檔案/字串進行加密。在執行playbook時,通過指定相應引數來給目標檔案解密,從而實現ansible vault的功能。
ansible可以加密任何部署相關的檔案資料,例如:
- 主機/組變數等所有的變數檔案
- tasks、hanlders等所有的playbook檔案
- 命令列匯入的檔案(eg : -e @file.yaml ,-e @file.json)
- copy,template的模組裡src引數所使用的檔案,甚至是二進位制檔案。
- playbook裡用到的某個字串引數也可以加密(Ansible>=2.3)
本節主要介紹下ansible資料檔案/字串的加解密及加密檔案的使用方法等知識點。
二 給檔案加密
建立加密檔案
ansible-vault create foo.yml
執行該命令後,互動式輸入兩次相同的密碼,則建立加密檔案成功。
給現有檔案加密
ansible-vault encrypt foo.yml bar.yml baz.yml
如示例所示,該命令可以為多個檔案同時加密,同樣需要輸入兩次相同的密碼,則加密成功。
案例分析
很多情況下,我們需要給主機(組)部分變數檔案進行加密,而不是全加密。這裡介紹下加密和非加密需要同時存在時推薦的用法。以建立組變數為例:
定義了一個「nodes」主機組
➜ inventory cat hosts.yaml
---
# inventory/hosts
nodes:
hosts:
node1:
node2:
node3:
組變數檔案我們這樣建立,目錄結構如下:
➜ inventory tree group_vars
group_vars
└── nodes
├── vars.yaml
└── vault.yaml
檔案「inventory/group_vars/nodes/vault.yaml」內容如下:
---
vault_db_name: test
vault_db_host: 127.0.0.1
上面示例中,我們為「nodes」主機組建立了一個「group_vars/nodes」目錄用於存放該主機組的變數檔案,其中「vars.yaml」和「vault.yaml」檔案分別存放不加密和加密變數,通過這種拆分變數的方法,實現了加密和非加密同時存在的功能。
另外,為了便於識別,「vault.yaml」檔案裡的所有key值建議使用「vault_」開頭,這樣再playbook呼叫這些變數時,可以有很高的辨識度。
三 編輯加密檔案
對加密過的檔案進行編輯也是我們常遇到的,命令為:
ansible-vault edit foo.yml
這個命令會將該檔案解密,並放到一個臨時檔案,編輯完後再儲存到原檔案。
四 檢視加密檔案
有時我們不是想編輯檔案,而是簡單檢視下檔案內容,命令為:
ansible-vault view foo.yml bar.yml baz.yml
從示例中我們可以看出,一行命令可以檢視多個加密檔案。
五 更改密碼
給加密檔案更改密碼,命令為:
ansible-vault rekey foo.yml bar.yml baz.yml
先互動式輸入舊的密碼,然後再互動式輸入兩次新密碼,即更改密碼成功。
六 取消加密
取消加密的命令為:
ansible-vault decrypt foo.yml bar.yml baz.yml
互動式輸入密碼,即取消加密成功。
七 encypt_string建立加密變數
Vault ID和多密碼
ansible2.4版本以後,新增了Vault ID和多密碼的特性。Vault ID可以理解為為一個密碼設定一個標籤,用於管理員識別使用的是哪個密碼,例如dev,prod,cloud等等;多密碼指執行一次playbook時可以指定多個密碼檔案。
注:vault_id不會影響加密檔案的解密,只是為了便於管理員識別是哪個密碼。
encypt_string建立加密變數
在plabook檔案中,我們也可以為某個字串加密,從而達到加密變數巢狀在未加密YAML檔案內的效果。
「ansible-vault encrypt_string」命令用於給某個字串加密。
不設定vault_id,示例如下:
➜ lab-ansible ansible-vault encrypt_string --vault-id playbooks/test_vault.yaml 'maurice' --name 'the_name'
the_name: !vault |
$ANSIBLE_VAULT;1.1;AES256
...
...
設定vault_id為「dev」(給密碼打標籤)(加密引數也會有「dev」的標識):
➜ lab-ansible ansible-vault encrypt_string --vault-id [email protected]/test_vault.yaml 'maurice' --name 'the_name'
the_name: !vault |
$ANSIBLE_VAULT;1.2;AES256;dev
...
...
從stdin讀取密碼:
➜ lab-ansible echo -n 'maurice' | ansible-vault encrypt_string --vault-id [email protected]/test_vault.yaml --stdin-name 'the_name'
Reading plaintext input from stdin. (ctrl-d to end input)
the_name: !vault |
$ANSIBLE_VAULT;1.2;AES256;dev
...
...
互動式設定密碼,設定完密碼後按Ctrl+d:
➜ lab-ansible ansible-vault encrypt_string --vault-id [email protected]/test_vault.yaml --stdin-name 'the_name'
Reading plaintext input from stdin. (ctrl-d to end input)
maurice
the_name: !vault |
$ANSIBLE_VAULT;1.2;AES256;dev
...
...
八 使用加密檔案
上面我們主要介紹了密碼檔案/變數的建立方式,接下來介紹下如何使用。
ansible執行playbook時,可以通過互動式或指定密碼檔案的方式來解密檔案。
互動式
執行playbook時在終端以互動式的形式輸入密碼,示例:
ansible版本<=2.4,該方式只支援一個密碼,不能指定vault_id。
ansible-playbook --ask-vault-pass site.yml
ansible2.4版本後,對應命令列如下,該方式只支援一個密碼,能指定vault_id:
ansible-playbook --vault-id [email protected] playbooks/test_vault.yaml
指定密碼檔案
另外一種使用方式,是將密碼放在某個檔案內,執行playbook時,通過指定該密碼檔案進行解密。
ansible版本<=2.4,可以使用「--vault-password」引數:
ansible-playbook --vault-password-file dev-password site.yml
ansible2.4版本以後,又增加了「--vault-id」的引數,用來指定密碼檔案:
ansible-playbook --vault-id /path/to/my/vault-password-file site.yml
從可執行指令碼獲取密碼:
ansible-playbook --vault-id my-vault-password.py
指定密碼檔案同時指定vault_id:
ansible-playbook --vault-id [email protected] site.yml
指定多vault_id+多密碼檔案:
ansible-playbook --vault-id [email protected] --vault-id [email protected] site.yml
其他知識點
- 在僅使用多密碼檔案的情況下,預設的,ansible會按照命令列的排列順序,逐個嘗試。直到成功解密或失敗。
- 在使用vault_id+多密碼的情況下,ansible會優先匹配與vault_id相同的加密變數(這個標識上面加密變數有提到),如果不能解密再匹配其他vault_id變數檔案。
- 除了命令列,密碼檔案的預設路徑也可以通過ansible.cfg的「vault_password_file」或環境變數「ANSIBLE_VAULT_PASSWORD_FILE」獲取。
九 本節應該掌握的技能
- 掌握變數檔案建立、檢視、編輯、更改、取消加密等方法
- 掌握字串加密的方法
- 掌握含加密檔案時playbook的執行方法
十 參考連結
- https://docs.ansible.com/ansible/latest/user_guide/vault.html
歡迎大家關注我的公眾號: