一、啥是Ansible Vault

咱先说说Ansible Vault是个啥。简单来讲,它就是Ansible里用来加密敏感数据的工具。在咱们用Ansible写Playbook的时候,经常会用到一些密码、密钥之类的敏感信息。要是把这些信息明文放在Playbook里,那可太不安全了,万一被别人看到,那麻烦可就大了。有了Ansible Vault,咱们就能把这些敏感数据加密起来,只有知道密码的人才能解密使用。

比如说,咱们有个Playbook要连接到远程服务器,需要用到服务器的密码。如果直接把密码写在Playbook里,就像这样:

# 技术栈:YAML
- name: Connect to remote server
  hosts: remote_server
  vars:
    server_password: "plaintext_password"  # 这里直接写明文密码,不安全
  tasks:
    - name: Execute command on remote server
      command: ls -l
      become: true
      become_password: "{{ server_password }}"

这多危险啊,要是别人拿到这个Playbook,密码就泄露了。用Ansible Vault加密后,情况就不一样了。

二、怎么创建加密文件

1. 创建新的加密文件

要创建一个新的加密文件,咱们可以用下面这个命令:

# 技术栈:Shell
ansible-vault create secret.yml

执行这个命令后,它会让你输入一个密码,这个密码就是用来加密和解密文件的。输完密码,就会打开一个文本编辑器,你可以在里面写你要加密的内容。比如:

# 技术栈:YAML
# 这是一个加密文件,存储数据库的用户名和密码
db_username: "admin"
db_password: "super_secret_password"

保存退出后,这个文件就被加密了。

2. 加密已有的文件

要是已经有一个文件,想把它加密,也很简单:

# 技术栈:Shell
ansible-vault encrypt existing_file.yml

输入密码后,这个文件就被加密了。以后再打开这个文件,看到的就是一堆乱码,只有用正确的密码解密后才能看到里面的内容。

三、怎么解密和编辑加密文件

1. 解密文件

如果需要查看或修改加密文件的内容,就得先解密。可以用这个命令:

# 技术栈:Shell
ansible-vault decrypt secret.yml

输入密码后,文件就被解密了,又能看到明文内容了。

2. 编辑加密文件

要是想直接编辑加密文件,不用先解密再编辑,也有办法:

# 技术栈:Shell
ansible-vault edit secret.yml

执行这个命令后,会让你输入密码,输入正确密码后,就会打开文本编辑器,你可以直接在里面修改内容。修改完保存退出,文件会自动重新加密。

四、在Playbook里使用加密数据

1. 引用加密文件

在Playbook里引用加密文件很简单。比如,前面咱们创建了一个加密的secret.yml文件,里面存了数据库的用户名和密码。在Playbook里可以这样引用:

# 技术栈:YAML
- name: Use encrypted data in playbook
  hosts: localhost
  vars_files:
    - secret.yml  # 引用加密文件
  tasks:
    - name: Print database username and password
      debug:
        msg: "Database username: {{ db_username }}, password: {{ db_password }}"

执行这个Playbook的时候,需要提供加密文件的密码。可以用--ask-vault-pass参数:

# 技术栈:Shell
ansible-playbook playbook.yml --ask-vault-pass

输入密码后,Playbook就能正常运行,并且能正确读取加密文件里的数据。

2. 加密单个变量

除了加密整个文件,还可以加密单个变量。比如:

# 技术栈:Shell
ansible-vault encrypt_string "super_secret_password" --name 'db_password'

这个命令会把super_secret_password加密,并且给它起个名字叫db_password。加密后的内容可以直接复制到Playbook里:

# 技术栈:YAML
- name: Use encrypted variable in playbook
  hosts: localhost
  vars:
    db_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          33373063323466343432623837363036333833333637343634343336373031303436343437383338
          323233323231333132323433313235323632373834303531343631343630333333340a3533343331
          36343433313530373333333333323432363337363736363331343232363634343333333335373430
          3431343330313335330a363131353435333238333133313136343436313032333436363136353334
          333336333734323733
  tasks:
    - name: Print encrypted variable
      debug:
        msg: "Database password: {{ db_password }}"

执行这个Playbook的时候,同样需要提供密码。

五、应用场景

1. 生产环境部署

在生产环境里,服务器的登录密码、数据库的连接密码等都是非常敏感的信息。用Ansible Vault加密这些信息后,在部署过程中就能保证数据的安全性。比如,要在多台服务器上部署一个应用,需要连接到数据库,就可以把数据库的用户名和密码加密存储,然后在Playbook里引用。

2. 团队协作

在团队开发中,不同的成员可能会有不同的权限。用Ansible Vault加密敏感数据后,可以只把解密密码告诉有需要的成员,这样能提高数据的安全性,也能更好地管理权限。

六、技术优缺点

1. 优点

  • 安全性高:加密后的数据只有知道密码的人才能解密,大大提高了数据的安全性。
  • 使用方便:Ansible Vault提供了简单的命令来创建、加密、解密和编辑加密文件,使用起来很方便。
  • 与Ansible集成好:可以直接在Playbook里引用加密文件和变量,无缝集成到Ansible的工作流程中。

2. 缺点

  • 密码管理麻烦:需要妥善管理加密密码,如果密码丢失,加密的数据就无法解密了。
  • 性能影响:加密和解密操作会消耗一定的系统资源,在处理大量数据时可能会影响性能。

七、注意事项

1. 密码安全

加密密码一定要妥善保管,不能泄露。可以把密码存放在安全的地方,比如密码管理器里。另外,定期更换密码也是个好习惯。

2. 备份加密文件

在对加密文件进行修改或操作之前,最好先备份一份。万一操作失误,还能恢复到之前的状态。

3. 环境一致性

在不同的环境里使用Ansible Vault时,要保证加密密码的一致性。否则,可能会导致解密失败。

八、文章总结

通过使用Ansible Vault,咱们可以很方便地加密Playbook里的敏感数据,像密码、密钥之类的。它能大大提高数据的安全性,避免敏感信息泄露。咱们可以创建加密文件,也可以加密单个变量,还能在Playbook里直接引用这些加密数据。不过,在使用过程中要注意密码的安全管理,定期备份加密文件,保证不同环境里密码的一致性。总之,Ansible Vault是个非常实用的工具,能让咱们的Ansible Playbook更加安全可靠。