如何使用Ansible修改exim.json参数且不破坏文件格式?
问题:Ansible修改JSON文件时如何避免破坏缩进格式?
原JSON文件内容(路径:/var/webuzo/conf/exim/exim.json):
{ "general": { "max_hourly_email": 0, "max_notify_email": 0, "enable_mail_retry": "1", "mail_retry": 15, "enable_roundcube": "1", "default_quota_val": 32768, "default_quota": "1", "eximmailtrap": "1", "no_local_emailing": "0", "dkim_selector": "x", "disable_ipv6": "0", "custom_mailips": "0", "message_linelength_limit": 2048 } }
尝试用lineinfile模块修改max_hourly_email的值,代码如下:
- name: Set Max hourly emails per domain lineinfile: path: /var/webuzo/conf/exim/exim.json regexp: 'max_hourly_email' line: ' "max_hourly_email": 200,' state: present
修改后缩进格式被破坏,结果如下:
{ "general": { "max_hourly_email": 200, "max_notify_email": 0, "enable_mail_retry": "1", "mail_retry": 15, "enable_roundcube": "1", "default_quota_val": 32768, "default_quota": "1", "eximmailtrap": "1", "no_local_emailing": "0", "dkim_selector": "x", "disable_ipv6": "0", "custom_mailips": "0", "message_linelength_limit": 2048 } }
如何用Ansible修改这些值且不破坏文件结构?
解决方案
别用lineinfile处理JSON文件,这类基于行的模块没法保证JSON的结构和缩进一致性。推荐用专门处理JSON的community.general.json_file模块,它会解析JSON内容,修改指定键值后重新格式化输出,完美保留原文件的缩进和结构。
方法1:使用community.general.json_file模块
首先确保安装了community.general集合(没装的话执行ansible-galaxy collection install community.general安装)。
示例Playbook代码:
- name: 更新exim.json配置值 community.general.json_file: path: /var/webuzo/conf/exim/exim.json state: present pretty: true indent: 4 # 和原文件保持一致的4空格缩进 key: "general.{{ item.key }}" value: "{{ item.value }}" loop: - { key: "max_hourly_email", value: 200 } - { key: "max_notify_email", value: 100 } # 替换成你需要的目标值
方法2:使用replace模块(备选方案)
如果没法安装额外集合,可以用replace模块,精确匹配原行的缩进和格式,保证替换后的行和原格式完全一致:
- name: 设置max_hourly_email的值 ansible.builtin.replace: path: /var/webuzo/conf/exim/exim.json regexp: '^ "max_hourly_email": 0,' replace: ' "max_hourly_email": 200,' - name: 设置max_notify_email的值 ansible.builtin.replace: path: /var/webuzo/conf/exim/exim.json regexp: '^ "max_notify_email": 0,' replace: ' "max_notify_email": 100,'
注意:这种方法依赖原文件的缩进格式完全固定,如果原文件缩进有变化,正则就会失效,可靠性不如json_file模块。
补充说明
json_file模块会自动处理JSON的合法性,哪怕原文件有其他格式调整,也能输出结构正确、格式统一的JSON。pretty: true参数让输出的JSON带格式化缩进,indent:4指定用4个空格缩进,和原文件保持一致。
内容的提问来源于stack exchange,提问作者Sihabul
相关产品推荐
相关产品推荐

