在Ansible中,如何将传入的json存储在文件中?

时间:2019-01-25 17:06:50

标签: ansible ansible-2.x

Ansible v2.6.3

我写了一个Ansible角色在AWS秘密管理器中创建秘密,我希望能够这样称呼它

$ ansible-playbook -i "localhost," secretsmanager.yml -e command=update -e service_name=test-svc -e text_box='{"secret":"value"}'

我首先将传入的json的值复制到

/tmp/{{ service_name }}.json

因此在此示例中,文件为

/tmp/test-svc.json

这是复制它的任务

- name: Setup up dest file
  set_fact:
    secret: "{{ service_name }}"
    dst_file: "/tmp/{{ service_name }}.json"

- name: "Copy {{ text_box }} to {{ dst_file }}"
  shell: |
     echo {{ text_box }} > {{ dst_file }}

但是,当我查看/tmp/test-svc.json时,它看起来像

$ cat /tmp/test-svc.json 
{secret:value}

我该怎么做,以便json文件正确?

{"secret":"value"}

由于我的用户会使用它,所以我希望他们能够正常编写json,即在json本身中不包含转义符。

1 个答案:

答案 0 :(得分:0)

至少有两种方法可以做到这一点:

1)使用Jinja2过滤器将输出强制为JSON

- name: "Copy {{ text_box }} to {{ dst_file }}"
  shell: |
    echo {{ text_box | to_json }} > {{ dst_file }}

2)使用Ansible copy模块。我认为这样做会更好,因为它可以让您更好地控制文件,并在这种情况下自动执行正确的操作。

- copy:
    dest: "{{ dst_file }}"
    content: "{{ text_box }}"

顺便说一句,如果您还没有读过Ansible Vault的文档,那是值得的。取决于您的环境,将密码作为参数传递给命令行并不十分安全。根据您的用例,您可能会发现将机密存储在Ansible Vault中会增加一层保护。