文章目录
前言
之前有个需求,动态修改ubuntu20的ip,看了下: 本质上是
修改01-netcfg.yaml文件
,然后执行netplan apply
就可以了。所以,需求就变成了 如何对yaml文件的内容进行读取,修改,写入。
引入包
其实springboot提供了2个maven的包用于解析yaml(springboot的各种配置文件都是yaml),引入:
xml
<!-- Jackson (用于JSON处理) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- SnakeYAML (用于YAML解析和生成) -->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</dependency>
yaml原始内容
yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: false
addresses:
- 192.168.150.1/24
optional: true
eth1:
dhcp4: false
addresses:
- 192.168.150.1/24
optional: true
enp3s0:
dhcp4: true
addresses: []
dhcp-identifier: mac
optional: true
enp4s0:
dhcp4: true
addresses: []
dhcp-identifier: mac
optional: true
enp6s0:
dhcp4: true
addresses: []
dhcp-identifier: mac
optional: true
enp7s0:
dhcp4: true
addresses: []
dhcp-identifier: mac
optional: true
enp8s0:
dhcp4: false
addresses:
- 192.168.150.1/24
dhcp-identifier: mac
optional: true
操作目标
目前的配置文件etho网卡是动态的获取ip,现在把配置文件ech修改如下:
固定ip:dhcp4 --》 false
添加网卡: gateway4: 172.16.10.254
设置ip地址:
设置dns,不然不能上外网
具体代码
java
public static void main(String[] args) {
try {
// Step 1: 读取YAML文件并加载为Map, 输入YAML文件路径
InputStream inputStream = new FileInputStream("01-netcfg.yaml");
Yaml yaml = new Yaml();
Map<String, Object> yamlMap = yaml.load(inputStream);
// Step 2: 使用ObjectMapper将Map转换为JSON字符串
ObjectMapper om = new ObjectMapper();
String jsonStr = om.writeValueAsString(yamlMap);
// Step 3: 将JSON字符串解析成JsonNode,便于修改
JsonNode rootNode = om.readTree(jsonStr);
// Step 4: 修改eth0节点
JsonNode ethernetsNode = rootNode.path("network").path("ethernets");
// 获取eth0节点并修改其值
JsonNode eth0Node = ethernetsNode.path("eth0");
// 创建新的eth0配置
((ObjectNode) eth0Node).put("dhcp4", false);
((ObjectNode) eth0Node).putArray("addresses").add("172.16.10.43/24");
((ObjectNode) eth0Node).put("gateway4", "172.16.10.254");
// 设置新的DNS地址作为数组
JsonNode nameserversNode = eth0Node.path("nameservers");
// 使用ArrayNode来生成数组格式
ArrayNode arrayNode = om.createArrayNode();
arrayNode.add("114.114.114.114");
arrayNode.add("8.8.8.8");
arrayNode.add("8.8.4.4");
((ObjectNode) nameserversNode).set("addresses", arrayNode);
// Step 5: 将修改后的JsonNode转换为Map,这里就是将JsonNode转换为Map
Map<String, Object> modifiedMap = om.convertValue(rootNode, Map.class);
// Step 6: 使用SnakeYAML将修改后的Map转换为YAML格式
DumperOptions options = new DumperOptions();
options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
Yaml yamlWriter = new Yaml(options);
StringWriter stringWriter = new StringWriter();
yamlWriter.dump(modifiedMap, stringWriter);
// Step 7: 将新的YAML写回文件
try (BufferedWriter writer = new BufferedWriter(new FileWriter("01-netcfg.yaml"))) {
writer.write(stringWriter.toString());
}
System.out.println("YAML updated successfully!");
} catch (IOException e) {
e.printStackTrace();
}
执行

查看结果

显示已经修改!!
总结:
文章主要介绍了如何使用Java操作YAML文件,具体实现了读取、修改和写入YAML文件的过程。通过引入Jackson和SnakeYAML两个包,实现了将YAML文件内容转换为Map,然后再将Map修改后重新转换为YAML格式并写回文件。
在具体操作目标上,通过代码示例实现了将原始YAML文件中的某一节点进行修改,包括修改网络配置,设置固定IP地址、网关、DNS等。最后展示了执行结果,并验证配置已经修改成功。
通过本文的示例,读者可以了解如何在Java中操作YAML文件,实现对YAML配置文件的动态修改,为实际项目中类似需求提供了解决思路和代码实现。
本文完