Bash脚本:不断修改配置文件中的IP地址

时间:2014-05-12 04:27:18

标签: linux apache bash amazon-web-services

我认为我想做的事情有点复杂,但我喜欢任何帮助或建议:

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

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

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

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

  • 最初我有一个默认配置文件,但我不想放任何&#39; BalancerMember&#39;在它的线条。相反,我想检查配置文件,看看它是否有任何条目。 - 如果找不到条目,​​请遍历数组并创建这些行。 &#39;路线&#39;需要增加一个

例如:

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

<Proxy balancer://cluster01)cluster>

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

<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地址反映了配置文件中的内容。它看起来像这样:

<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

OR,比如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 个答案:

答案 0 :(得分:0)

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

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)删除将使用existingFile

中的tmpFile内容填充的现有行
 sed -i '/BalancerMember ajp:\/\/.*=[0-9]/d' <exitingFile>

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

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

现在您的existingFile(这是您的conf文件)已更新IP

请注意:

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

exitingFile 是您现有的配置文件。

并且最后一个sed语句将创建一个带有.bck扩展名的备份文件,你犯了一些错误。

您还可以在新脚本中实施此解决方案,以防您不想更改现有解决方案。您只需要更新的数组值,如果您在同一个脚本中执行此操作,只需检查数组是否更新就很容易。