使用Ansible配置JSON文件,同时保留缩进

时间:2017-03-17 14:35:24

标签: json ansible

我想使用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"

问题:播放此任务时,我的文件已配置,但作为“单行”文件:

{ "foobar": { "foo": "bar" }, "barfoo": { "bar": "foo" } }

我尝试了其他几种方法:

  • 检索我的JSON内容的base64值,并使用content: "{{ my_ansible_var | b64decode }}":最后的同样问题
  • 我尝试使用YAML block indicator:没有一个块指示器帮助我解决了这个问题
  • 我尝试添加to_json,例如to_nice_json(indent=2) <section class="small-business-split-header-block"> <div class="wrapper"> <h1 class="small-business-header">Your calls<br />answered brilliantly</h1> <p class="small-business-sub-header">Our small business services ensure you capture every opportunity and make your business look bigger. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam sit amet semper ante. Ut vel odio.</p> </div><!--wrapper--> <div class="usp-bar"> <p class="usp-one active">Telephone Answering</p> <span><img src="http://svgshare.com/i/y4.svg" /></span> </div><!--usp-bar--> </section> <div class="usp-list cf"> <div class="usp active"> <a href="#"> <p>Need your own<br /><strong>dedicated PA?</strong></p> </a> </div><!--usp--> <div class="usp"> <a href="#"> <p>Looking for<br />an auto attendent?</p> </a> </div><!--usp--> <div class="usp"> <a href="#"> <p>Missing calls<br />on your mobile?</p> </a> </div><!--usp--> <div class="usp"> <a href="#"> <p>Looking for a<br />business number?</p> </a> </div><!--usp--> </div><!--usp-list--> :此处不再运气

问题:

如何在Ansible中提供JSON文件,同时保留我想要的精确缩进?

1 个答案:

答案 0 :(得分:2)

  1. 在您的示例中,my_ansible_var是一个词典。如果您不需要在您的剧本中访问其键(例如my_ansible_var.foobar.foo)并且只想将其作为copy任务的JSON字符串,请将其强制为字符串。

  2. Ansible模板引擎中有类型检测功能,因此如果您使用类似dict或类似列表的字符串来提供它,它将被评估为对象。查看一些详细信息here

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

    ---
    - 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定义中的竖线和| string表达式中的content过滤器。