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


本文完

相关推荐
rzl027 分钟前
SpringBoot总结
spring boot·后端·firefox
月亮不月亮21 分钟前
月亮商场购物打折Java
java·eclipse
moxiaoran575323 分钟前
Springboot+MongoDB简单使用示例
spring boot·mongodb·spring
guozhetao30 分钟前
【ST表、倍增】P7167 [eJOI 2020] Fountain (Day1)
java·c++·python·算法·leetcode·深度优先·图论
技术思考者31 分钟前
基础很薄弱如何规划考研
java·经验分享·考研
●VON1 小时前
重生之我在暑假学习微服务第二天《MybatisPlus-下篇》
java·学习·微服务·架构·mybatis-plus
老华带你飞1 小时前
口腔助手|口腔挂号预约小程序|基于微信小程序的口腔门诊预约系统的设计与实现(源码+数据库+文档)
java·数据库·微信小程序·小程序·论文·毕设·口腔小程序
小鱼人爱编程1 小时前
Java基石--反射让你直捣黄龙
前端·spring boot·后端
hqxstudying1 小时前
J2EE模式---服务层模式
java·数据库·后端·spring·oracle·java-ee
GM_8281 小时前
【最新最完整】SpringAI-1.0.0开发MCP Server,搭建MCP Client 实战笔记(进阶+详细+完整代码)
java·后端·ai编程·springai·mcp