BIG-IPのAPIを叩いてみる(実践編)

長らく時間が空いてしまいましたが、少し情報が溜まってきたのでまた書いて行きたいと思います。

■過去のエントリーはこちら

BIG-IPのAPIを叩いてみる(入門編) - ぽぽぽぽーんのネットワークとOSS
BIG-IPのAPIを叩いてみる(再入門編) - ぽぽぽぽーんのネットワークとOSS

大まかな流れ

1.Node一覧取得

2.Node追加

3.Pool一覧取得

4.Pool member追加

5.Node,memberのenable/disable

6.pythonを使った操作

1.Node一覧取得

おさらいですが基本の使い方は以下の通り。

curl -sk -u username:password -H "Content-Type: application/json" -X http-method uri  

メソッドは指定なしででGETとして動作するようです。users guideには-sが入ってませんでしたが、個人的な所感ですがヘッダーが邪魔なので-sつけてsilentにしています。

まずはどんなパラメータが取得できるか再確認。今回は/nodeと/poolを使用します。

$ curl -sk -u username:password https://192.168.1.1/mgmt/tm/ltm | sed 's/,/¥'$'¥n/g'
{"kind":"tm:ltm:ltmstate"
"selfLink":"https://localhost/mgmt/tm/ltm"
"partition":"/Common/"
"currentItemCount":22
"pageIndex":1
"startIndex":1
"totalItems":22
"totalPages":1
"items":[{"reference":{"link":"https://localhost/mgmt/tm/ltm/auth"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/data-group"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/dns"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/global-settings"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/html-rule"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/monitor"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/persistence"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/profile"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/default-node-monitor"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/ifile"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/nat"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/node"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/policy"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/policy-strategy"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/pool"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/rule"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/snat"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/snat-translation"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/snatpool"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/traffic-class"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/virtual"}}
{"reference":{"link":"https://localhost/mgmt/tm/ltm/virtual-address"}}]}

まずは/nodeを叩いてNode一覧をGETします。Partitionを指定しています。値の指定を間違えると/Commom/で返ってくるので気をつけてください。

