RHCE9学习指南 第34章 ansible加密

前面写了许多playbook,这些playbook都是以明文的方式存在的,有时想对这些playbook进行加密,这里可以用ansible vault来实现。本章的实验都在demo6下练习,创建demo6并把ansible.cfg和hosts拷贝到demo6中,命令如下。

[lduan@server ~]$ mkdir demo6
[lduan@server ~]$ cp ansible.cfg hosts demo6
[lduan@server ~]$ cd demo6
[lduan@server demo6]$

34.1 对整个脚本进行加密

创建test1.yaml内容如下。

[lduan@server demo6]$ cat test1.yaml
---
- hosts: server2
  gather_facts: false
  vars:
    aa: haha001
  tasks:
  - name: 打印一个变量
    debug: msg="{{aa}}"
[lduan@server demo6]$

现在这个文件是以明文的方式存储的,对这个文件进行加密。加密的语法如下。

ansible-vault encrypt file

意思是对file文件进行加密,需要按提示输入密码,下面对test1.yaml进行加密,命令如下。

[lduan@server demo6]$ ansible-vault encrypt test1.yaml 
New Vault password: 
Confirm New Vault password: 
Encryption successful
[lduan@server demo6]$

下面查看test1.yaml的内容。

[lduan@server demo6]$ cat test1.yaml 
$ANSIBLE_VAULT;1.1;AES256
61633762333464376132303339326265666239316430646635336638
    ...输出...
165633163383431333034663539643362
663161343937323034346564623763633539
[lduan@server demo6]$

可以看到,现在此文件已经是被加密的了。

34.2 查看文件内容

如果要查看加密文件的内容,可以使用ansible-vault view file,需要输入解密密码,下面查看test1.yaml的内容。

[lduan@server demo6]$ ansible-vault view test1.yaml 
Vault password: 输入密码按【Enter】键
---
- hosts: server2
  gather_facts: false
  vars:
    aa: haha001
  tasks:
  - name: 打印一个变量
    debug: msg="{{aa}}"
[lduan@server demo6]$

这样就可以看到文件的内容了,但是此文件并没有被解密,依然是加密的文件。
如果密码输入错误则是看不到文件内容的。

