ansible-vault 教程


基本使用

在編寫playbook時,可能會涉及到一些敏感的數據,比如密碼,當這些敏感數據以明文的方式存儲在playbook中時,可能是不能被接受的,那么我們該怎么辦呢?ansible官方已經考慮到了這種情況,當我們的playbook中含有不能明文展示的文本時,我們可以使用"ansible-vault"命令,對敏感數據進行加密,我們可以對整個文件加密,也可以對某個字符串加密(也就是變量加密),那么具體操作是怎樣的呢?我們一起來了解一下吧。

假如,我們已經編寫好了一個playbook文件,內容如下

# cat test.yml
- hosts: test70
  tasks:
  - debug:
      msg: "Test ansible-vault"

 

如你所見,整個test.yml的內容都是明文的,如果我想要對這個劇本進行加密,可以使用如下命令

ansible-vault encrypt test.yml

 

"encrypt"是"ansible-vault"的子命令,如果我們想要加密某個文件,則可以使用"ansible-vault encrypt"命令,執行上述命令后,會提示輸入密碼,你需要記住密碼,因為如果你想要運行加密過的劇本,或者解密,都需要使用這個密碼(也可以使用密碼文件,之后會有示例),輸入兩遍密碼后,即可看到"Encryption successful"的字樣,表示加密成功,此刻如果再次查看test.yml文件的內容,可以發現,已經變成了如下內容:

# cat test.yml
$ANSIBLE_VAULT;1.1;AES256
64323634303535336563333064663033393037316462363334656334396562643736663839386464
3062373266626165306238613264633230623837633436660a356638633436313332643735613335
31333935336437633064323761613632396631643334363730663131656661613063333265363838
3139306532613739660a386130346232656132366330383131323637613533323733646437366331
63663939396234376362336164663665326162323262313139383364373038636562306163636362
33396434663731356239303162656466343031316161346166373037666130353831393261313530
31646366353836303439323738323032306164623338346433323433623538353863633563633266
34313334623637336535

 

可以看到,test.yml文件的內容已經被加密,那么,如果此刻我們想要執行test.yml,能不能正常執行呢?我們來試試

# ansible-playbook test.yml
ERROR! Attempting to decrypt but no vault secrets found

 

可以看到,直接調用加密過的劇本,會報錯,因為ansible並不知道解密的密碼,我們可以借助"--ask-vault-pass"選項,在運行加密的劇本時輸入對應的密碼,示例如下

# ansible-playbook --ask-vault-pass test.yml

 

輸入上述命令后,會提示你輸入密碼,密碼就是加密時所使用的密碼,輸入密碼后,即可正常執行test.yml文件。

如果你想要還原一個加密過的文件,或者說解密一個加密過的文件,可以使用"ansible-vault"的另一個子命令,"decrypt"子命令,見名知意,"decrypt"子命令就是用來解密的,示例如下:

# ansible-vault decrypt test.yml

 

輸入上述命令后,會提示你輸入密碼,就是你加密時所使用的密碼,輸入密碼后會看到"Decryption successful"字樣,表示解密成功,再次查看test.yml文件,可以發現,其中的內容已經被還原成了明文內容。

你可能會有疑問,難道每次加密和解密,都需要手動的輸入密碼么?難道就沒有不用手動輸入密碼的方法么?必須有啊,我們可以將密碼保存在某個文件中,然后在加密或者解密時,指定這個密碼文件就好了,這樣我們就不用手動的輸入密碼了,示例如下:

首先,我將密碼寫入到pwdfile文件中,如下:

# echo "123123" > pwdfile

 

然后,使用這個密碼文件加密對應的playbook,如果想要使用密碼文件,需要借助一個選項,它就是"--vault-password-file"選項,通過“--vault-password-file”來指定加密所需的密碼文件,如下:

# ansible-vault encrypt --vault-password-file pwdfile test.yml

 

可以看到,我們在使用ansible-vault encrypt命令時,使用"--vault-password-file"選項指定了pwdfile文件作為密碼文件,表示使用pwdfile文件中的文本作為密碼對test.yml進行加密,當我們需要運行加密過的劇本、或者解密時,同樣可以使用"--vault-password-file"選項,指定對應的密碼文件進行解密,如下:

