Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates Ansible取消vault并为文件创建模板_Templates_Ansible_Jinja2_Ansible Playbook_Ansible Vault - Fatal编程技术网

Templates Ansible取消vault并为文件创建模板

Templates Ansible取消vault并为文件创建模板,templates,ansible,jinja2,ansible-playbook,ansible-vault,Templates,Ansible,Jinja2,Ansible Playbook,Ansible Vault,我在本地机器上有一个文件,我想上传到远程服务器,其中包含我不想在VCS中公开的机密信息。它还有一些我需要动态替换的文本(目前作为Jinja2占位符“{}”) 如果使用“复制”模块,则在上载文件时该文件将取消保险存储,但显然占位符已被替换 如果我使用模板模块,那么它不会取消vault文件,因此它将以加密格式上载(也不会替换占位符,因为它们会被加密弄糊涂) 如何将文件(使用ansible)模板化和取消保险存储到远程服务器?如评论中所述,您可以在变量中设置机密,并在设置期间将其呈现到模板中,但如果出于

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

如果使用“复制”模块,则在上载文件时该文件将取消保险存储,但显然占位符已被替换

如果我使用模板模块,那么它不会取消vault文件,因此它将以加密格式上载(也不会替换占位符,因为它们会被加密弄糊涂)


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

如评论中所述,您可以在变量中设置机密,并在设置期间将其呈现到模板中,但如果出于某种原因,您希望将整个模板保密,也有一些解决方法可以做到这一点

处理加密模板 作为一种解决方法,您可以临时在本地解密模板,并在卷展后使用
local\u 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
请注意,当:False时,
已更改。为了使用ansible角色运行幂等性测试,这一点很重要,否则每次运行剧本时,都会发出更改的信号。
在
group\u vars/all.yml
中,您可以设置一个全局解密命令以供重用,例如,作为
查看加密的\u文件\u cmd

组变量/all.yml

处理加密的静态文件 单向:作为模板

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

yml变种

模板/private_key.j2

tasks/main.yml

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

另一种方法是使用
查找
模块和
管道
复制
模块中设置
内容
属性-这样您就不需要额外的变量

---

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

在静态文件的情况下,还有另一种类似的可能性。通过使用
copy
而不是
template
无需额外的文件

使用
vars.yml
: 在vault中存储加密的vars.yml:

任务代码:

- name: Save encrypted template
  copy: 
    content: "{{ encrypted_content }}"
    dest: /path/to/destination
- name: Read encrypted variable file
  include_vars: encrypted.yml
  no_log: true

- name: Save encrypted template
  copy: 
    content: "{{ encrypted_content }}"
    dest: /path/to/destination
使用单独的YAML文件 您还可以将加密的模板代码存储在另一个YAML文件中。这很有用,因为不应加密wenn
vars.yml
。例如,
vars/encrypted.yml
可能是:

任务代码:

- name: Save encrypted template
  copy: 
    content: "{{ encrypted_content }}"
    dest: /path/to/destination
- name: Read encrypted variable file
  include_vars: encrypted.yml
  no_log: true

- name: Save encrypted template
  copy: 
    content: "{{ encrypted_content }}"
    dest: /path/to/destination

现在Ansible 2.4支持复制模块上的解密选项:

简而言之,使用
copy
模块和
Ansible vault

下面是将名为
hello.vault
的本地加密文件复制到远程服务器上的
hello.txt
的完整示例。它的明确内容是
WORLD
,加密密钥是
1234

  • 创建vault文件
    您好。vault
  • $ansible vault创建hello.vault
    新Vault密码:1234
    确认新Vault密码:1234
    ##然后输入您的秘密并退出编辑器##
    世界
    $cat hello.vault
    $ANSIBLE_保险库;1.1;AES256
    39653932393834613339393036613931393636663638636331323034653036326237373061666139
    6434373635373065613135633866333733356532616635640A6637393066393265353366376138
    39666462343737653030346463326464333937333161306561333062663164313162376564663262
    353339383963346630A66663130336338326561613736376564623465613165656531366331366664
    6436
    
  • 创建密码文件,例如
    vault.key
    ,如下所示
  • 使用
    copy
    模块将vault文件传输到
    webserver
    (在资源清册中定义)上的明文

  • 为什么不为你想保密的部分创建变量,然后在保险存储秘密变量后使用模板模块?@ydaetskcoR我认为在某些边缘情况下,你可能不想公开配置文件,而将整个配置模板放入秘密变量字符串中是很难维护的。
    encrypted_content: |
      foo = {{ bar }}
      password = abcabc
      ...
    
    - name: Save encrypted template
      copy: 
        content: "{{ encrypted_content }}"
        dest: /path/to/destination
    
    encrypted_content: |
      foo = {{ bar }}
      password = abcabc
      ...
    
    - name: Read encrypted variable file
      include_vars: encrypted.yml
      no_log: true
    
    - name: Save encrypted template
      copy: 
        content: "{{ encrypted_content }}"
        dest: /path/to/destination
    
    1234
    
    ansible webserver -i inventory --vault-password-file=vault.key \
            -m copy -a "src=hello.vault dest=hello.txt"
    
    ansible webserver -i inventory -m command -a "cat hello.txt"
    WORLD