[IDCF]負荷試験用のjmeter実行環境を構築したときにCloudStackAPIを捏ね繰り回したお話し
インフラエンジニアの寺岡です。
とある案件でIDCF上にjmeterの実行環境を構築する必要があったのですが
構築の段階でCloudStackAPIを用いて工夫した部分がありますのでご紹介します。
■そもそも何をやりたかったのか
jmaterのコントローラの役割をするサーバでjmeterを起動したときに
対応するノードの役割をするサーバのIPアドレスを自動認識するように設定したかった
はい、つまりそういうことです。
jmeterにはリモートテストという仕組みがあって
コントローラとなるサーバの設定ファイルに
リモートのjmeterが動作しているサーバ(ノード)を登録しておくことで
登録した台数分より多くの負荷を生成することができるようになります。
ただ、生成する負荷に応じて登録するサーバの台数も変わって
その度に設定ファイルを変更するのは面倒なので
稼働しているノードのみを判別して
コントローラ側でjmeterを起動する際に
設定ファイルを自動で書き換えるようにしました。
■具体的に何をしたのか
jmeterにリモートのサーバを登録する場合
「jmeter.properties」というファイルの「remote_hosts」という項目に設定を追加します。
例を示すと以下のようになります↓
remote_hosts=10.31.X.XX,10.31.X.XX,10.31.X.XX
上記のようにIPアドレスを「,」区切りで追加していくことになりますので
まずは、リモートのサーバのIPアドレスを一括で取得する必要があります。
これを取得する際に、CloudStackAPIを利用しました。
CloudStackAPIはpythonで記述されているのでpipを使うと比較的簡単に導入することができます。
導入方法はIDCFの公式ページに記載されているのでそちら参考にすると良いです。
APIのリファレンスも公式ページにまとめられていますので有難く拝見させていただきましょう。
ではさっそく。
リモートのサーバのIPアドレスを一括取得するためのコマンドはこちらです↓
cloudstack-api listVirtualMachines --name "jmeter-node" --state "Running" | jq -r '.listvirtualmachinesresponse.virtualmachine[].nic[].ipaddress' | tr "\n" "," | sed -e "s/,$//g"
このコマンドで行っていることを分割すると以下のようになります。
①CloudStackAPIを用いて仮想サーバの情報の一覧を取得する
②jqコマンドを用いて、jsonデータを整形する
③整形したjsonデータをtrコマンドで「,」区切りの書式に整形する
①CloudStackAPIを用いて仮想サーバの情報の一覧を取得する
cloudstack-api listVirtualMachines --name "jmeter-node" --state "Running"
この部分。
今回「CloudStackAPI」の数あるメソッドの中で「listVirtualMachines」を利用しました。
読んで字のごとく、「仮想サーバの情報の一覧」を取得するメソッドです。
このメソッドの実行結果は以下のようなjson形式で返ってきます。
$ cloudstack-api listVirtualMachines { "listvirtualmachinesresponse": { "count": 1, "virtualmachine": [ { "nic": [ { "ipaddress": "XXX.XXX.XXX.XXX" } ] } ] } }
※「ipaddress」以外にも多数の項目がレスポンスとして返却されますが
今回の記事で必要な部分のみを抜粋しました。
このjsonデータから「ipaddress」という項目の値を取り出せば良いという寸法ですね!
実際にコマンドを実行する場合は「--name」でノードとなるサーバのみに絞り
さらにその中から仮想サーバの状態がRunningのものを「--state」で絞ります。
「停止しているものは除き、稼働しているノードの情報のみを取り出す」ということですね。
②jqコマンドを用いて、jsonデータを整形する
jq -r '.listvirtualmachinesresponse.virtualmachine[].nic[].ipaddress'
この部分。
CloudStackAPIのレスポンスがjsonデータで返ってくるので
その中から取得したいデータのみを取り出せるようにjsonデータを整形しなければなりません。
今回の場合は、「ipaddress」という項目ですね。
jqコマンドにjsonから取り出すデータを階層構造で教えてあげます。
③整形したjsonデータをtrコマンドで「,」区切りの書式に整形する
tr "\n" "," | sed -e "s/,$//g"
この部分。
②でjsonデータを整形すると、以下のような書式になります。
10.31.X.XX 10.31.X.XX 10.31.X.XX
・・・・ご丁寧に改行されるんですよね。
このままではjmeterの設定ファイルに埋め込むことができないので
改行コードを「,」に変換してあげる必要があります。
また、変換を行うと末尾に余計な「,」が追加されてしまうので
sedコマンドでその部分を削除します。
すると・・・
10.31.X.XX,10.31.X.XX,10.31.X.XX
お見事、これでそのまま設定ファイルに埋め込むことができます。
後はjmeterを起動する前に設定ファイルを編集します。
簡単に起動スクリプトを作成してしまいましょう。
$ vi start-controller.sh #!/bin/sh NODE=$(cloudstack-api listVirtualMachines --name "jmeter-node" --state "Running" | jq -r '.listvirtualmachinesresponse.virtualmachine[].nic[].ipaddress' | tr "\n" "," | sed -e "s/,$//g") sed -i -e "s/^remote_hosts=.*/remote_hosts=${NODE}/" /usr/local/jmeter/bin/jmeter.properties /usr/local/jmeter/bin/jmeter & $ ./start-controller.sh
はい、これでjmeterを起動したときにノードが自動認識されるようになります。
以上です、ありがとうございました。