# ansible-playbook --vault-password-file pwdfile test.yml
# ansible-vault decrypt --vault-password-file pwdfile test.yml

 

這樣,我們就不用在加密和解密時手動的輸入密碼了。

從ansible2.4版本開始,官方不再推薦使用"--vault-password-file"選項,官方開始推薦使用"--vault-id"選項代替"--vault-password-file"選項指定密碼文件,也就是說,如下兩條命令的效果是一樣的。

# ansible-vault encrypt --vault-id pwdfile test.yml
# ansible-vault decrypt --vault-password-file pwdfile test.yml

 

當然,在運行加密過的腳本和解密時,也可以使用"--vault-id"選項指定密碼文件

# ansible-playbook --vault-id pwdfile test.yml
# ansible-vault decrypt --vault-id pwdfile test.yml

 

其實,"--vault-id"選項不僅能夠代替"--vault-password-file"選項,還能夠代替"--ask-vault-pass"選項,在之前的示例中已經演示過,當調用加密過的劇本時,可以使用"--ask-vault-pass"選項,交互式的輸入密碼,"--vault-id"選項可以實現同樣的功能,示例如下:

  

# ansible-playbook --vault-id prompt test.yml

 

執行上述命令后,同樣會交互式的提示用戶輸入密碼,輸入正確的密碼后,即可正常的運行加密過的劇本,也就是說,如下兩條命令的效果是完全相同的。

# ansible-playbook --vault-id prompt test.yml
# ansible-playbook --ask-vault-pass test.yml

 

  

2.4版本以后的ansible中,"--vault-id"選項支持同時使用多個密碼文件進行解密,什么意思呢?我們先來描述一個工作場景,如下:

現在我有兩個yml文件,test.yml和test1.yml,這兩個yml文件的內容分別如下

# cat test.yml
- hosts: test70
  tasks:
  - debug:
      msg: "message from test"
  - include_tasks: test1.yml
 
# cat test1.yml
- debug:
    msg: "message from test1"

 

  

如上述示例所示,test.yml包含了test1.yml,所以,當我們執行test.yml時,test1.yml也會被調用。

同時,我准備了兩個密碼文件,分別存放了不同的密碼

# echo "123123" > pwdfile
# echo "123456" > pwdfile1

 

  

現在我要做的是,分別用兩個密碼文件加密這兩個yml文件,操作如下:

# ansible-vault encrypt --vault-id pwdfile test.yml
# ansible-vault encrypt --vault-id pwdfile1 test1.yml

 

  

現在兩個yml文件都被加密了,而且使用了不同的密碼,如果此時,我想要運行test.yml,會出現什么問題么?聰明如你一定想到了,因為test.yml包含了test1.yml,所以當我們調用test.yml時,也會調用test1.yml,但是我們使用了不同的密碼加密了這兩個yml文件,所以,當我們想要運行它們時,必須同時提供兩個密碼文件,命令如下:

# ansible-playbook --vault-id pwdfile1 --vault-id pwdfile test.yml

 

你也可以一次性使用不同的密碼文件解密不同的文件,示例如下:

# ansible-vault decrypt --vault-id pwdfile1 --vault-id pwdfile test.yml test1.yml

 

執行上述命令時,你不用糾結密碼文件與加密文件的對應關系,ansible會自動嘗試這些密碼文件。

你甚至可以使用如下命令,使用交互式的方式,一次性的輸入多個文件的解密密碼,但是使用如下命令輸入密碼時,需要注意對應順序。

# ansible-vault view --vault-id prompt --vault-id prompt test.yml test1.yml

 

其實," --vault-id"選項還有一個小功能,就是在加密文件時,給被加密的文件"做記號",什么意思呢?來看一個小栗子,如下:

# ansible-vault encrypt --vault-id zsy@pwdfile test.yml

 

上述命令表示對test.yml文件進行加密,使用pwdfile文件中的內容作為密碼,同時,在加密test.yml文件時,加入了"zsy"這個小記號,那么加密完成后,查看加密后的test.yml文件內容如下:

