【问题标题】:Adjust netplan yaml with sed or awk使用 sed 或 awk 调整 netplan yaml
【发布时间】:2023-01-25 10:50:36
【问题描述】:

这是我们的 yaml:

network:
  ethernets:
    ens160:
      addresses:
      - 10.200.2.11/22
      gateway4: 10.200.0.1
      nameservers:
        addresses:
        - 8.8.8.8
        - 4.4.4.4
        search:
        - cybertax.live
  version: 2

我只想更改 DNS 服务器。 从:

        - 8.8.8.8
        - 4.4.4.4

到:

        - 10.10.10.10
        - 10.10.10.11

我怎样才能做到这一点?注意:我们不能使用或安装yq,所以这需要通过 sed 或 awk 来完成。另外,是的,我知道,不推荐这样做,但这是现在需要做的。

到目前为止我尝试了什么:

sed -i '/        addresses:/,/        search:/ s/^/# /' $netplan_yaml
sed -i '/      nameservers:/a\ \ \ \ \ \ \ \ addresses:' $netplan_yaml
for i in ${!asar_dns[@]}; do
    sed -i "/        addresses:/a\ \ \ \ \ \ \ \ - ${asar_dns[$i]}" $netplan_yaml
done

但这做错了三件事(我可以看到)。

  1. 匹配addressessearch,包括addressessearch。我只想要地址之后和搜索之前的内容。
  2. 它将 DNS 地址放在旧地址之间的关联数组中,旧地址在任何有“地址”的地方被注释掉。我不想在注释掉的行上这样做。
  3. 我不喜欢必须使用\ \ \ \ \ \,如果可能的话我更愿意使用.*,但也需要使用关联数组中的地址。

【问题讨论】:

  • 请更新问题以显示您尝试使用sedawk,以及您的代码生成的(错误)输出
  • IP地址会一直一样吗?也就是说,您总是想替换8.8.8.84.4.4.4?替换将始终是10.10.10.1010.10.10.11?或者这些 IP 地址中的任何一个会随时间变化吗?
  • 源 IP 地址(在本例中为 8.8.8.84.4.4.4)是否会出现在 yaml 中不应被替换的其他地方?
  • IP 地址可能是任何东西,以及任何数量的 dns 服务器,不能依赖于匹配 8.8.8.8 和/或 4.4.4.4
  • ed 的回答可以接受吗?

标签: bash awk sed yaml


【解决方案1】:

我找到了一个非常 hacky 的解决方案,但它有效。打开反馈。

netplan_yaml=/etc/netplan/00-installer-config.yaml
baddns="$(sed -n '/.*nameservers:/,/.*search:/p' /etc/netplan/00-installer-config.yaml | grep -v 'nameservers|addresses' | grep -v 'search' | grep -v 10.200 | awk '{print$2}')"
mapfile -t arr_baddns  <<<$baddns
for i in ${arr_baddns[@]}; do
    sed -i "/        - $i/s/^/#/g" $netplan_yaml
done
for i in ${!asar_dns[@]}; do
    sed -i "/        addresses:/a        - ${asar_dns[$i]}" $netplan_yaml
done

【讨论】:

    【解决方案2】:

    如果ed可用/可接受。

    就像是。

    ed -s file.yaml <<-'EOF'
      g/nameservers:/;/addresses:/-s/[[:digit:].]{1,}/10.10.10.11/
      -s/[[:digit:].]{1,}/10.10.10.10/
      ,p
      Q
    EOF
    

    使用变量作为值,例如:

    #!/bin/sh
    
    dns1=10.10.10.10
    dns2=10.10.10.11
    
    ed -s file.yaml <<-EOF
      g/nameservers:/;/addresses:/;/search:/-s/[[:digit:].]{1,}/$dns2/\
      -s/[[:digit:].]{1,}/$dns1/
      ,p
      Q
    EOF
    

    【讨论】:

      猜你喜欢
      • 2017-04-23
      • 2016-12-11
      • 2017-08-25
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 2020-09-26
      • 2015-03-19
      相关资源
      最近更新 更多