我使用以下结构将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/vault
和host_vars/host2/vault
,但将来也会匹配任何其他 - 请注意,如果将来有一个更复杂的文件夹层次结构,
host_vars/*/vault
将只匹配一个文件夹级别(例如,它不匹配host_vars/level1/host1/vault
(,但可以使用一个双星号(实际名称为globstar(实现多个文件夹级别:host_vars/**/vault
,将匹配host_vars/host1/vault
和host_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.com
和stackoverflow.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