# cat test.yml
$ANSIBLE_VAULT;1.2;AES256;zsy
65633737626662646664343335303732383437626634306261326636336261303935316431626437
3362653939303733646533356665643737333830323833370a363530623865353831623936376463
31343961313638393865373061623439376632383038386464386662643935656261656130636135
6133366539386433370a366136646162626532303363636466366663373034383932643035313761
32346538656532323434613435393137633731383561653163373233626366623662356636643565
61666537316137323936613237663639333461333534653336313731653331323434666434663831
63323239373463626534393063383365666438363737653535333430636232336634663064393462
61623266373735373066316663303533633638353762653630323833376535666134316136356639
61386437656562383965656162376434666439633134643665393637663639363133

 

可以看到,加密后的test.yml的第一行內容的結尾,就是我們加入的"小記號"。

這些記號並不會對加密和解密的過程產生影響,只是為了方便管理,如果你是管理員,可能通過一些記號,能夠更方便的對這些加密過的內容進行標識吧。

你也可以在交互輸入密碼時添加記號,比如添加一個"記號",zsythink,命令如下:

# ansible-vault encrypt --vault-id zsythink@prompt test.yml

 

剛才我們只介紹了ansible-vault的兩個子命令,encrypt子命令和decrypt子命令,其實ansible-vault還有一些其他的子命令,這些子命令分別對應了不同的功能,我們來認識一下它們。

create子命令

使用create子命令,可以創建一個被加密的文件

# ansible-vault create test

 

執行上述命令后,會提示你輸入密碼,確認密碼,然后默認調用vi編輯器,提示你輸入內容,你輸入的內容將會被保存到test文件中,並且在退出編輯器時自動將test文件加密,也就是說,create子命令的作用就是創建一個文件,等待你寫入內容后使用ansible-vault進行加密。

view子命令

使用view子命令,可以查看已經被加密過的文件的原內容,但是不會對文件本身進行還原操作,只是查看原內容。

# ansible-vault view test.yml
# ansible-vault view --vault-id pwdfile test.yml

 

edit子命令

使用edit子命令,可以直接修改被加密過的文件的原內容,使用edit子命令修改被加密過的文件內容的過程相當於:先解密、修改原內容,再加密

# ansible-vault edit test.yml
# ansible-vault edit --vault-id pwdfile test.yml

 

rekey子命令

使用rekey子命令,可以修改被加密文件的密碼,比如,一開始我使用了123123這個密碼對test.yml文件進行了加密,現在,我想把密碼換成123456,執行如下命令即可

# ansible-vault rekey test.yml

 

執行上述命令后,一共會提示你輸入3次密碼,第一次輸入老密碼,也就是123123,之后兩次輸入新密碼,也就是123456,修改成功后,以后都適用新密碼進行解密。

當然,如果你之前是使用的密碼文件的方式進行的加密,也可以使用rekey子命令重新指定一個新的密碼文件,但是需要借助"--new-vault-id"選項或者"--new-vault-password-file"選項,通過這兩個選項的任何一個,都可以指定新的密碼文件。

# ansible-vault rekey --vault-id pwdfile --new-vault-id pwdfile1 test.yml

 

encrypt_string子命令

剛才介紹的方法都是對整個文件進行加密,但是通常,我們並不需要加密整個文件,加密整個文件后,反而可能會對我們的閱讀造成困擾,有時我們只是想把"密碼隱藏起來"而已。

從2.3版本開始,使用encrypt_string子命令,可以加密"字符串",通過加密字符串的功能,能夠有效的隱藏敏感變量的值,比如,隱藏變量列表中密碼變量的值,假設,我現在的playbook如下:

# cat test.yml
- hosts: test71
  vars:
    test_user: "testuser"
    test_passwd: "123456"
  tasks:
  - debug:
      msg: "{{test_user}}"
  - debug:
      msg: "{{test_passwd}}"

 

我覺得test_passwd這個密碼變量直接以明文的方式存儲在playbook中不太安全,因為所有有權限查看該playbook的人都能直接看到密碼,我們需要對密碼字符串的值(也就是123456)進行加密,以保證它不會明文顯示在這里,所以,我們需要借助到"ansible-vault encrypt_string"命令,操作如下:

注:我們從最原始的操作開始,以免產生疑問

# ansible-vault encrypt_string 123456

 

上例表示,使用"ansible-vault encrypt_string"命令對"123456"這個字符串進行加密,加密時,會提示你輸入密碼,你輸入的密碼用於加密和解密字符串,此處,我輸入了"aaaa"作為加密解密的密碼,輸入密碼后,"ansible-vault encrypt_string"命令會將加密后的字符串輸入到屏幕中,如下:

