読者です 読者をやめる 読者になる 読者になる

らくがきちょう

なんとなく

トランザクションを使い、エラー時は「全て無かったこと」にする

F5 Networks Network

BIG-IP は非常に優れた Web GUI を持つ製品です。しかし、同時に洗練されたシェル「tmsh」も備えています。例えば「設定量が少ない場合は Web GUI」「設定量が多い場合は tmsh」といった具合に使い分けると便利です。しかし、tmsh(CLI)とは言え、大量に設定を投入してエラーになった場合、「文字列が多すぎてエラー箇所が分かりづらい」「どこまで設定が入ったのか、分かりづらい」といった問題が出る場合もあります。こういった問題を避ける為、tmsh 上ではひとまとまりの設定を『トランザクション』として扱うことで「一箇所でもエラーになった場合は、投入したコンフィグの全てを無効化する」ということが出来ます。

トランザクションを利用しない場合

わざとエラーが出る設定をトランザクションを利用せずに実施してみます。以下の通り、3 つの VirtualServer を新規作成しています。VIRTUAL-3 には、わざと存在しない Pool を指定してエラーにします。

VirtualServer Pool Pool Member
VIRTUAL-1 POOL-1 172.16.1.1:http
VIRTUAL-2 POOL-2 172.16.1.1:http
VIRTUAL-3 POOL-3(※ 存在しない) (※ 存在しない)

実際に設定してみます。

(tmos)# create / ltm pool POOL-1 members replace-all-with { 172.16.1.101:http }
(tmos)# create / ltm pool POOL-2 members replace-all-with { 172.16.1.102:http }
(tmos)# create / ltm virtual VIRTUAL-1 destination 172.16.1.1:http pool POOL-1
(tmos)# create / ltm virtual VIRTUAL-2 destination 172.16.1.2:http pool POOL-2
(tmos)# create / ltm virtual VIRTUAL-3 destination 172.16.1.3:http pool POOL-3
01020036:3: The requested pool (POOL-3) was not found.

list コマンドで設定を確認してみます。エラーが発生した VIRTUAL-3 は設定されていませんが、それ以外は設定されています。

(tmos)# list / ltm virtual one-line
ltm virtual VIRTUAL-1 { destination 172.16.1.1:http mask 255.255.255.255 pool POOL-1 profiles { fastL4 { } } source 0.0.0.0/0 vs-index 17 }
ltm virtual VIRTUAL-2 { destination 172.16.1.2:http mask 255.255.255.255 pool POOL-2 profiles { fastL4 { } } source 0.0.0.0/0 vs-index 18 }

トランザクションを利用した場合

次はトランザクションを利用してみます。トランザクションは以下のコマンドで制御します。

トランザクションの開始 create cli transaction
トランザクションに投入した設定の確認 list cli transaction
トランザクションの終了(設定の反映) submit cli transaction
トランザクションの強制終了(設定は廃棄) delete cli transaction

先程と同じ設定を、次はトランザクションを利用して投入してみます。

# tmsh
(tmos)# create cli transaction
(tmos)# create / ltm pool POOL-1 members replace-all-with { 172.16.1.101:http }
Command added to the current transaction
(tmos)# create / ltm pool POOL-2 members replace-all-with { 172.16.1.102:http }
Command added to the current transaction
(tmos)# create / ltm virtual VIRTUAL-1 destination 172.16.1.1:http pool POOL-1
Command added to the current transaction
(tmos)# create / ltm virtual VIRTUAL-2 destination 172.16.1.2:http pool POOL-2
Command added to the current transaction
(tmos)# create / ltm virtual VIRTUAL-3 destination 172.16.1.3:http pool POOL-3
Command added to the current transaction
(tmos)# submit cli transaction
transaction failed: 01020036:3: The requested pool (POOL-3) was not found.

トランザクションを反映する際、「POOL-3 が未定義」というエラーになっています。この状態では、まだトランザクションは終了していません。list コマンドでトランザクション中の設定を確認してみます。

