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


本文完

相关推荐
翼龙云_cloud1 分钟前
阿里云渠道商:轻量服务器远程协作性能优化指南
运维·服务器·阿里云·性能优化·云计算
菜鸡的升级之路5 分钟前
服务器卡死排查流程
运维·服务器
恒创科技HK7 分钟前
租用日本服务器价格便宜的原因
运维·服务器
FreeBuf_10 分钟前
新型PCPcat恶意软件利用React2Shell漏洞48小时内入侵超5.9万台服务器
运维·服务器
❥ღ Komo·1 小时前
K8s服务发现与DNS解析全解析
java·开发语言
g***B7383 小时前
Java 工程复杂性的真正来源:从语言设计到现代架构的全链路解析
java·人工智能·架构
期待のcode5 小时前
MyBatisX插件
java·数据库·后端·mybatis·springboot
AI浩7 小时前
【Labelme数据操作】LabelMe标注批量复制工具 - 完整教程
运维·服务器·前端
醇氧7 小时前
【Windows】优雅启动:解析一个 Java 服务的后台启动脚本
java·开发语言·windows
sunxunyong8 小时前
doris运维命令
java·运维·数据库