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

In Ansible, how do I store passed in json in a file?

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) 使用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 中会增加一层额外的保护。