gpt4 book ai didi

linux - Bash 脚本 : continually modifying IP addresses in configuration file

转载 作者:太空宇宙 更新时间:2023-11-04 03:59:07 24 4
gpt4 key购买 nike

我认为我想做的事情有点复杂,但我希望得到任何帮助或建议:

我有一个 bash 数组 ${IP_ADDRESSES[@]},其中包含(正如您可能猜到的)IP 地址。该数组通过 cron 每 10 分钟更新一次。

我需要做的是将这些 IP 地址“动态”注入(inject)到 apache 配置文件(/etc/httpd/conf.d/balancer.conf)中。我尝试修改的行的语法是:

<Proxy balancer://cluster01)cluster>
BalancerMember ajp://<<ip-address>>:80 route=X

然而,这就是棘手的地方。我有以下要求:

  • 最初我有一个默认配置文件,但我不想在其中放入任何“BalancerMember”行。相反,我想检查配置文件并查看其中是否有任何条目。-- 如果没有找到条目,则遍历数组并创建这些行。 “路线”需要加一

例如:

存在一个没有平衡器成员的配置文件。此时,我们感兴趣的配置文件部分如下所示:

<Proxy balancer://cluster01)cluster>

脚本识别出没有成员,并查看 ${IP_ADDRESSES[@]} 并发现它包含 3 个 IP 地址。对于第一个条目,在“”下方插入第一行。现在看起来像这样:

<Proxy balancer://cluster01)cluster>
BalancerMember ajp://1.1.1.1:80 route=0

接下来,它会添加第二个和第三个:

<Proxy balancer://cluster01)cluster>
BalancerMember ajp://1.1.1.1:80 route=0
BalancerMember ajp://1.1.1.2:80 route=1
BalancerMember ajp://1.1.1.3:80 route=2

此时一切都很好。我有一个可以在 3 个 IP 地址上工作的配置文件。惊人的。但是当 cron 作业下次运行时会发生什么?有一些事情可能发生:

a) 没有任何变化,IP 地址相同并且没有修改配置文件b) 一个或多个 IP 地址已更改。我想将数组中的 IP 地址与配置文件中的 IP 地址进行比较并替换它。c) 数组中存在或多或少的 IP 地址。如果它小于配置文件中的值,请从配置文件中删除不在数组中的所有条目。如果更多,请添加数组中的任何 IP 地址

例如

配置文件一切正常,数组中的 IP 地址反射(reflect)了配置文件中的内容。它看起来像这样:

<Proxy balancer://cluster01)cluster>
BalancerMember ajp://1.1.1.1:80 route=0
BalancerMember ajp://1.1.1.2:80 route=1
BalancerMember ajp://1.1.1.3:80 route=2

但是,我们从数组中丢失了 1.1.1.2。它已被 1.1.1.4 取代。配置文件现在应该如下所示:

<Proxy balancer://cluster01)cluster>
BalancerMember ajp://1.1.1.1:80 route=0
BalancerMember ajp://1.1.1.4:80 route=1
BalancerMember ajp://1.1.1.3:80 route=2

或者,假设 1.1.1.4 是一个额外的 IP 地址,并且该数组现在包含 4 个元素;将其添加到末尾:

<Proxy balancer://cluster01)cluster>
BalancerMember ajp://1.1.1.1:80 route=0
BalancerMember ajp://1.1.1.2:80 route=1
BalancerMember ajp://1.1.1.3:80 route=2
BalancerMember ajp://1.1.1.4:80 route=3

等等

或者,如果我们从数组中丢失 2 个 IP 地址(1.1.1.1 和 1.1.1.2),配置文件应如下所示:

<Proxy balancer://cluster01)cluster>
BalancerMember ajp://1.1.1.3:80 route=0

所以最后我只是试图让配置文件与数组中的 IP 地址保持同步。

非常感谢任何和所有帮助。

干杯!!

最佳答案

在更新数组内容的脚本中添加

1) 通过检查 md5sum 来检查数组是否已更新 echo ${array[*]} | md5sum您可以将其保存在临时文件中以供后续比较。

2)准备一个文件,其语法每次更新时都会更改:

for i in $(seq 0 $((${#klp[@]} - 1))) 
do
echo "BalancerMember ajp ://${array[ $i ]}:80 route=$i" >> tmpFile
done

3) 删除将使用现有文件中的 tmpFile 内容填充的现有行

 sed -i '/BalancerMember ajp:\/\/.*=[0-9]/d' <exitingFile>

4) 将文件 tmpFile 的内容(在正确的位置)附加到您的现有文件

sed -i'.bck' '/yourPattern/ r tmpFile' <exitingFile>

现在您的现有文件(即您的conf文件)已更新IP

请注意:

yourPattern 是原始 conf 文件中以 BalancerMember 开始的行之前的模式匹配行。

exitingFile 是您现有的conf 文件。

如果您犯了一些错误,最后一个 sed 语句将创建一个扩展名为 .bck 的备份文件。

如果您不想更改现有脚本,也可以在新脚本中实现此解决方案。您只需要更新的数组值,如果您在同一脚本中执行此操作,那么检查数组是否已更新的任务将很容易。

关于linux - Bash 脚本 : continually modifying IP addresses in configuration file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23601037/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com