$ curl -sk -u username:password https://192.168.1.1/mgmt/tm/ltm/node?¥$partition=/Partition_name/ | sed 's/,/¥'$'¥n/g'
{"kind":"tm:ltm:node:nodestate"
"selfLink":"https://localhost/mgmt/tm/ltm/node?$partition=/Partition_name/"
"partition":"/Partition_name/"
"currentItemCount":21
"pageIndex":1
"startIndex":1
"totalItems":21
"totalPages":1
"items":[{"kind":"tm:ltm:node:nodestate"
"name":"192.168.100.100
"generation":0
"lastUpdatedMicros":0
"selfLink":"https://localhost/mgmt/tm/ltm/node/192.168.100.100?$partition=/Partition_name/"
"address":"192.168.100.100
"connectionLimit":0
"description":"test-server_100"
"dynamicRatio":1
"monitor":"default"
"rateLimit":"disabled"
"ratio":1
"session":"user-enabled"
"state":"unchecked"}
{"kind":"tm:ltm:node:nodestate"
"name":"192.168.1000.101"
"generation":0
"lastUpdatedMicros":0
"selfLink":"https://localhost/mgmt/tm/ltm/node/192.168.100.101$partition=/Partition_name/"
"address":"192.168.100.101"
"connectionLimit":0
"description":"test-server_101"
"dynamicRatio":1
"monitor":"default"
"rateLimit":"disabled"
"ratio":1
"session":"user-enabled"
"state":"unchecked"}

Tips:jqコマンドによるjsonデータの整形

この話だけで1つ記事を作れそうですが、json形式ならjqコマンドを使って表示・フィルターするのがオススメです。使い方は簡単で | jq . をつけるだけです。以下の例を見るとわかると思うのですが、キレイに並んでますよね。コンソールで見ると色づけもしてくれるので非常に見やすいです。もちろん見やすいだけではないので、以降の項目に織り交ぜてご紹介していきます。

$curl -sk -u username:password https://192.168.1.1/mgmt/tm/ltm/node?¥$partition=/Partition_name/ | jq .
{
  "items": [
    {
      "state": "unchecked",
      "session": "user-enabled",
      "ratio": 1,
      "rateLimit": "disabled",
      "monitor": "default",
      "dynamicRatio": 1,
      "kind": "tm:ltm:node:nodestate",
      "name": "192.168.100.100",
      "generation": 0,
      "lastUpdatedMicros": 0,
      "selfLink": "https://localhost/mgmt/tm/ltm/node/192.168.100.100?$partition=/Partition_name/",
      "address": "192.168.100.100,
      "connectionLimit": 0,
      "description": "test-server_100"
    },

(使ってない人は)

$ yum -y install jq

2.Node追加

次は追加ですが、今までmethodにGETを使用してきたものをPOSTに変更します。icontrol(API)でやりとりをする時のメリットの一つで非常にシンプルでわかりやすい体系になっています。

要はGETをPOSTに変えて必要なパラメータをjson形式で渡せば良いということです。

具体的には以下の通りです。

$ curl -sk -u username:password  -H "Content-Type: application/json" -X POST -d '{"name":"192.168.100.102","address":"192.168.100.102","description":"test-server_new102"}' https://192.168.100.102/mgmt/tm/ltm/node?¥$partition=/Partition_name/ | jq .
{
  "state": "unchecked",
  "session": "user-enabled",
  "ratio": 1,
  "rateLimit": "disabled",
  "monitor": "default",
  "dynamicRatio": 1,
  "description": "test-server_new102,
  "kind": "tm:ltm:node:nodestate",
  "name": "192.168.100.102",
  "generation": 0,
  "lastUpdatedMicros": 0,
  "selfLink": "https://localhost/mgmt/tm/ltm/node/192.168.100.102?$partition=/Partition_name/",
  "partition": "/Partition_name/",
  "address": "192.168.100.102,
  "connectionLimit": 0
}

GETした際はかなり多くのパラメータがあったかと思いますが、デフォルトで設定がされる箇所はなしで必須項目と自分が設定したい箇所を選んでPOSTしています。POSTに成功するとjson形式で設定値が返ってきます。"selfLink"のパラメータを叩くと確認が取れます(※localhost部分は適宜変更) 他に良く使うパラメータは"session"と"ratio"あたりでしょうか。

3.Pool一覧取得

次はPoolの一覧です。どんなkeyを持っているのかjsonで返ってくるサンプルを記載しようかと思いましたが、かなり長くなって来ましたのでjqコマンドでpool名だけフィルターした出力結果にしておきます。jqコマンドを使うと便利ということが少しは伝わるでしょうか。

$ curl -sk -u username:password https://192.168.1.1/mgmt/tm/ltm/pool?¥$partition=/Partition_name/ | jq '.items[] | .name ' | nl -v 0
     0  "PoolA"
     1  "PoolB"
     2  "PoolC"
         (略)
    20  "Pool_Test1
    21  "Pool_Test2"

$ curl -sk -u username:password https://192.168.1.1/mgmt/tm/ltm/pool?¥$partition=/Partition_name/ | jq .items[21]
{
  "membersReference": {
    "link": "https://localhost/mgmt/tm/ltm/pool/Pool_Test2/members?$partition=/Partition_name/"
  },
  "slowRampTime": 10,
  "reselectTries": 0,
  "queueTimeLimit": 0,
  "queueOnConnectionLimit": "disabled",
  "queueDepthLimit": 0,
  "monitor": "/Common/tcp ",
  "minUpMembersChecking": "disabled",
  "ignorePersistedWeight": "disabled",
  "allowSnat": "yes",
  "allowNat": "yes",
  "selfLink": "https://localhost/mgmt/tm/ltm/pool/Pool_Test2?$partition=/Partition_name/",
  "lastUpdatedMicros": 0,
  "generation": 0,
  "name": "Pool_Test2",
  "kind": "tm:ltm:pool:poolstate",
  "ipTosToClient": "pass-through",
  "ipTosToServer": "pass-through",
  "linkQosToClient": "pass-through",
  "linkQosToServer": "pass-through",
  "loadBalancingMode": "round-robin",
  "minActiveMembers": 0,
  "minUpMembers": 0,
  "minUpMembersAction": "failover"
}

4.Pool member追加

Poolへのmember追加も記載しておきます。出力結果は省略していますが、対象のmemberの変更後のデータがjson形式で出力されます。

$curl -sk -u username:password  -H "Content-Type: application/json" -X POST -d '{"name":"192.168.100.102:8080"}' https://192.168.1.1/mgmt/tm/ltm/pool/Pool_Test2/members?¥$partition=/Partition_name/ | jq .

5.Node,memberのenable/disable

ここではPUTを使います。既に存在するデータに対してデータの書き換えを行います。

■Pool memberのenableと確認

$ curl -sk -u username:password  -H "Content-Type: application/json" -X PUT -d '{"session": "user-enabled"}' https://192.168.1.1/mgmt/tm/ltm/pool/Pool_Test2/members/192.168.100.102:8080?¥$partition=/Partition_name/ | jq .

$ curl -sk -u username:password https://192.168.1.1/mgmt/tm/ltm/pool/Pool_Test2/members?¥$partition=/Partition_name/ | jq ".items[] | {name, state, session}" 

■Nodeのenableと確認

$ curl -sk -u username:password  -H "Content-Type: application/json" -X PUT -d '{"session": "user-enabled"}' https://192.168.1.1/mgmt/tm/ltm/node/192.168.100.102?¥$partition=/Partition_name/ | jq .

$ curl -sk -u username:password https://192.168.1.1/mgmt/tm/ltm/node/?¥$partition=/Partition_name/ | jq ".items[] | {name,state,session}"

GUIのStatusと確認結果の出力を見比べればわかると思いますが、Nodeのステータス表です。
Poolはこのnodeのステータスも関連してくるので少し複雑です。

  • GUI: Enabled
    {"state": "unchecked", "session": "user-enabled"}

  • GUI: Disabled {"state": "unchecked", "session": "user-disabled"}

  • GUI: Forced Offline
    {"state": "user-down", "session": "user-disabled"}

6.pythonを使った操作

実際にpythonで書いてみます。後々にZabbix APIを用いたweb uiに統合したいと思います。
pythonのモジュールとしてpycontrolが提供されていますが、ここではスタンダードにjsonとrequestsを使って記述します。
requestsを使っているのでBasic認証部分とjsonデータの取り出しは楽です。

$ cat big-ip_nodeget.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json
import requests

## create url ##

username = "username"
password = "password"
partition = "/partition_name/"

node_get_url = "https://192.168.1.1/mgmt/tm/ltm/node?$partition=%s" % (partition)
#print node_get_url

## get node data ##

node_data = requests.get(node_get_url, auth=(username, password), verify=False)
print node_data.json()

まだこの段階ではjson形式の返り値を表示しているのみです。Node一覧やPool内のMember一覧はjobに組み込んだり、Nodeのdisable状態での作成は通常のApplication Editorの権限ではできないので少なからずニーズがありそうですね。

API活用していくために言語は一つマスターしておきたいところです。私は少しづつですが参考書を使ってpythonを勉強を進めています。

シェアして頂けると嬉しいです。

参考になったという方がいれば是非お願いしますm( )m
モチベーション維持の観点で非常に励みになります。

このエントリーをはてなブックマークに追加

Pythonスタートブック

Pythonスタートブック

パーフェクトPython (PERFECT SERIES 5)

パーフェクトPython (PERFECT SERIES 5)