如何在Netplan的YAML配置文件中为特定键添加多个值(IPv6地址场景)
如何用yq或Bash脚本在Netplan配置中为addresses键添加新IPv6地址
问题描述
我正在Linux系统中配置IPv6地址,目前遇到的问题是不清楚如何在Netplan的YAML配置文件中为特定键添加值。以下是我的配置文件内容:
network: version: 2 renderer: networkd ethernets: ens3: dhcp4: no addresses: [155.128.134.198/23,'2002:18f0:b009:f84:5200:03ff:fdf7:d0c2/64'] gateway4: 155.128.134.198 nameservers: addresses: [108.61.10.10] routes: - to: 169.254.0.0/16 via: 155.138.148.1 metric: 100
我希望在addresses键下添加新的IPv6地址,同时保留已有的地址。请问是否可以通过yq或其他简单方法实现该操作,以便我编写bash脚本来完成?我尚未找到专门用于Netplan的可批量添加地址的工具,恳请提供相关帮助。
解决方案
当然可以用yq来轻松实现这个需求——它是专门处理YAML文件的命令行工具,非常适合编写自动化脚本。下面是具体的操作方法:
1. 安装yq(推荐v4版本)
大多数Linux发行版可以通过包管理器安装:
# Ubuntu/Debian sudo apt update && sudo apt install yq # RHEL/CentOS/Fedora sudo dnf install yq
如果你的系统里是旧版yq(v3),语法会有差异,建议升级到v4版本以获得更好的数组操作支持。
2. 单个IPv6地址的添加命令
使用+=操作符可以直接向addresses数组追加新地址,同时保留原有内容。执行以下命令(替换你的配置文件路径和新IPv6地址):
sudo yq eval '.network.ethernets.ens3.addresses += ["2001:db8::1/64"]' -i /etc/netplan/00-installer-config.yaml
-i参数表示原地修改配置文件,无需手动重定向输出;["2001:db8::1/64"]是要添加的新地址,格式要符合YAML数组规范。
3. 批量添加多个IPv6地址
如果需要一次性添加多个地址,只需在数组中列出所有目标地址即可:
sudo yq eval '.network.ethernets.ens3.addresses += ["2001:db8::1/64", "2001:db8::2/64", "2001:db8::3/64"]' -i /etc/netplan/00-installer-config.yaml
4. 编写自动化Bash脚本
如果你需要重复执行这个操作,可以写一个简单的Bash脚本,示例如下:
#!/bin/bash # 配置参数 NETPLAN_CONFIG="/etc/netplan/00-installer-config.yaml" # 要添加的IPv6地址列表 NEW_IPV6_ADDRESSES=("2001:db8::1/64" "2001:db8::2/64" "2001:db8::3/64") # 批量追加地址 sudo yq eval ".network.ethernets.ens3.addresses += ${NEW_IPV6_ADDRESSES[*]@Q}" -i "$NETPLAN_CONFIG" # 验证配置(推荐先执行这个,避免配置错误导致断网) echo "正在验证Netplan配置..." sudo netplan try # 如果验证通过,取消下面的注释以应用配置 # echo "应用Netplan配置..." # sudo netplan apply
${NEW_IPV6_ADDRESSES[*]@Q}会自动将数组转换为符合YAML语法的引号包裹格式,避免地址中的特殊字符引发错误;netplan try会临时应用配置并等待用户确认,15秒内无操作会自动回滚,非常适合远程服务器操作。
5. 验证结果
修改完成后,可以查看配置文件确认地址是否添加成功:
cat /etc/netplan/00-installer-config.yaml
或者直接查看网络接口的地址:
ip -6 addr show ens3
内容的提问来源于stack exchange,提问作者Michal Žídek




