在保留缩进的同时使用Ansible设置JSON文件

在保留缩进的同时使用Ansible设置JSON文件,json,ansible,Json,Ansible,我想用Ansible提供一个JSON文件。此文件的内容是我的Ansible剧本中的一个变量 对于我的用例来说非常重要:我需要缩进和换行符与变量中的缩进和换行符完全相同 变量如下所示: my_ansible_var: { "foobar": { "foo": "bar" }, "barfoo": { "bar": "foo"

我想用Ansible提供一个JSON文件。此文件的内容是我的Ansible剧本中的一个变量

对于我的用例来说非常重要:我需要缩进和换行符与变量中的缩进和换行符完全相同

变量如下所示:

my_ansible_var: 
  {
    "foobar": {
      "foo": "bar"
    },
    "barfoo": {
      "bar": "foo"
    }
  }
在我的剧本中是这样使用的:

- name: drop the gitlab-secrets.json file
  copy: 
    content: "{{ my_ansible_var }}"
    dest: "/some/where/file.json"
问题:播放此任务时,我的文件已设置为“一行”文件:

我尝试了其他几种方法:

  • 检索我的JSON内容的
    base64
    值,并使用
    内容:“{{my_ansible_var | b64decode}}”
    :最后出现相同的问题
  • 我试着玩:没有一个方块指示器能帮我解决这个问题
  • 我试着将like
    添加到_json
    添加到_nice_json(indent=2)
    :这里没有运气了
问题: 如何在Ansible中设置JSON文件,同时保持所需的精确缩进

  • 在您的示例中,
    my_ansible\u var
    是一个dict。如果您不需要在剧本中访问它的键(例如,
    my_ansible\u var.foobar.foo
    ),只希望它作为您的
    copy
    任务的JSON字符串,请强制它为字符串

  • Ansible模板引擎中有类型检测功能,所以若您向它提供类似dict或类似列表的字符串,它将被计算到对象中。看一些细节

  • 这种结构适用于您的情况:

    ---
    - hosts: localhost
      gather_facts: no
      vars:
        my_ansible_var: |
          {
            "foobar": {
              "foo": "bar"
            },
            "barfoo": {
              "bar": "foo"
            }
          }
      tasks:
        - copy:
            content: "{{ my_ansible_var | string }}"
            dest: /tmp/out.json
    

    请注意
    my_ansible_var
    定义中的竖条和
    内容中的
    字符串
    过滤器。

    谢谢,它按预期工作。我误解了我声明/使用变量的方式
    ---
    - hosts: localhost
      gather_facts: no
      vars:
        my_ansible_var: |
          {
            "foobar": {
              "foo": "bar"
            },
            "barfoo": {
              "bar": "foo"
            }
          }
      tasks:
        - copy:
            content: "{{ my_ansible_var | string }}"
            dest: /tmp/out.json