ansible-vault 只要用於配置文件加密,可以加密或解密,具體使用方式如下:
Usage: ansible-vault [create|decrypt|edit|encrypt|encrypt_string|rekey|view] [options] [vaultfile.yml]
可以看到有很多子命令:
- create: 創建一個新文件,並直接對其進行加密
- decrypt: 解密文件
- edit: 用於編輯 ansible-vault 加密過的文件
- encrypy: 加密文件
- encrypt_strin: 加密字符串,字符串從命令行獲取
- view: 查看經過加密的文件
加密文件
先自己創建一個文件,寫入一些內容:
[root@Ansible ~]# echo "123456" > pass.txt
[root@Ansible ~]# cat pass.txt
123456
[root@Ansible ~]#
然後用 ansible-vault encrypt 加密文件:
[root@Ansible ~]# ansible-vault encrypt pass.txt
New Vault password:
Confirm New Vault password:
Encryption successful
[root@Ansible ~]#
這裏會要求輸入密碼。
現在再去打開文件看看:
[root@Ansible ~]# cat pass.txt
$ANSIBLE_VAULT;1.1;AES256
62633762393035316438663662343964656465376634393131313466313536336361333163313238
6162356161653365623961353533356264386134653830640a353531623635653337636564383763
38316636383334323533363666383963666161633332663461316338333332623434376162326265
6565623130373539330a313737646431626131336637663033656664383932393934633337383666
6334
[root@Ansible ~]#
查看文件內容,可以用 ansible-vault view 命令:
[root@Ansible ~]# ansible-vault view pass.txt
Vault password:
123456
[root@Ansible ~]#
把文件還原可以用 ansible-vault decrypt 命令:
[root@Ansible ~]# ansible-vault decrypt pass.txt
Vault password:
Decryption successful
[root@Ansible ~]# cat pass.txt
123456
[root@Ansible ~]#
加密配置文件
上面的演示內容只是一個小工具的單獨使用,這裏看看結合ansible命令的使用。
在/etc/ansible/hosts文件中新加一臺主機用於測試:
host1 ansible_host=127.0.0.1 ansible_connection=local
這裏加的就是本機。
然後單獨創建這臺主機的變量文件 /etc/ansible/host_vars/host1 ,隨便寫入一些變量:
---
key1: vaule1
key2: VALUE2
先來驗證一下:
[root@Ansible ~]# ansible host1 -a "echo key1={{key1}}, key2={{key2}}"
host1 | CHANGED | rc=0 >>
key1=vaule1, key2=VALUE2
[root@Ansible ~]#
現在把配置文件加密:
[root@Ansible ~]# ansible-vault encrypt /etc/ansible/host_vars/host1
New Vault password:
Confirm New Vault password:
Encryption successful
[root@Ansible ~]# ansible host1 -a "echo key1={{key1}}, key2={{key2}}"
ERROR! Attempting to decrypt but no vault secrets found
[root@Ansible ~]#
加密後再運行就不管用了,這裏需要加一個參數 --ask-vault-pass 來提供vault加密的密碼:
[root@Ansible ~]# ansible host1 -a "echo key1={{key1}}, key2={{key2}}" --ask-vault-pass
Vault password:
host1 | CHANGED | rc=0 >>
key1=vaule1, key2=VALUE2
[root@Ansible ~]#
使用文件加密
之前都是直接使用密碼進行加密。對我們來說,其實只是把一個密碼用另一個密碼加密了。在使用的時候,我們不使用原來的密碼,而是使用vault的密碼。
爲了方便不用每次都輸入密碼,可以把密碼寫在文件中。不過直接把密碼明文寫在文件中總是不安全的。利用 ansible-vault 就是讓我們可以把密碼直接寫在配置中(也可以是一個單獨的配置文件),然後把有敏感信息的文件加密。這樣做的好處是,整個項目所有的配置信息都是全的,包括項目中使用的密碼,並且是加密的。
如果每次使用時仍然不想輸入密碼,也可以把vault的密碼寫到文件中(明文的),這樣每次使用時就不是手動輸入,而是讓ansible自動從文件中獲取這個密碼。
還是重複使用之前的配置文件,先把文件進行解密:
[root@Ansible ~]# ansible-vault decrypt /etc/ansible/host_vars/host1
Vault password:
Decryption successful
[root@Ansible ~]#
然後再生成文件後用文件進行加密:
[root@Ansible ~]# echo "123456" > vault-pass-file
[root@Ansible ~]# ansible host1 -a "echo key1={{key1}}, key2={{key2}}"
ERROR! Attempting to decrypt but no vault secrets found
[root@Ansible ~]# ansible host1 -a "echo key1={{key1}}, key2={{key2}}" --vault-password-file vault-pass-file
host1 | CHANGED | rc=0 >>
key1=vaule1, key2=VALUE2
[root@Ansible ~]# ansible host1 -a "echo key1={{key1}}, key2={{key2}}" --ask-vault-pass
Vault password:
host1 | CHANGED | rc=0 >>
key1=vaule1, key2=VALUE2
[root@Ansible ~]#
這裏最後還試了一下使用密碼 --ask-vault-pass 效果其實和使用 --vault-password-file 是一樣的。一個是手動輸入密碼,一個是從文件中讀取密碼字符串。
加密變量
上面的加密方式是加密整個文件。加密後,文件中敏感的內容不敏感的內容就都看不到了,這樣也很不方便。一個解決辦法是把敏感的和不敏感的內容分開,寫在不同的文件中,只加密敏感文件。就像之前的示例中那樣。
還有一個更靈活的方式,使用 ansible-vault encrypt_string 把值進行加密。
通過文件加密
準備好用作vault認證的文件:
[root@Ansible ~]# ansible-vault encrypt_string --vault-id vault-pass-file 'ssh_pass' --name 'key3'
key3: !vault |
$ANSIBLE_VAULT;1.1;AES256
66613666353739356536663965336234383363373563353231353939303839313430616161336365
6662336162386231316132633365366232363936613561650a313637643339323861626364633864
32653666626333623961643866656235653764646333613533343231303734313862376232393734
6563343539393264650a653438326463646364646338656339356236383537663135633935313239
3664
Encryption successful
[root@Ansible ~]#
參數--name,可以不寫。寫上後最後生成的內容就是帶key的,否則只是生成值的部分,key我們也可以手動加上。
手動輸入密碼
如果不使用文件,而是要手動輸入,可以將指定的文件名替換爲prompt,這樣就會讓我們輸入2次密碼確認了:
[root@Ansible ~]# ansible-vault encrypt_string --vault-id prompt 'ssh_pass' --name 'key3'
New vault password (default):
Confirm new vault password (default):
key3: !vault |
$ANSIBLE_VAULT;1.1;AES256
30666333366265346464383165373062613165666130373066613930316364363432376336613938
3131663337633863373539666134643661623734613330350a616661613934633335303365366266
36363433613334386664663839346435656534373732333632303532303939383466303662396438
3433633535333130350a323934373162356139363762383739386139333937666237613564313939
3137
Encryption successful
[root@Ansible ~]#
加上用戶標識
在官方文檔的示例中 --vault-id 的參數值,都是加上了用戶名稱表示的,加在文件名或者prompt前,用@隔開:
$ ansible-vault encrypt_string --vault-id steed@vault-pass-file 'ssh_pass' --name 'key3'
$ ansible-vault encrypt_string --vault-id steed@prompt 'ssh_pass' --name 'key3'
貌似也沒什麼用,但是生成的內容中會有這個用戶標識。還是儘量參考官方的建議來比較好。
生成一個新的變量,將加密的值寫到配置文件中:
[root@Ansible ~]# ansible-vault encrypt_string --vault-id steed@vault-pass-file 'ssh_pass' --name 'key3' >> /etc/ansible/host_vars/host1
[root@Ansible ~]# cat /etc/ansible/host_vars/host1
---
key1: vaule1
key2: VALUE2
key3: !vault |
$ANSIBLE_VAULT;1.2;AES256;steed
30343264386638623133383632353762356632643531643735653131663662623164303533373163
3032646663363765386135386362376433326131333262310a366636396233653038646133336334
62376532343064396639623835646563643663613530383739666239663565386364303931316637
6137343936636266340a306233633039323537346332336132313766383039653565646230393662
6332
[root@Ansible ~]#
這裏可以看到密文上一行的內容的最後,有之前加上的用戶標識信息。
使用的時候,使用密碼還是指定文件都可以:
[root@Ansible ~]# ansible host1 -a "echo key1={{key1}}, key3={{key3}}" --vault-id vault-pass-file
host1 | CHANGED | rc=0 >>
key1=vaule1, key3=ssh_pass
[root@Ansible ~]# ansible host1 -a "echo key1={{key1}}, key3={{key3}}" --vault-password-file vault-pass-file
host1 | CHANGED | rc=0 >>
key1=vaule1, key3=ssh_pass
[root@Ansible ~]#
官方文檔中是用 --vault-id 來指定解密用的文件的,不過試了下 --vault-password-file 也是可以的。
使用debug模塊進行調試
官方的建議是使用debug模塊就行調試:
To see the original value, you can use the debug module.
之前的示例就不改了,要用debug模塊,簡單的可以這麼使用:
[root@Ansible ~]# ansible host1 -m debug -a 'var="key1,key2,key3"' --vault-password-file vault-pass-file
host1 | SUCCESS => {
"key1,key2,key3": "('vaule1', 'VALUE2', 'ssh_pass')"
}
[root@Ansible ~]#