文章目錄
- 前言
- 引入包
- yaml原始內容
- 操作目標
- 具體代碼
- 執行
- 查看結果
- 總結:
前言
之前有個需求,動態修改ubuntu20的ip,看了下: 本質上是
修改01-netcfg.yaml文件
,然后執行netplan apply
就可以了。
所以,需求就變成了 如何對yaml文件的內容進行讀取,修改,寫入。
引入包
其實springboot提供了2個maven的包用于解析yaml(springboot的各種配置文件都是yaml),引入:
<!-- 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原始內容
network:version: 2renderer: networkdethernets:eth0:dhcp4: falseaddresses:- 192.168.150.1/24optional: trueeth1:dhcp4: falseaddresses:- 192.168.150.1/24optional: trueenp3s0:dhcp4: trueaddresses: []dhcp-identifier: macoptional: trueenp4s0:dhcp4: trueaddresses: []dhcp-identifier: macoptional: trueenp6s0:dhcp4: trueaddresses: []dhcp-identifier: macoptional: trueenp7s0:dhcp4: trueaddresses: []dhcp-identifier: macoptional: trueenp8s0:dhcp4: falseaddresses:- 192.168.150.1/24dhcp-identifier: macoptional: true
操作目標
目前的配置文件etho網卡是動態的獲取ip,現在把配置文件ech修改如下:
固定ip:dhcp4 --》 false
添加網卡: gateway4: 172.16.10.254
設置ip地址:
設置dns,不然不能上外網
具體代碼
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轉換為MapMap<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配置文件的動態修改,為實際項目中類似需求提供了解決思路和代碼實現。
本文完