ansible加密

本章主要介绍如何对ansible中的playbook 进行加密。

  • 对整个playbook进行加密
  • 查看加密文件
  • 运行加密的playbook
  • 对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]$

运行playbook 

如果直接运行加密后的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]$ 

可以看到,已经正常运行起来了。 

你可能感兴趣的:(Red,Hat,ansible,运维,linux)