ruamel.yaml写入配置时nameservers.addresses带引号如何解决
问题根因
你代码里两个问题导致输出不符合预期:
- 你将
nameservers.addresses字段赋值为自己拼接的f字符串f"[{dns}]",ruamel.yaml识别到该字段类型为字符串,序列化时会自动给字符串值包裹单引号,不会将其识别为YAML列表结构。 - 输入读取逻辑没有做去空处理,输入时如果直接回车、或者首尾带空格,就会写入空字符串,对应你看到的
- ''、to: ''这类无效配置。另外原代码存在多余缩进、缺失ruamel.yaml导入的语法问题。
修复方案
YAML语法中[xxx]格式的行内列表本质对应Python的list类型,不需要手动拼接方括号字符串,直接将DNS值存入Python列表传入即可。修复后的完整代码如下:
from pathlib import Path from ruamel.yaml import YAML eth_file = Path("/etc/netplan/01-network-manager-all.yaml") yml = YAML() # 配置短列表自动使用行内[]格式输出,匹配netplan的常规书写习惯 yml.default_flow_style = None data = yml.load(eth_file) eth = input("Enter interface name \n").strip() addr = input("Enter IP address and mask. e.g., 8.8.8.8/8 \n").strip() dns = input("Enter DNS \n").strip() rts = input("Enter routes -to \n").strip() rts1 = input("Enter routes via \n").strip() new_ether = {eth: dict( addresses=[addr], nameservers=dict(addresses=[dns]), routes=[dict(to=rts, via=rts1)] )} data['network']['ethernets'].update(new_ether) yml.dump(data, eth_file)
输出效果
运行后生成的对应配置段无多余单引号,符合预期:
addresses: - 192.168.1.10/24 nameservers: addresses: [2.3.4.5] routes: - to: default via: 192.168.1.1
内容的提问来源于stack exchange,提问作者roXx
相关产品推荐
相关产品推荐

