如何使用Python将用户手动输入内容写入YAML配置文件
网络配置YAML写入脚本实现方案
需要实现基于用户输入追加netplan网络接口配置的Python脚本,核心要求是不破坏原有YAML文件结构,将新采集的接口配置正确写入文件。
待更新的目标YAML文件内容
network: version: 2 renderer: networkd ethernets: enx1: addresses: - 193.254.1.6/24 nameservers: addresses: [193.254.1.5, 8.8.8.8] routes: - to: 193.254.1.0/24 via: 193.254.1.5
原有未完成代码的问题
- shebang行声明错误,标注为shell脚本但实际为Python代码
- 加载现有YAML配置后未直接修改配置对象,反而硬编码了配置模板,完全没有使用用户输入的变量
- 缺少配置写回文件的逻辑,没有做接口重名校验,容易覆盖原有正常配置
- 未适配多DNS、多路由的常见输入场景
可直接运行的修正代码
#!/usr/bin/env python3 import ruamel.yaml # 初始化YAML解析器,保留原有文件的缩进格式 yml = ruamel.yaml.YAML() yml.indent(mapping=2, sequence=4, offset=2) config_path = '/etc/netplan/01-network-manager-all.yaml' print("是否需要新增网络接口配置?") resp = input("请输入 Yes 或 No \n") if resp.lower() == "yes": # 读取现有配置 with open(config_path, 'r', encoding='utf-8') as fp: cont = yml.load(fp) # 采集用户输入 eth = input("请输入接口名,例如 enx2 \n").strip() # 接口重名校验 if eth in cont['network']['ethernets']: overwrite = input(f"接口 {eth} 已存在,是否覆盖原有配置?输入yes覆盖,其他键跳过\n").strip() if overwrite.lower() != 'yes': print("跳过接口配置更新,退出脚本") exit() addr = input("请输入IP地址和掩码,例如 192.168.1.10/24 \n").strip() dns_input = input("请输入DNS地址,多个DNS用英文逗号分隔,例如 114.114.114.114,8.8.8.8 \n").strip() dns_list = [d.strip() for d in dns_input.split(',') if d.strip()] route_to = input("请输入路由目标网段,例如 192.168.1.0/24 \n").strip() route_via = input("请输入路由网关地址,例如 192.168.1.1 \n").strip() # 构造新接口配置结构 new_interface = { 'addresses': [addr], 'nameservers': { 'addresses': dns_list }, 'routes': [ { 'to': route_to, 'via': route_via } ] } # 将新配置追加到现有配置对象 cont['network']['ethernets'][eth] = new_interface # 写回文件 with open(config_path, 'w', encoding='utf-8') as fp: yml.dump(cont, fp) print(f"接口 {eth} 配置已写入文件,执行 sudo netplan apply 可使配置生效") else: print("未选择新增配置,退出脚本")
使用说明
- 运行脚本需要配置文件的读写权限,建议加
sudo执行 - 脚本会保留原有YAML文件的注释、缩进格式,不会破坏已有配置
- 如果需要配置多IP、多路由,可以扩展输入逻辑,往
addresses、routes列表中追加对应元素即可 - 配置写入完成后必须执行
netplan apply命令,新的网络配置才会生效
内容的提问来源于stack exchange,提问作者roXx
相关产品推荐
相关产品推荐

