ubuntu20动态修改ip,springboot中yaml的内容的读取,修改,写入

文章目录

前言

之前有个需求,动态修改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配置文件的动态修改,为实际项目中类似需求提供了解决思路和代码实现。


本文完

相关推荐
异常君几秒前
Java PriorityQueue 源码剖析:二叉堆的实现原理与应用
java·面试
aningxiaoxixi5 分钟前
JAVA之 Lambda
java·开发语言
丁劲犇13 分钟前
开始在本地部署自己的 Gitea 服务器
运维·服务器·gitea
只在空想家20 分钟前
Servlet 体系结构
java·后端·servlet
ApiHug22 分钟前
ApiHug 1.3.9 支持 Spring 3.5.0 + Plugin 0.7.4 内置小插件升级!儿童节快乐!!!
java·后端·spring·api·apihug·apismart
玛奇玛丶23 分钟前
💥昨天掘金 Web 端突然登不上了,一次网络异常的排查记录
后端·负载均衡
北京_宏哥23 分钟前
🔥《刚刚问世》系列初窥篇-Java+Playwright自动化测试-17- 如何优雅地切换浏览器多窗口(详细教程)
java·前端·浏览器
异常君23 分钟前
深入理解 HashMap 的 get 方法工作原理
java·面试
南囝coding27 分钟前
这款AI自动生成播客工具,必须收藏!
前端·后端
异常君30 分钟前
JVM 新生代垃圾回收:避免全堆扫描的核心技术
java·jvm