在编写playbook时,可能会涉及到一些敏感的数据,比如密码,当这些敏感数据以明文的方式存储在playbook中时,可能是不能被接受的,
我们可以使用”ansible-vault”命令,对敏感数据进行加密,我们可以对整个文件加密,也可以对某个字符串加密(也就是变量加密),那么具体操作是怎样的呢?我们一起来了解一下吧。

一、加密解密剧本

明文:

# cat intest1.yaml
---
 - hosts: web1
   gather_facts: no
   vars:
     test1: hello
     test2: ansible
     test3: test3
     test4: test4
   tasks:
   - debug:
       var: test1
   - name:
     include_tasks:
       file: /root/intest2.yaml
   - debug:
       var: test2

加密
交互式
# ansible-vault encrypt intest1.yaml

# cat /tmp/intest.yaml
$ANSIBLE_VAULT;1.1;AES256
65356534353962373663373366326365393234613232306563613361343265633831393439353135
6538626534313330663731666433613439666564633562370a633439333330643032313064636535
66376535613766626234313937346331633963333233326165326235653664336134653866393532
3662343430356564630a393734666330663838373837623061336263323462666139656465373266
35343539383736373336346331313233313231636335643634666535616465373230316336633661
37383062303837363734

运行加密的yaml文件
交互式

2.4版本之前
# ansible-playbook --ask-vault-pass intest1.yaml

2.4版本之后
# ansible-playbook --vault-id prompt intest1.yaml 

解密
交互式
# ansible-vault decrypt intest1.yaml

二、将密码保存在文件,指定这个文件进行加密、解密

指定密码文件加密
# echo 123 > pw1.txt

在2.4版本之前
# ansible-vault encrypt --vault-password-file pw1.txt intest1.yaml

在2.4版本之后
# ansible-vault encrypt --vault-id pw1.txt intest1.yaml

从ansible2.4版本开始,官方不再推荐使用”–vault-password-file”选项,官方开始推荐使用”–vault-id”选项代替”–vault-password-file”选项指定密码文件

指定密码文件执行加密后的yaml文件
# ansible-playbook --vault-id pw1.txt intest1.yaml

指定密码文件解密
# ansible-vault decrypt --vault-id pw1.txt intest1.yaml

当我们剧本里面引入include_tasks时的yaml文件也被加密了,必须同时提供两个密码文件

# vim intest2.yaml
---
- name: test3
  debug:
    msg: "{{ test3 }}"
- name: test4
  debug:
    msg: "{{ test4 }}"

加密
echo 123 > pw1.txt
echo 456 > pw2.txt

# ansible-vault encrypt --vault-id pw1.txt intest1.yaml
# ansible-vault encrypt --vault-id pw2.txt intest2.yaml

运行intest1.yaml需要提供两个密码·文件
# ansible-playbook --vault-id pw1.txt --vault-id pw2.txt intest1.yaml
交互式
# ansible-playbook --vault-id prompt --vault-id prompt intest1.yaml

使用不同的密码文件解密不同的yaml文件
# ansible-vault decrypt --vault-id pw1.txt --vault-id pw2.txt intest1.yaml intest2.yaml


三、"--vault-id"选项还有一个小功能,就是在加密文件时,给被加密的文件”做记号”

# ansible-vault encrypt --vault-id wsl@pw1.txt intest1.yaml
# cat intest1.yaml 
$ANSIBLE_VAULT;1.2;AES256;wsl
37646539623364333633383736386166663835323034363338323433333830376235303666366262
3962613363653933333434333761386666653830373166350a383762303936366663363839663733
32663066393239373731663638386163616231333631303966366437303537623662323664386432
6363363866383436330a306432383836376638643234626235613437303633656234383334306137
31363365626262663165613563366165376438613730613135366435306134373136643538383362
343534643236383239323663323666656

四、子命令

create子命令
create子命令的作用就是创建一个文件,等待你写入内容后使用ansible-vault进行加密
交互式
# ansible-vault create intest3.yaml
非交互式
# ansible-vault create --vault-id pw1.txt intest3.yaml

view子命令
使用view子命令,可以查看已经被加密过的文件的原内容,但是不会对文件本身进行还原操作,只是查看原内容。
交互式
# ansible-vault view intest3.yaml
非交互式
# ansible-vault view --vault-id pw1.txt intest3.yaml

edit子命令
使用edit子命令,可以直接修改被加密过的文件的原内容,使用edit子命令修改被加密过的文件内容的过程相当于:先解密、修改原内容,再加密
交互式
# ansible-vault edit intest3.yaml
非交互式
# ansible-vault edit --vault-id pw1.txt intest3.yaml

rekey子命令
使用rekey子命令,可以修改被加密文件的密码,比如,一开始我使用了123这个密码对intest3.yml文件进行了加密,现在,我想把密码换成456

交互式
# ansible-vault rekey intest3.yaml
原密码
新的密码
再次输入新的密码

非交互式
# ansible-vault rekey --vault-id pw2.txt --new-vault-id pw1.txt intest3.yaml