(tmos)# list cli transaction
1: (tmos)# create / ltm pool POOL-1 members replace-all-with { 172.16.1.101:http }
2: (tmos)# create / ltm pool POOL-2 members replace-all-with { 172.16.1.102:http }
3: (tmos)# create / ltm virtual VIRTUAL-1 destination 172.16.1.1:http pool POOL-1
4: (tmos)# create / ltm virtual VIRTUAL-2 destination 172.16.1.2:http pool POOL-2
5: (tmos)# create / ltm virtual VIRTUAL-3 destination 172.16.1.3:http pool POOL-3

エラーの原因になっている POOL-3 を設定します。

(tmos)# create / ltm pool POOL-3 members replace-all-with { 172.16.1.103:http }
Command added to the current transaction

再度、トランザクション中の設定を確認します。6 番目に設定が追加されていることが分かります。5 より前に 6 が無いとエラーになる… ように感じますが、トランザクション中であれば設定順序が自動的に解決されるので問題ありません(正常に設定出来ます)。

(tmos)# list cli transaction
1: (tmos)# create / ltm pool POOL-1 members replace-all-with { 172.16.1.101:http }
2: (tmos)# create / ltm pool POOL-2 members replace-all-with { 172.16.1.102:http }
3: (tmos)# create / ltm virtual VIRTUAL-1 destination 172.16.1.1:http pool POOL-1
4: (tmos)# create / ltm virtual VIRTUAL-2 destination 172.16.1.2:http pool POOL-2
5: (tmos)# create / ltm virtual VIRTUAL-3 destination 172.16.1.3:http pool POOL-3
6: (tmos)# create / ltm pool POOL-3 members replace-all-with { 172.16.1.103:http }

トランザクションを反映します。

(tmos)# submit cli transaction

これで正しく設定されました。

(tmos)# list / ltm virtual one-line
ltm virtual VIRTUAL-1 { destination 172.16.1.1:http mask 255.255.255.255 pool POOL-1 profiles { fastL4 { } } source 0.0.0.0/0 vs-index 23 }
ltm virtual VIRTUAL-2 { destination 172.16.1.2:http mask 255.255.255.255 pool POOL-2 profiles { fastL4 { } } source 0.0.0.0/0 vs-index 24 }
ltm virtual VIRTUAL-3 { destination 172.16.1.3:http mask 255.255.255.255 pool POOL-3 profiles { fastL4 { } } source 0.0.0.0/0 vs-index 25 }

トランザクションの中断

トランザクションを意図的に中断(強制終了)してみます。

(tmos)# create cli transaction
(tmos)# create / ltm pool POOL-1 members replace-all-with { 172.16.1.101:http }
Command added to the current transaction
(tmos)# create / ltm pool POOL-2 members replace-all-with { 172.16.1.102:http }
Command added to the current transaction
(tmos)# create / ltm virtual VIRTUAL-1 destination 172.16.1.1:http pool POOL-1
Command added to the current transaction
(tmos)# create / ltm virtual VIRTUAL-2 destination 172.16.1.2:http pool POOL-2
Command added to the current transaction
(tmos)# create / ltm virtual VIRTUAL-3 destination 172.16.1.3:http pool POOL-3
Command added to the current transaction
(tmos)# delete cli transaction
Batch mode transaction is not empty, it will be lost, delete it? (y/n) y

設定を確認しても何も反映されていないことが分かります。

(tmos)# list / ltm virtual
(tmos)#

トランザクションは対話モードからしか実行出来ない

但し、トランザクションには「tmsh の対話モードからしか実行出来ない」という制限があります。bash 上から直接、トランザクションを開始するとエラーになります。

# tmsh create cli transaction
Batch mode transactions are only available in interactive mode

まとめ

tmsh 上で一定量以上の設定を実施する場合はトランザクションを活用した方が無難です。