Vyattaの設定をシェルスクリプトで行う。

Vyattaは通常configureコマンドで設定モードに入り、setコマンドを使って設定します。

$ configure
# set service ssh
# commit
# save

さて、同じような設定を複数設定する場合には、あとあと楽したいのでシェルスクリプトを書いておいてそれを実行するだけにしたいですよね。例えば、いくつかのVLANインタフェースに複数IPアドレスを設定したい場合、

#!/bin/sh

configure
for VLAN in $(seq 100 110)
do
    for IP in $(seq 100 150)
    do
        set interfaces ethernet eth0 vif $VLAN address 192.168.0.${IP}/24
    done
done
commit

というようにして、設定しようと思うわけです。でも、これはコケます。正解は Unofficial Vyatta Wikicli-shell-apiのドキュメントのModifying configuration にあります。上記のスクリプトは次のように書きなおします。

#!/bin/vbash

for VLAN in $(seq 100 110)
do
    for IP in $(seq 100 150)
    do
        ${vyatta_sbindir}/my_set interfaces ethernet eth0 vif $VLAN address 192.168.0.${IP}/24
    done
done
${vyatta_sbindir}/my_commit

ポイントは、

  1. shebangは/bin/shや/bin/bashではなくVyatta専用の/bin/vbashにしておく
  2. configureで設定モードに入るのはスクリプト外でやる
  3. setコマンドやcommitコマンドはではなく、 ${vyatta_sbindir}/my_set${vyatta_sbindir}/my_set コマンドを使う

の3点です。このスクリプトは、configureコマンドで設定モードに入ってから実行します。

$ configure
# ./setup-if.sh

VLANインタフェースの数が多いと設定に時間がかかりますが、無事設定できると思います。

設定が多すぎるとコケる件。

ちなみに、Static NAT, Destination NATを双方向に1対1で500ルール、Destination NAT用にVLANインタフェースに仮想IPアドレスを500程度設定しようとした際、setコマンドでの設定自体はさらに数倍に増えますが、これは300ルール程度設定しようとしたところで”Set failed”でコケてしまう、という問題にも遭遇しました。ちなみにその問題は、そもそも1対1に双方向NATさせるために1IPアドレスずつ設定するのではなく、同じネットマスクのネットワークアドレスを指定することことで解決しました。 [1]

[1]Vyatta.comでレジストするとダウンロードできるPDFのドキュメントに書いていました…。orz