本章主要介绍如何对ansible中的playbook 进行加密。
前面写了许多playbook,这些playbook都是以明文的方式存在的,有时想对这些 playbook进行加密,可以使用ansible-vault命令来实现。本章实验都在/home/bdqn/demo6下操作,先把demo6目录创建出来并把ansible.cfg 和 hosts拷贝进去,命令如下。
[bdqn@rhel01 ~]$ mkdir demo6
[bdqn@rhel01 ~]$ cp ansible.cfg hosts demo6/
[bdqn@rhel01 ~]$ cd demo6/
[bdqn@rhel01 demo6]$ ls
ansible.cfg hosts
[bdqn@rhel01 demo6]$
创建test1.yaml,内容如下。
[bdqn@rhel01 demo6]$ cat test1.yaml
---
- hosts: server2
gather_facts: false
vars:
aa: cisco@123
tasks:
- name: 打印一个变量
debug: msg="{{aa}}"
[bdqn@rhel01 demo6]$
现在这个文件是以明文的方式存储的,对这个文件进行加密,加密的语法如下。
ansible‐vault encrypt file
这里的意思是对file文件进行加密,需要按提示输人密码。下面对test1.yaml进行加密,命令如下。
[bdqn@rhel01 demo6]$ ansible-vault encrypt test1.yaml
New Vault password:
Confirm New Vault password:
Encryption successful
[bdqn@rhel01 demo6]$
下面查看 testl.yaml的内容,命令如下。
[bdqn@rhel01 demo6]$ cat test1.yaml
$ANSIBLE_VAULT;1.1;AES256
33633633653838653963626238306166613732646163343634363430383466356539363664623637
3136393939373439303835366164383862343433313136390a313731636634636131326230323938
30653266373932393665396334633839623033626136313532373638636638303230353438343033
6637346662666532390a633265366161646361666131646336633363303631393633326165363463
30356433386430366434356135353365646435306264353836643861346163633263323933646464
64383030326337326262613432663030666163363265653730636334663631323361666438346232
39653031366239386265323962336231633137356232373434313063383237373636356263633335
30346132656331363766616434313165373665386231313336383431633766346131643735383066
30366634623937386235396437363266323766633434383365373337633634373062646436653634
62636164656164633963623565393831626161343563616566396564316663373530326232343163
353965356638636463366430316235393130
[bdqn@rhel01 demo6]$
可以看到,此文件已经是被加密的了。
如果要查看加密文件的内容,可以使用ansible-vault view file命令,需要输入解密密码。下面查看 test1.yaml 的内容,命令如下。
[bdqn@rhel01 demo6]$ ansible-vault view test1.yaml
Vault password:
---
- hosts: server2
gather_facts: false
vars:
aa: cisco@123
tasks:
- name: 打印一个变量
debug: msg="{{aa}}"
[bdqn@rhel01 demo6]$
这样就可以看到文件的内容了,但是此文件并没有被解密,依然是加密的文件。
如果密码输入错误,则看不到文件的内容,如下所示。
[bdqn@rhel01 demo6]$ ansible-vault view test1.yaml
Vault password:
ERROR! Decryption failed (no vault secrets were found that could decrypt) on test1.yaml for test1.yaml
[bdqn@rhel01 demo6]$
如果直接运行加密后的YAML文件,则会报错,如下所示。
[bdqn@rhel01 demo6]$ ansible-playbook test1.yaml
ERROR! Attempting to decrypt but no vault secrets found
[bdqn@rhel01 demo6]$
因为这个playbook是被加密的,要运行它必须输入解密密码才行。在运行时,可以加上- -ask-vault-pass选项提示用户输入解密密码,命令如下。
[bdqn@rhel01 demo6]$ ansible-playbook --ask-vault-pass test1.yaml
Vault password:
PLAY [server2] *******************************************************************************************************************************************
TASK [打印一个变量] ********************************************************************************************************************************************
ok: [server2] => {
"msg": "cisco@123"
}
PLAY RECAP ***********************************************************************************************************************************************
server2 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[bdqn@rhel01 demo6]$
这样playbook就可以正常地运行了。
如果要修改加密密码,可以使用ansible-vault rekey file命令来实现,需要先输入一次解密密码,然后输入两次新密码,如下所示。
[bdqn@rhel01 demo6]$ ansible-vault rekey test1.yaml
Vault password:
New Vault password:
Confirm New Vault password:
Rekey successful
[bdqn@rhel01 demo6]$
这样test1.yaml的加密密码就被更改了。
如果要对文件进行解密,可以使用ansible-vault decrypt file命令,然后输人解密密码即可对加密文件进行解密。下面对test1.yaml进行解密,命令如下。
[bdqn@rhel01 demo6]$ ansible-vault decrypt test1.yaml
Vault password:
Decryption successful
[bdqn@rhel01 demo6]$
输入密码之后提示解密成功。下面查看test1.yaml的内容,命令如下。
[bdqn@rhel01 demo6]$ cat test1.yaml
---
- hosts: server2
gather_facts: false
vars:
aa: cisco@123
tasks:
- name: 打印一个变量
debug: msg="{{aa}}"
[bdqn@rhel01 demo6]$
已经可以正常查看了。
加密、解密、查看等操作都需要输入密加里扣密码写人一个文件中,在执行 ansible-vault命令时加上“--vault-id密码文件”选项,即可不需要输人密码了
先把密码写入aa.xt中,命令如下。
[bdqn@rhel01 demo6]$ echo huawei@123 > aa.txt
[bdqn@rhel01 demo6]$ cat aa.txt
huawei@123
[bdqn@rhel01 demo6]$
对test1.yaml进行加密,命令如下。
[bdqn@rhel01 demo6]$ ansible-vault encrypt --vault-id aa.txt test1.yaml
Encryption successful
[bdqn@rhel01 demo6]$
这里显示加密成功。然后查看test1.yaml的内容,命令如下。
[bdqn@rhel01 demo6]$ cat test1.yaml
$ANSIBLE_VAULT;1.1;AES256
36383230313333343062656632633761646433383133366464373166336631356661313332643535
3461373630633530373235653035323939623537633533640a393962363937383938383735326463
62373263333065353965633631386335353866383162663534383064363863393065646565366265
3634623630386565370a636139346665356664363837643765376663383166383764653434393562
38323432333665393432623231646333383933363936623836363237663437643932653534356636
39626532643234623961616361396531343935656565373062333935653339376232393636613531
31343164666630323961323237616436346332373634393131663664396133353831393862396335
32316431663234666462326639613030616532643865636330343435363131613539616364616461
66633931353265323062663265356162313362666632616662396636633630396437373138356439
63616633646335393464336566383534393935323335646362616239623639643330656630353036
323532623961386232323431306337646434
[bdqn@rhel01 demo6]$
可以看到,已经被加密了。下面通过ansible-vault view查看test1.yaml的内容,命令如下。
[bdqn@rhel01 demo6]$ ansible-vault view --vault-id aa.txt test1.yaml
---
- hosts: server2
gather_facts: false
vars:
aa: cisco@123
tasks:
- name: 打印一个变量
debug: msg="{{aa}}"
[bdqn@rhel01 demo6]$
这里会直接读取密码文件中的密码,所以不需要我们再次输入密码。
加上-vault-id aa.txt选项运行playbook,命令如下。
[bdqn@rhel01 demo6]$ ansible-playbook --vault-id aa.txt test1.yaml
PLAY [server2] *******************************************************************************************************************************************
TASK [打印一个变量] ********************************************************************************************************************************************
ok: [server2] => {
"msg": "cisco@123"
}
PLAY RECAP ***********************************************************************************************************************************************
server2 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[bdqn@rhel01 demo6]$
此时 playbook也可以正常运行了。解密test1.yaml,命令如下。
[bdqn@rhel01 demo6]$ ansible-vault decrypt --vault-id aa.txt test1.yaml
Decryption successful
[bdqn@rhel01 demo6]$
可以看到,不需要输入密码,就解密完成了。
可以不对整个文件进行加密,只加密某个字符串,命令如下。
[bdqn@rhel01 demo6]$ cat test1.yaml
---
- hosts: server2
gather_facts: false
vars:
aa: cisco@123
tasks:
- name: 打印一个变量
debug: msg="{{aa}}"
[bdqn@rhel01 demo6]$
这里变量aa的值为cisco@123,是一个明文,可以单独对字符串cisco@123进行加密,命令如下。
[bdqn@rhel01 demo6]$ ansible-vault encrypt_string --vault-id aa.txt cisco@123
!vault |
$ANSIBLE_VAULT;1.1;AES256
38393565386132613333383462623834396230323132306565356663333837663161383432613966
6162396131623737356234626436633831663439333832660a333064313438666339376563313936
38663563323232363130333163323538643632306131323039356530663338626139656364653738
3537393733323832640a323236643934666536656432373034303364326638363261363637313238
6239
Encryption successful
[bdqn@rhel01 demo6]$
上面的加粗字就是加密后的密码,因为输出太长,这里用了省略号。
修改 test1.yaml的内容,把cisco@123换成加密后的密文,内容如下。
[bdqn@rhel01 demo6]$ cat test1.yaml
---
- hosts: server2
gather_facts: false
vars:
aa: !vault |
$ANSIBLE_VAULT;1.1;AES256
38393565386132613333383462623834396230323132306565356663333837663161383432613966
6162396131623737356234626436633831663439333832660a333064313438666339376563313936
38663563323232363130333163323538643632306131323039356530663338626139656364653738
3537393733323832640a323236643934666536656432373034303364326638363261363637313238
6239
tasks:
- name: 打印一个变量
debug: msg="{{aa}}"
[bdqn@rhel01 demo6]$
需要注意的是,aa后面的这个值不能用引号引起来。
运行此 playbook,并指定密码文件,命令如下。
[bdqn@rhel01 demo6]$ ansible-playbook --vault-id aa.txt test1.yaml
PLAY [server2] *******************************************************************************************************************************************
TASK [打印一个变量] ********************************************************************************************************************************************
ok: [server2] => {
"msg": "cisco@123"
}
PLAY RECAP ***********************************************************************************************************************************************
server2 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[bdqn@rhel01 demo6]$
可以看到,已经正常运行起来了。