替换文件中的文本和IP地址

时间:2018-07-18 16:39:33

标签: bash shell

我想编写一个脚本来读取其中列出了所有节点的文本文件:

node1 节点2 节点3 。 。 。

  1. 它将为节点中的每个节点创建一个.conf文件。 /etc/icinga2/zones.d/master/hosts/new/目录

  2. 将文件名Windows-template的内容复制到每个 新的conf文件。

  3. 然后在每个conf文件中找到短语“ hostname.hostdomain.com” 并将其替换为文件名减去.conf。例如 对于node1,我将拥有node1.conf,其中有一个短语 “ hostname.hostdomain.com”需要替换为node1

  4. 然后ping主机名,该主机名从技术上讲是文件名减 “ .conf”,并用正确的主机名替换10.20.20.1。

我尝试编写脚本,第1部分和第2部分工作,第3部分也工作,但是它用“ $ f”替换了hostname.hostdomain.com,这是不对的。而且我不知道如何做4号。

可以帮忙吗?

谢谢

这是我的windows-template.conf文件:

    object Host "hostname.hostdomain.com" {
    import "production-host"
    check_command = "hostalive"
    address = "10.20.20.1"
    vars.client_endpoint = name

    vars.disks["disk C:"] = {
      disk_partition = "C:"
    }

    vars.os = "Windows"
}

object Zone "hostname.hostdomain.com" {
    endpoints = [ "hostname.hostdomain.com" ];
    parent = "master";
}
object Endpoint "hostname.hostdomain.com" {
    host = "10.20.20.1"
}

这是我的脚本:

#!/bin/bash

cd /etc/icinga2/zones.d/master/hosts/new

while read f; do
   cp -v "$f" /etc/icinga2/zones.d/master/hosts/new/"$f.conf"
   cp windows-template.conf "$f.conf"
   chown icinga:icinga "$f.conf"
   sed -i 's/hostname.hostdomain.com/$f/g' "$f.conf"
#   git add "$f.conf"
#   git commit -m "Add $f"
done < windows-list.txt

谢谢

2 个答案:

答案 0 :(得分:2)

您需要在外壳上使用双引号来扩展变量。试试

sed -i "s/hostname.hostdomain.com/$f/g" "$f.conf"

答案 1 :(得分:0)

这对您有用吗?

#!/bin/bash

cd /etc/icinga2/zones.d/master/hosts/new

while read f; do
   cp -v "$f" /etc/icinga2/zones.d/master/hosts/new/"$f.conf"
   cp windows-template.conf "$f.conf"
   chown icinga:icinga "$f.conf"
   sed -i "s/hostname.hostdomain.com/$f/g" "$f.conf"
   hostname=$( ssh -o StrictHostKeyChecking=no  "username@$f" -n "hostname" )
   mv "$f.conf" "${hostname}.conf"
#   git add "$f.conf"
#   git commit -m "Add $f"
done < windows-list.txt

用户名是您的用户名,我假设您将发布密钥复制到主机。