Ansible:防止将变量的内容解释为 JSON/YAML

Ansible:防止将变量的内容解释为 JSON/YAML

我正在尝试使用 Ansible 来调整 ini 样式的配置文件,其中一个值被格式化为 JSON 数据。

我尝试了以下任务:

- name: Update configuration
  ini_file:
    dest: "{{ service_root }}/etc/production.ini"
    create: no
    section: app:main
    option: "{{ item.option }}"
    value: "{{ item.value }}"
    mode: '0640'
  notify: Reload Apache configuration
  with_list:
    - option: repoze.who.auth_tkt.secret
      value: "{{ secrets.auth_tkt }}"
    - option: oidc.client_config
      value: "{{ oidc_client_config | to_json }}"
  loop_control:
    label: "{{ item.option }}"

不幸的是,当我尝试时,oidc.client_config 的格式不符合预期:字符串位于单引号符号之间而不是双引号之间,并且错误值显示为而False不是false...

据我了解,当我使用该item.value变量时,Ansible 会认为它看起来像 JSON 并对其进行解码,然后使用 Python 的str()函数将其转换为字符串。

我尝试了一个单选项任务:

- name: Update configuration
  ini_file:
    dest: "{{ service_root }}/etc/production.ini"
    create: no
    section: app:main
    option: oidc.client_config
    value: "{{ oidc_client_config | to_json }}"
    mode: '0640'
  notify: Reload Apache configuration

这个方法很好用,我得到了配置文件中预期格式的值。因此,我可以拆分我的初始任务,然后它就可以正常工作了,但我对这个解决方案不满意。

有没有办法可以防止将item.value变量解释为 JSON/YAML?

不管怎样,我目前正在使用(相当古老的) Ansible 2.2。

答案1

在手册的高级语法部分(https://docs.ansible.com/ansible/latest/user_guide/playbooks_advanced_syntax.html)有一个关于不安全或原始字符串的部分。我的理解是,你可以将你的值标记为不安全,它将不会被解释:

value: !unsafe "{{ oidc_client_config | to_json }}"

相关内容