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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:24:51