使用ansible vault一次加密多个文件



我使用以下结构将host_vars分离为明文和加密

ansible
├── ansible.cfg
├── host_vars
│   ├── host1
│   │   ├── vars
│   │   └── vault
│   └── host2
│       ├── vars
│       └── vault
├── inventory
├── site.yaml
└── vars
└── ansible_vars.yaml

有没有一种方法,使用ansible-vault来加密两个名为vault的文件,或者我必须一个接一个地加密它们?

只是问,因为还有更多,例如在group_vars等的未来目录中

我知道这是

ansible-vault encrypt host_vars/host1/vault host_vars/host2/vault

只是询问是否有更优雅/快速的解决方案

shell展开提供了很多可能性。

这里有两个在你的情况下会很有趣:

  • 星号*展开,用作通配符。这意味着host_vars/*/vault将同时匹配host_vars/host1/vaulthost_vars/host2/vault,但将来也会匹配任何其他
  • 请注意,如果将来有一个更复杂的文件夹层次结构,host_vars/*/vault将只匹配一个文件夹级别(例如,它不匹配host_vars/level1/host1/vault(,但可以使用一个双星号(实际名称为globstar(实现多个文件夹级别:host_vars/**/vault,将匹配host_vars/host1/vaulthost_vars/level1/host1/vault
  • 另一方面,大括号扩展提供了一组更细粒度的可能性,例如,如果我在RedHat[1..5]Ubuntu[1..5]Debian[1..5]等发行版之后有主机名,那么我可以通过host_vars/{Ubuntu*,RedHat*}/vault仅针对Debian和RedHat
    或者只通过host_vars/{Ubuntu{1..3},RedHat{1..3}}/vault瞄准其中的三个第一个,或者通过host_vars/*{1..3}/vault瞄准其中的这三个第一

作为一个更实际的例子,如果您在哪里通过Ansible处理SE,并且希望加密*.stackexchange.comstackoverflow.com的文件,而不是superuser.com或任何其他Q&A有一个特定的域名,假设主机被命名为他们的DNS名称,你可以做

ansible-vault host_vars/{stackoverflow.com,*.stackexchange.com}/vault

我将加入我的快速超简单shell脚本,该脚本适用于我的简单用例。当然可以改进,但我认为这是一个很好的起点。您也可以通过--vault-password-file参数使用机密文件。

#!/bin/sh
echo "Choose the option:"
echo "(d) Decrypt all Ansible vault files"
echo "(e) Encrypt all Ansible vault files"
read option
function decrypt {
ansible-vault decrypt --ask-vault-pass 
ansible/*/environments/development/group_vars/*/vault.yaml 
ansible/*/environments/development/host_vars/*/vault.yaml
}
function encrypt {
ansible-vault encrypt --ask-vault-pass 
ansible/*/environments/development/group_vars/*/vault.yaml 
ansible/*/environments/development/host_vars/*/vault.yaml
}
case $option in
d)
decrypt
;;
e)
encrypt
break
;;
*)
echo "Wrong option"
;;
esac

相关内容

  • 没有找到相关文章