有没有人有一个使用ansible-vault解密和上传文件的例子 .
我正在考虑在源代码管理中保持我的ssl证书加密 .
看起来像下面的东西应该工作 .
---
- name: upload ssl crt
copy: src=../../vault/encrypted.crt dest=/usr/local/etc/ssl/domain.crt
有没有人有一个使用ansible-vault解密和上传文件的例子 .
我正在考虑在源代码管理中保持我的ssl证书加密 .
看起来像下面的东西应该工作 .
---
- name: upload ssl crt
copy: src=../../vault/encrypted.crt dest=/usr/local/etc/ssl/domain.crt
10 回答
那不行 . 您将获得的是
encrypted.crt
(使用Ansible Vault),字面意思是domain.crt
您需要做的是使您的Playbook成为“Vault”的一部分,并添加包含您的证书内容的变量 . 像这样的东西:
您也可以选择使用Ansible Vault将
mycert
变量放在单独的变量文件中 .从Ansible 2.1.x开始,复制模块现在无缝地执行此操作 . 只需使用Ansible Vault加密文件,然后在文件上发出复制任务 .
(作为参考,这里增加了这个功能:https://github.com/ansible/ansible/pull/15417)
在复制模块中有a feature request本地支持它 . 但是在实现之前,这里是解决方法(类似于@ dave1010的答案,但为了完整性重复公共部分):
创建一个用ansible vault加密的
secrets.yml
文件,其中包含您的秘密,例如:在您的剧本中,包含它:
然后你可以在任务中使用变量:
但是,如果您尝试复制的文件是二进制文件,则不起作用 . 在这种情况下,您需要首先使用base64编码内容:
然后将base64编码的值放在
secrets.yml
文件中,例如:然后,您可以分两步创建远程文件:
请注意,您可以删除远程主机上的临时
cert.b64
文件 . 但是重新运行该剧本将重新创建它,而不是跳过这个任务 . 所以,我宁愿把它留在那里 .UPDATE :此功能已在Ansible 2.1中实施 .
我使用了一个模板和
vars_file
来做到这一点:在您的顶级剧本中:
在任务中:
在模板(
etc-ssl-private-site.key
)中,您只需要变量:在加密的
secretvars.yml
中(用ansible-vault
加密):更新:截至 April 2016 我的Github PR已合并,可在Ansible 2.1及更高版本中使用 . 在公关合并之前,以下是临时解决方案 .
想要做同样的事情我创建了一个动作插件来实现该功能 . 这可以通过github获得 . 该插件正是ansible随附的复制动作插件,但支持保险库解密 .
你可以像这样使用它:
如果secret.txt被加密(并提供了保管库密码),那么它将被解密和复制 .
我想,你有一个更简单的方法来做到这一点 .
如果您以某种格式在一个文件中使用证书密钥(如pkcs12或只是连接),则可以使用泛型
openssl
(或gpg
,或其他)加密 . 它看起来像这样:之后,您只需将encrypted.aes复制到远程主机并就地解密:
如果您有pem或der格式的单独密钥文件,则可以使用
在“复制”模块已扩展为自动解密文件库文件之前,这是一个简单的解决方法:
当stdout不是tty时,
ansible-vault view <file>
会在不调用寻呼机的情况下将明文打印到stdout .结合“管道”查找,此行为可与保险库密码文件一起使用,以提供给副本模块的“内容”选项:
Ansible 2.5将参数
decrypt
添加到copy
模块 .例如,如果您使用以下内容加密文件:
现在你可以使用copy decrypt :
您还可以使用local_action临时解密您的文件作为playbook的一部分:
1上面的@utapyngo建议的
copy: content= {{ private_ssl_key }}"
方法 .如果你把你的密钥分发作为一个角色,而不仅仅是在一个剧本中(为什么不呢,因为密钥分发是你以后可能需要的东西),请记住以下:
你只为你的vars获得一个文件,所以所有的密钥(比如你有不同的基于主机或其他的捆绑包)必须在
<role>/vars/main.yml
中一起使用此
<role>/vars/main.yml
中的变量是可引用的,没有任何路径(这很好!)请记住,只要您想要变量的内容,就需要引用AND curlies,即
"{{ your_variable_name }}"
如果要为每个任务复制多个文件,则需要
with_items:
循环如果你想保持敏感数据,你已经经历了很多麻烦,首先在屏幕外进行加密,一个巧妙的诀窍是接下来你的字典中的关键变量;这样,在你的
with_items
循环中,你正在向它提供字典键而不是变量本身的内容 .