cloud-init manage_resolv_conf配置未生效,CentOS7 resolv.conf不符合预期
我来帮你一步步排查这个cloud-init配置不生效的问题——CentOS7下这种情况大多和NetworkManager的行为冲突有关,咱们慢慢拆解:
问题根源分析
你的cloud-init配置里已经明确设置了manage_resolv_conf: true,但最终resolv.conf里的内容却来自NetworkManager的自动生成(注释里的# Generated by NetworkManager就是关键线索),同时还保留了cloud-init的初始化注释,说明cloud-init可能执行了配置,但随后被NetworkManager覆盖了。另外nameserver 10.0.2.3通常是虚拟机平台(比如VirtualBox NAT)或云服务商的默认DHCP DNS地址。
具体排查步骤
1. 检查NetworkManager的接管配置
CentOS7默认NetworkManager会自动管理resolv.conf,这是导致cloud-init配置被覆盖的核心原因。你需要查看它的配置文件:
cat /etc/NetworkManager/NetworkManager.conf
重点看[main]段的配置:
- 如果存在
dns=auto(默认值),NetworkManager会根据DHCP获取的DNS自动生成resolv.conf - 如果没有
rc-manager=file,它不会尊重手动或cloud-init修改的resolv.conf文件
2. 查看cloud-init执行日志
确认cloud-init是否真的执行了resolv.conf的配置逻辑,查看日志:
grep -E 'resolv_conf|manage_resolv_conf' /var/log/cloud-init.log
如果日志里出现类似Skipping resolv_conf management或者报错信息,说明cloud-init的配置没有被正确识别;如果有Updating resolv.conf的记录,那基本可以确定是后续被NetworkManager覆盖了。
3. 检查cloud-init初始化状态
运行以下命令查看cloud-init各模块的执行状态:
cloud-init status --long
重点看resolv-conf模块是否显示success,如果是failed,根据提示排查具体错误。
解决方法
方法一:让NetworkManager放弃接管resolv.conf
编辑/etc/NetworkManager/NetworkManager.conf,在[main]段添加以下配置:
[main] dns=none rc-manager=file
然后重启NetworkManager服务:
systemctl restart NetworkManager
之后重新触发cloud-init初始化(可选,确保配置生效):
cloud-init clean && cloud-init init
这样cloud-init修改的resolv.conf就不会被NetworkManager覆盖了。
方法二:通过cloud-init的runcmd强制写入配置
如果暂时不想修改NetworkManager配置,可以在cloud-init的user-data里添加runcmd模块,直接覆盖resolv.conf:
#cloud-config manage_resolv_conf: true resolv_conf: nameservers: ['10.0.100.1'] searchdomains: - myawesomedomain.com domain: myawesomedomain.com options: rotate: true timeout: 1 runcmd: - echo "; Created by cloud-init on instance boot automatically, do not edit." > /etc/resolv.conf - echo "nameserver 10.0.100.1" >> /etc/resolv.conf - echo "search myawesomedomain.com" >> /etc/resolv.conf - echo "options rotate timeout:1" >> /etc/resolv.conf
不过这个方法是“治标”,因为NetworkManager在某些场景(比如网络重启)下还是可能覆盖配置,更推荐方法一。
内容的提问来源于stack exchange,提问作者vamfoom