[lduan@server 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
[lduan@server demo6]$

34.3 运行playbook

如果直接运行加密后的yaml文件,则会报错,如下所示。

[lduan@server demo6]$ ansible-playbook test1.yaml 
ERROR! Attempting to decrypt but no vault secrets found
[lduan@server demo6]$

因为这个playbook是被加密的,要运行它必须要输入解密密码才行。在运行时,可以加上--ask-vault-pass提示用户输入解密密码,命令如下。

[root@server rh294]# ansible-navigator -m stdout run --ask-vault-pass var-encry.yaml 
Vault password:
    ...
[root@server rh294]#

也可以指定密码文件,这样就可以不用输入密码直接运行了。

[lduan@server demo6]$ ansible-playbook --ask-vault-pass test1.yaml 
Vault password: 输入密码按【Enter】键
PLAY [server2] ***********************************
    ...输出...
[lduan@server demo6]$ 

这样playbook就可以正常地运行了。
如果要修改加密密码,可以通过命令ansible-vault rekey file实现,需要先输入一次解密密码,然后输入2次新密码。

[lduan@server demo6]$ ansible-vault rekey test1.yaml 
Vault password: 
New Vault password: 
Confirm New Vault password: 
Rekey successful
[lduan@server demo6]$

这样test1.yaml的加密密码就被换掉了。

34.4 对脚本进行解密

如果要对文件解密,可以用ansible-vault decrypt file,然后输入解密密码即可对加密文件进行解密,下面对test1.yaml进行解密。

[lduan@server demo6]$ ansible-vault decrypt test1.yaml 
Vault password: 
Decryption successful
[lduan@server demo6]$ 

输入密码之后提示解密成功,下面查看test1.yaml的内容。

[lduan@server demo6]$ cat test1.yaml 
---
- hosts: server2
  gather_facts: false
  vars:
    aa: haha001
  tasks:
  - name: 打印一个变量
    debug: msg="{{aa}}"
[lduan@server demo6]$

已经可以正常查看到了。

34.5 使用密码文件

加密、解密、查看等操作都需要输入密码,如果把密码写入一个文件中,在执行ansible-vault命令时加上选项“--vault-id 密码文件”,即可不需要输入密码了。
先把密码写入aa.txt中,命令如下。

[lduan@server demo6]$ echo haha001 > aa.txt
[lduan@server demo6]$ cat aa.txt 
haha001
[lduan@server demo6]$

对文件test1.yaml进行加密,命令如下。

[lduan@server demo6]$ ansible-vault encrypt --vault-id aa.txt test1.yaml 
Encryption successful
[lduan@server demo6]$ 

这里显示加密成功,然后查看test1.yaml的内容,命令如下。

[lduan@server demo6]$ cat test1.yaml 
$ANSIBLE_VAULT;1.1;AES256
33333439333862383531303930353066643
    ...输出...
393264346638323965656235636161626563
[lduan@server demo6]$ 

可以看到,已经被加密了,下面通过ansible-vault view命令查看test1.yaml的内容,命令如下。

[lduan@server demo6]$ ansible-vault view --vault-id aa.txt test1.yaml 
---
- hosts: server2
  gather_facts: false
  vars:
    aa: haha001
  tasks:
  - name: 打印一个变量
    debug: msg="{{aa}}"
[lduan@server demo6]$

这里会直接读取密码文件中的密码,所以不需要我们再次输入密码。
加上--vault-id aa.txt选项运行playbook,命令如下。

[lduan@server demo6]$ansible-navigator -m stdout run --vault-id=aa.txt test1.yaml 

PLAY [server2] ***************************************  
    ...输出...
[lduan@server demo6]$

注意:此处--vault-id后面必须要有等号,空格会报错。此时playbook也可以正常运行了,解密test1.yaml,命令如下。

[lduan@server demo6]$ ansible-vault decrypt --vault-id aa.txt test1.yaml 
Decryption successful
[lduan@server demo6]$

可以看到,不需要输入密码,就解密完成了。
34.6 对单个字符串进行加密
可以不对整个文件加密,只加密某个字符串,命令如下。

[lduan@server demo6]$ cat test1.yaml 
---
- hosts: server2
  gather_facts: false
  vars:
    aa: haha001
  tasks:
  - name: 打印一个变量
    debug: msg="{{aa}}"
[lduan@server demo6]$

这里变量aa的值为redhat,是一个明文,可以单独对字符串haha001加密,命令如下。

[lduan@server demo6]$ ansible-vault encrypt_string --vault-id aa.txt haha001
!vault |
          $ANSIBLE_VAULT;1.1;AES256
          3037653...1623166
          ...输出...
          6466
Encryption successful
[lduan@server demo6]$

上面粗体字就是加密后的密码,因为输出太长这里用了省略号。
修改test1.yaml的内容,把haha001换成加密后的密文,内容如下。

[lduan@server demo6]$ cat test1.yaml
---
- hosts: server2
  gather_facts: false
  vars:
    aa: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          3037653...1623166
          ...输出...
          6466
  tasks:
  - name: 打印一个变量
    debug: msg="{{aa}}"
[lduan@server demo6]$

需要注意的是,aa后面的这个值不能引号引起来。
执行这个playbook,并指定密码文件,命令如下。

[lduan@server demo6]$ ansible-navigator -m stdout run --vault-id=aa.txt  test1.yaml 
PLAY [server2] *******************************
TASK [打印一个变量] *************************
ok: [server2] => {
    "msg": "haha001"
} 
    ...输出...
[lduan@server demo6]$ 

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

作业

提示:作业题在server上完成。

作业1:前面已经写了一个名称叫作chap29-1.yaml的playbook,请使用ansible-vault对其加密,密码为haha001.

作业2:请使用ansible-vault查看这个文件的内容。

作业3:请使用ansible-vault重新对chap29-1.yaml加密,密码改为haha002。

作业4:运行chap29-1.yaml这个playbook。

作业5:创建一个密码文件secret.txt,内容为haha002,然后使用这个密码文件解密chap29-1.yaml

相关新闻

发表回复

Please Login to Comment

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理

                                                                                                                                    RHCE9学习指南全部更新完成,点击阅读