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


本文完

相关推荐
李狗蛋儿啊1 小时前
zero自动化框架搭建---Git安装详解
运维·git·自动化
小金的学习笔记2 小时前
如何在本地和服务器新建mysql用户和密码
运维·服务器·mysql
s_fox_2 小时前
nginx ngx_http_module(7) 指令详解
运维·nginx·http
EasyNVR2 小时前
EasyRTC智能硬件:实时畅联、沉浸互动、消音护航
运维·服务器·网络·安全·音视频·webrtc·p2p
yngsqq2 小时前
c# —— StringBuilder 类
java·开发语言
CarryBest2 小时前
Jenkins 环境搭建---基于 Docker
运维·jenkins
Asthenia04122 小时前
浏览器缓存机制深度解析:电商场景下的性能优化实践
后端
星星点点洲2 小时前
【操作幂等和数据一致性】保障业务在MySQL和COS对象存储的一致
java·mysql
xiaolingting3 小时前
JVM层面的JAVA类和实例(Klass-OOP)
java·jvm·oop·klass·instanceklass·class对象
若云止水3 小时前
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_process_options
运维·nginx