我正在尝试使用 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 }}"