如何在 Bind9 配置文件中包含变量?

如何在 Bind9 配置文件中包含变量?

我正在尝试创建自动安装脚本,因为我必须在多台服务器上执行此安装任务。

我已经用我的变量设置了所有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在部署时扩展这些宏。您可以使用sedbash构建这样一个编写起来并不太困难的脚本。

你最终会玩这种类型的游戏:

例子

$ 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

相关内容