You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 13:41:23