【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【予約システム開発】EDISONE カスタマイズ開発サービス

【予約システム開発】EDISONE カスタマイズ開発サービス

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【200ヶ国以上に対応】グローバル eSIM「ビヨンドSIM」

【200ヶ国以上に対応】グローバル eSIM「ビヨンドSIM」

【中国への旅行・出張・駐在なら】中国SIMサービス「チョコSIM」

【中国への旅行・出張・駐在なら】中国SIMサービス「チョコSIM」

【グローバル専用サービス】北米・中国でも、ビヨンドのMSP

【グローバル専用サービス】北米・中国でも、ビヨンドのMSP

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

[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の公式ページに記載されているのでそちら参考にすると良いです。

Getting Started | IDCFドキュメント

APIのリファレンスも公式ページにまとめられていますので有難く拝見させていただきましょう。

API References | IDCFドキュメント

ではさっそく。
リモートのサーバの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を起動したときにノードが自動認識されるようになります。
以上です、ありがとうございました。

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
0
読み込み中...
0 票, 平均: 0.00 / 10
759
X facebook はてなブックマーク pocket
【2025.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

【2025.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

この記事をかいた人

About the author

寺岡佑樹

2016年ビヨンド入社、現在6年目のインフラエンジニア
MSPの中の人として障害対応時のトラブルシューティングを行いながら
AWSなどのパブリッククラウドを用いたインフラの設計/構築も行っている。
最近はDockerやKubernetesなどのコンテナ基盤の構築や
運用自動化の一環としてTerraformやPackerなどのHashicorpツールを扱うことが多く
外部の勉強会やセミナーで登壇するEvangelistの役割も担っている。

・GitHub
https://github.com/nezumisannn

・登壇経歴
https://github.com/nezumisannn/my-profile

・発表資料(SpeakerDeck)
https://speakerdeck.com/nezumisannn

・所有資格
AWS Certified Solutions Architect - Associate
Google Cloud Professional Cloud Architect