templates - Ansible 取消保管和模板化文件

标签 templates ansible jinja2 ansible-playbook ansible-vault

我的本地计算机上有一个文件,我想上传到远程服务器,它包含我不想在我的 VCS 中公开的 secret 信息。它还有一些我需要在其中动态替换的文本(目前作为 Jinja2 占位符“{{}}”)。

如果我使用复制模块,那么当我上传文件时,文件是未保存的,但显然占位符已被替换。

如果我使用模板模块,那么它不会取消保管文件,因此它会以其加密格式上传(并且也不会替换占位符,因为它们被加密混淆了)。

如何将文件(使用 ansible)模板化和取消保管到远程服务器?

最佳答案

正如评论中已经提到的,您可以在变量中设置您的 secret 并在提供期间将它们呈现到模板中,但如果由于某种原因您想将整个模板保密,也有一些解决方法可以做到这一点。

处理加密模板

作为一种解决方法,您可以在本地临时解密模板,并在推出后使用 local_action 删除解密的文件。模块。
假设您的加密模板位于 template.enc在你的角色templates目录。

---

- name: Decrypt template
  local_action: "shell {{ view_encrypted_file_cmd }} {{ role_path }}/templates/template.enc > {{ role_path }}/templates/template"
  changed_when: False

- name: Deploy template
  template:
    src=templates/template
    dest=/home/user/file

- name: Remove decrypted template
  local_action: "file path={{ role_path }}/templates/template state=absent"
  changed_when: False

请注意 changed_when: False .这对于使用您的 ansible 角色运行幂等性测试非常重要 - 否则每次运行 playbook 时都会发出更改信号。
group_vars/all.yml您可以设置一个全局解密命令以供重用,例如 view_encrypted_file_cmd .

group_vars/all.yml
---

view_encrypted_file_cmd: "ansible-vault --vault-password-file {{ lookup('env', 'ANSIBLE_VAULT_PASSWORD_FILE') }} view"

处理加密的静态文件

一种方式:作为模板

您可以将 secret 静态文件的内容(例如,私钥)设置为 ansible 中的变量,并将其设置为模板。

变量.yml
---

my_private_key: |
  YOUR KEY
  asfdlsafkj
  asdlkfjasf

模板/private_key.j2
{{ private_key }}

任务/main.yml
---

template: 
  src=templates/private_key.j2
  dest=/home/user/.ssh/id_rsa
  vars:
    private_key: "{{ my_private_key }}"

另一种方式:通过查找管道

另一种方法是使用 lookup带有 pipe 的模块设置content copy 内的属性(property)模块 - 这样您就不需要额外的变量。
---

- copy:
    dest=/your/dest
    content=lookup('pipe', 'VAULT_PASSWORD_FILE=path/to/pass_file ansible-vault view path/to/file.enc')

关于templates - Ansible 取消保管和模板化文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37682928/

相关文章:

ansible - Jinja2 命名空间奇怪的结果

c++ - 如何处理在 C++ 中已知模板参数数量的虚拟模板函数?

c++ - 将运行时类型映射到并行类层次结构......使用模板

c++ - 如何使 std::make_pair 可与 std::bind* 一起使用?

c++ - 奇怪的类型转换产品

ssh - 通过 ssh 运行 Ansible 单个命令

ssh - Ansible: "sudo: a password is required\r\n"

ansible - 如何定义登录用户并成为剧本中的root

python - 如何使用带有多个参数的 Flask Jinja2 url_for

backbone.js - 渲染字段时Wtforms转义包含自变量js模板的value参数