Ansible lineinfile模块重复添加/etc/exports客户端IP条目问题咨询
解决方案
根因说明
原有逻辑未校验当前客户端IP是否已经存在于对应共享目录的exports条目中,只要匹配到共享目录行就会无脑追加IP配置,多次运行就会出现重复添加的问题。
修复后完整配置
直接替换你的task.yml全部内容即可:
--- - name: 确保/etc/exports文件存在 ansible.builtin.file: path: /etc/exports owner: root group: root mode: '0644' state: touch changed_when: False - name: 校验{{ client_ip }}是否已经添加到{{ volume }}的共享配置中 ansible.builtin.command: grep -E "^{{ volume }}\s+.*{{ client_ip | regex_escape }}\(rw,sync,no_root_squash,no_subtree_check\)" /etc/exports register: ip_exists_check failed_when: ip_exists_check.rc not in [0,1] changed_when: False - name: 向已存在的{{ volume }}共享条目追加{{ client_ip }}配置 ansible.builtin.lineinfile: path: "/etc/exports" regexp: '^{{ volume }}\s+(.*)$' line: '{{ volume }} \1 {{ client_ip }}(rw,sync,no_root_squash,no_subtree_check)' backrefs: true when: ip_exists_check.rc == 1 - name: 校验{{ volume }}的共享条目是否存在 ansible.builtin.command: grep -E "^{{ volume }}\s+" /etc/exports register: volume_exists_check failed_when: volume_exists_check.rc not in [0,1] changed_when: False - name: 新增{{ volume }}的共享条目并添加{{ client_ip }}配置 ansible.builtin.lineinfile: path: "/etc/exports" line: '{{ volume }} {{ client_ip }}(rw,sync,no_root_squash,no_subtree_check)' when: volume_exists_check.rc == 1
效果验证
- 首次运行:如果对应共享目录的配置行不存在,会自动创建新行;如果配置行已存在但未添加当前客户端IP,会正常追加IP配置
- 重复运行:如果当前客户端IP已经在配置行中,会直接跳过修改操作,不会出现重复追加的问题,完全满足幂等性要求
内容的提问来源于stack exchange,提问作者devilkin
相关产品推荐
相关产品推荐

