なんか忙しい…まあそれは置いといて。時代はクラウドだなんだって言われてるんだけど、オンプレにはオンプレの良さがある。で、商用のロードバランサーといったらBIG-IPが鉄板だと思う。そのBIG IPのAPI(iControl)について。ネットワーク機器のAPIを利用して省力運用/プログラマブルな運用をしないとね。



0. iControl

iControlはBIG IPに実装されたSOAPなAPIで、これを利用してBIG IPのオペレーションができる。SOAPなのでSDKに梱包されたWSDLを使ってアクセスすることになる。WSDLっていうのはSOAP通信をするためのインターフェイス仕様が定義されたXMLで、引数や戻りの型が指定されている。大抵の言語はSOAPを扱うライブラリがあるので、任意の言語でこのWSDLファイルを読み込んでアクセスすることになる。前の会社でSOAPなAPIをJavaで作ってたりしてたのでこのあたりの知見が多少はある。

そしてこのiControlのPython用クライアントライブラリとしてpycontrolが存在している。これをpip install pycontrolでインストールする。SDK(WSDL)は下記のF5のサイトより取得する(要ユーザ登録)。API仕様が記載されているページもあるので併記する。

pythonに関する言及はないんだが、使い方は概ねこのドキュメントの通りである。ちょっととっつきにくい感じだね。

1. 使い方の例

とりあえずサンプル(https://gist.github.com/hiroakis/7804457)を上げた。いくぶん冗長なコードですが。なお、このサンプルで書いたコードはSDK 11.X、つまりBIG IP 11.X系に対応している。
  • get_vs_list()
    • バーチャルサーバのリストを取得する
  • get_pool_list()
    • プールのリストを取得する
  • set_pool_member_state_enable(pool_name, members)
    • 指定したプール(pool_name)に所属するノード(members)をオンラインにする
    • membersは[{‘name': ‘node_name’, ‘port': PORT_NUM},{‘name': ‘node_name’, ‘port': PORT_NUMBER}….]である
  • set_pool_member_state_disable(pool_name, members)
    • 指定したプール(pool_name)に所属するノード(members)をオフラインにする
    • membersは[{‘name': ‘node_name’, ‘port': PORT_NUM},{‘name': ‘node_name’, ‘port': PORT_NUMBER}….]である
  • get_node_list()
    • ノードのリストを取得する
  • create_node(node_name, ip)
    • 指定した名前(node_name)とIPアドレス(ip)で、新規にノードを追加する
  • delete_node(node_name)
    • 指定した名前(node_name)のノードを削除する
  • get_node_address(node_name)
    • 指定した名前(node_name)のノードのIPを取得する
他にもコンフィグシンクしたり、証明書関連の設定を行ったり、大抵のことはできる。

2. ユースケース
  • サーバ構築と同時にLBの設定行う
    • 鯖構築時にスクリプトなりツールなりでネットワークの設定を行ったら、サーバ種別(Webサーバ(ポート80)とか)に応じて、BIG IPのAPIを叩いてLBの設定を完了させる。
  • アプリケーションデプロイ時に利用
    • jenkinsなどに組み込んで、set_pool_member_state_disableを使って切り離す→リリースする→set_pool_member_state_enableでオンラインにする。など。
などなど…。デプロイ時の利用は実際に使っている。

久々の投稿で簡単だけどおわり。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <img localsrc="" alt="">

Set your Twitter account name in your settings to use the TwitterBar Section.