# ansible-vault encrypt_string 123456
New Vault password:
Confirm New Vault password:
!vault |
          $ANSIBLE_VAULT;1.1;AES256
          30316633646364663764333666383437373439353538353336623532323131623739353663653637
          3430626637386231366236643034643365323738336231330a326534623039363030393739663237
          65623635616666656233333337636439366535383334393138623231613035373133323832383335
          3737386234363761350a343839326663626664396436336465393862613237393864316533663533
          6335

 

如你所見,這返回的一長串文本就是"123456"加密后的文本,現在,復制這串文本,用這串文本替換playbook中的"123456",替換后的playbook如下:

# cat test.yml
- hosts: test71
  vars:
    test_user: "testuser"
    test_passwd: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          30316633646364663764333666383437373439353538353336623532323131623739353663653637
          3430626637386231366236643034643365323738336231330a326534623039363030393739663237
          65623635616666656233333337636439366535383334393138623231613035373133323832383335
          3737386234363761350a343839326663626664396436336465393862613237393864316533663533
          6335
  tasks:
  - debug:
      msg: "{{test_user}}"
  - debug:
      msg: "{{test_passwd}}"

 

此刻,"123456"這串明文字符串已經被替換為了加密后的字符串,那么我們來運行一下這個playbook,由於上文中已經說明了各個選項的用法,所以此處不再贅述,使用如下兩條命令的效果是相同的,都會提示你輸入加密時所使用的密碼(也就是"aaaa"):

# ansible-playbook --ask-vault-pass test.yml
# ansible-playbook --vault-id prompt test.yml

 

輸入"aaaa"后,即可正常執行playbook,執行結果如下,可以從如下結果看出,字符串已經被正常解密了,獲取到了我們原來設置的值,也就是"123456",這樣我們就能做到在運行時獲取到真正的"字符串原文",而在playbook中不再顯示明文字符串了。

# ansible-playbook --vault-id prompt test.yml
Vault password (default):
 
PLAY [test71] *************************************
 
TASK [Gathering Facts] *****************************
ok: [test71]
 
TASK [debug] *************************************
ok: [test71] => {
    "msg": "testuser"
}
 
TASK [debug] **************************************
ok: [test71] => {
    "msg": "123456"
}
 
PLAY RECAP **************************************
test71                     : ok=3    changed=0    unreachable=0    failed=0

 

聰明如你一定想到了,當我們加密字符串或者解密字符串時,可以使用"--vault-id"選項或者"--vault-password-file"選項指定"密碼文件",以免手動的輸入加密時的密碼,示例如下:

# echo aaaa > pwdfile
# ansible-vault encrypt_string --vault-id pwdfile 123456
# ansible-playbook --vault-id pwdfile test.yml

 

使用密碼文件的方式是最常見的,因為我們不可能在自動化的過程中手動的輸入密碼進行解密,所以密碼文件的權限一定要控制好,無論是放在git上或者放在jenkins上,都應該做好權限控制。

"encrypt_string"子命令還有一個選項,能夠設置加密后的字符串的變量名,它就是"--name"選項,示例如下

# ansible-vault encrypt_string --vault-id pwdfile --name test_passwd 123456
test_passwd: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          36396366336238376662353664383836316366383937623830626635613063343764333962376466
          3835646161363364303563373438643732626231303564320a393233333461663562383733643166
          62313362623838336433303032376565343264356665323832623565653631386536383762633764
          3961613265366336300a376564633034376238363664653565316163313739343639643565306665
          6264
Encryption successful

 

如你所見,我使用了"--name"選項,指定了變量名"test_passwd",那么最終生成的結果的格式就是 "變量名:加密后的字符串",其實與不使用"--name"選項時沒有太大的區別,不過這樣比較方便復制,你可以直接將生成的結果復制到playbook中,因為變量名已經生成了。

上文總結的選項你也可以靈活的使用,比如在加密字符串時添加一個"小記號"

# ansible-vault encrypt_string --vault-id zsy@pwdfile --name test_passwd 123456

 

這篇文章總結了怎樣使用"ansible-vault"命令加密文件和變量,希望能夠幫助到你~

 

https://www.codercto.com/a/70421.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM