我正在尝试创建自动安装脚本,因为我必须在多台服务器上执行此安装任务。
我已经用我的变量设置了所有bind9配置文件,并认为如果设置了变量,它就会起作用,但是当绑定服务启动时,它会出错,指出变量无法识别。
例如 /var/log/syslog 中显示的错误之一:
dns_rdata_fromtext: /etc/bind/db.override:16: near ''$IP'': bad dotted quad
我的配置文件:
;The Variables here are NIC and IP
; BIND data file for overridden IPs
;
$TTL 86400
@ IN SOA ns1 root (
2012100401 ; serial
604800 ; refresh 1w
86400 ; retry 1d
2419200 ; expiry 4w
86400 ; minimum TTL 1d
)
; need atleast a nameserver
IN NS ns1
; specify nameserver IP address
ns1 IN A $IP ; external IP from $NIC
; provide IP address for domain itself
@ IN A $IP ; external IP from $NIC
; resolve everything with the same IP address as ns1
* IN A $IP ; external IP from $NIC
我在网上搜索过,但找不到反映我在这里尝试做的事情的解决方案。我不是 shell 脚本编写专家,并且注意到绑定和我正在将变量实现到两者中的另一个程序,当它们包含在配置文件中时,它们似乎无法处理变量,就像我上面所做的那样。
答案1
您无法使用绑定配置文件执行您在此处尝试执行的操作。该变量$IP
不能设置为环境变量。
通常,对于这种情况,您将使用脚本或模板引擎来扩展这些变量(技术上它们在很多时候被称为宏),其中模板引擎将扩展文件,而他们正在被部署。
我比较熟悉的一个叫猎豹。它由我用来部署系统的配置系统使用,称为皮匠。这样的系统有很多,例如木偶,厨师,cf引擎,盐, ETC。
猎豹模板示例
这是一个非常简单的示例,说明了 Cheetah 的一些基本语法。
来源:http://www.cheetahtemplate.org/examples.html
<html>
<head><title>$title</title></head>
<body>
<table>
#for $client in $clients
<tr>
<td>$client.surname, $client.firstname</td>
<td><a href="mailto:$client.email">$client.email</a></td>
</tr>
#end for
</table>
</body>
</html>
这里的宏$client.email
、$client.firstname
、 和$title
将由 Cheetah 在运行时用实际值进行扩展。这些引擎功能相当强大,甚至使您能够执行 for 循环,例如上面的循环$client
。
但如果您的需求很少,我会拼凑一个 shell 脚本来$IP
在部署时扩展这些宏。您可以使用sed
或bash
构建这样一个编写起来并不太困难的脚本。
你最终会玩这种类型的游戏:
例子
$ IP=1.2.3.4
$ sed -i "s/\$IP/$IP/g" sample.conf
$ cat sample.conf
;The Variables here are NIC and IP
; BIND data file for overridden IPs
;
$TTL 86400
@ IN SOA ns1 root (
2012100401 ; serial
604800 ; refresh 1w
86400 ; retry 1d
2419200 ; expiry 4w
86400 ; minimum TTL 1d
)
; need atleast a nameserver
IN NS ns1
; specify nameserver IP address
ns1 IN A 1.2.3.4 ; external IP from $NIC
; provide IP address for domain itself
@ IN A 1.2.3.4 ; external IP from $NIC
; resolve everything with the same IP address as ns1
* IN A 1.2.3.4 ; external IP from $NIC