如何用Ansible单模块实现/etc/hosts的新增与过时条目更新?
解决Ansible lineinfile更新/etc/hosts时旧IP条目残留问题
直接给lineinfile模块添加regexp参数即可解决,无需组合其他模块。修改后的playbook如下:
- ansible.builtin.lineinfile: path: /etc/hosts line: "{{ hostvars[item].ansible_all_ipv4_addresses.0 }} {{ hostvars[item].ansible_hostname }} {{ hostvars[item].ansible_hostname }}" regexp: ".*{{ hostvars[item].ansible_hostname }}.*" loop: "{{ groups['web'] }}"
原理说明
原来的写法没有指定匹配规则,lineinfile只会查找完全匹配的行。当服务器IP更新后,旧行的IP与新行不一致,模块会判定为新条目直接添加,导致重复。
添加regexp: ".*{{ hostvars[item].ansible_hostname }}.*"后,模块会匹配所有包含目标主机名的行,不管前面的IP是什么。执行时会用新的IP+主机名条目替换掉所有匹配到的旧行,确保每个主机名只保留最新的IP记录。
验证效果
执行修改后的playbook后,原有的旧IP条目会被自动替换,/etc/hosts中不会再出现同一主机名的重复条目。
内容的提问来源于stack exchange,提问作者N. J
相关产品推荐
相关产品推荐

