Python 重新设置单独加密的ansible vault变量的密钥?

Python 重新设置单独加密的ansible vault变量的密钥?,python,ansible,ansible-vault,Python,Ansible,Ansible Vault,从阅读 不能为加密的变量重新设置密钥 例如,如果这是group_vars/all.yaml的内容,我想为所有加密变量重新设置密钥 key\u选项卡:!拱顶| $ANSIBLE_保险库;1.1;AES256 30333939663734636530386263663437343431353539643366633534366239643763326138653232 3562383132623937346138613833396563653038646165300A6230613630636631

从阅读

不能为加密的变量重新设置密钥

例如,如果这是
group_vars/all.yaml
的内容,我想为所有加密变量重新设置密钥

key\u选项卡:!拱顶|
$ANSIBLE_保险库;1.1;AES256
30333939663734636530386263663437343431353539643366633534366239643763326138653232
3562383132623937346138613833396563653038646165300A62306136306366313237393031
66623133393239376366383235353332366336386532643637343438653634633734346639636334
3633363032376339340a663531346633623466643163353638303534313937663931633962383637
3637
证书:
-文件:client.cert
密码:!拱顶|
$ANSIBLE_保险库;1.1;AES256
35626163653930386265393064326330393433343763626534373330393432373231633365656534
6237626631326633339633137333356531623239653161370A356666326631663565396633396139
32303962343064343530383364616235343130373935313161353135613539653061363735336337
3636633036313565640A6637366130653962336433653564373161393431636661666134643761
3639
我曾尝试使用一些bash命令来实现这一点,但缩进会使它变得复杂


有没有一种自动化的方法来完成这个重键?

根据Gaël的建议,我创建了一个python工具,它使用ansible libs来完成重键

它保留缩进并在适当的位置更新文件。适用于vault变量和常规vault文件

脚本

#/usr/bin/env蟒蛇3
导入系统
进口稀土
从tempfile导入NamedTemporaryFile
从ansible.parsing.vault导入vault编辑器、vault库库、vault机密
从ansible.constants导入默认\u VAULT\u标识
def密钥(内容、旧密钥、新密钥):
vault\u regex=re.compile(r'(^(\s*)\$ANSIBLE\u vault\s*\n(\s*\w+\n)*'),re.MULTILINE)
vault={match[0]:在vault_regex.findall(content)}中匹配[1]
对于旧vault,vault中的缩进。items():
将NamedTemporaryFile(mode='w',delete=False)作为f:
f、 写入(旧vault.replace(缩进“”)
VAULT编辑器(VaultLib([(默认的\u VAULT\u标识,旧的\u机密)])。重新设置\u文件(f.name,新的\u机密)
将open(f.name)作为f:
新建拱顶=缩进+缩进.join(f.readlines())
content=content.replace(旧库、新库)
返回内容
def main(旧密码、新密码、文件):
对于文件中的文件名:
打开(文件名)为f时:
content=f.read()
打开(文件名为“w”)作为f:
f、 写入(重新输入(内容、Vault密码(旧密码.encode())、Vault密码(新密码.encode()))
main(sys.argv[1],sys.argv[2],sys.argv[3:]
用法

/rekey.py我的旧密码我的新密码$(find.-type f-name“*.yaml”)other-file.vault
解释

对于每个输入文件:

  • 读取输入文件并提取与vault正则表达式匹配的序列
  • 将提取的Vault保存到临时文件
  • 重新键入临时文件
  • 使用重新设置密钥的文件的内容在输入文件中进行替换

  • 您应该在Python中使用ansible libs来实现这一点,请参见此功能(或等效功能)实际上应该集成到ansible vault中,因为在许多公司中密钥轮换是强制性的,并且完整文件加密并不总是最佳解决方案。