Ansible 加密模塊 Vault

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 ~]#

加上用戶標識

官方的文檔如下:
https://docs.ansible.com/ansible/latest/network/getting_started/first_inventory.html#protecting-sensitive-variables-with-ansible-vault

在官方文檔的示例中 --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 ~]# 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章