ソーシャルネットワーク事業部の、jyukutyoこと阪田です。Firewall越しにVisualVMを接続しようとして少しハマったことを思い出し、記事にしよう!と思い立ちました。VisualVMについてまとまっているWebページは多くあります。リモート接続そしてFirewall越しとなるとなかなかまとまったものはありませんでした。お役に立てれば幸いです。アプリケーションに関する詳細情報を表示したり、それらのアプリケーションのトラブルシューティングやプロファイリングを行なったりするためのビジュアルインタフェースを提供するツール」です(http://docs.oracle.com/javase/jp/7/technotes/guides/visualvm/)。7から標準で付属しています。そのため、JAVA_HOME/binにパスが通っていれば「jvisualvm」というコマンドを実行するだけでVisualVMを起動できます。Serverなどのアプリケーションサーバを含む)の情報を取得することができます。具体的にはCPU使用率やヒープ、Metaspace(PermGen)、クラスやスレッドなどの情報が取得できます。Firewall越しにリモート接続さて、VisualVMについてはこれぐらいにして、本題に入ります。Firewallがあり特定のポートしか開いていない場合、オプションでポート番号を指定して接続できる...わけですが、すんなりいきません。-Dcom.sun.management.jmxremote.port=9999</code>ここでは9999ポートが開いているとして、上記のようにポート番号を指定しました。VisualVMでこのポート指定しても、接続できません。VisualVMはRMIでJVMに接続するのですが、実はRMIは2つのポートを利用するのです。RMIレジストリポートとRMIサーバポートRMIのクライアントは、まずRMIレジストリポートへ接続します。その後レジストリからスタブが取り出され、そのポートがサーバポートとして実際の通信に使われます。以前はそのポートは不明で、指定することができませんでした。指定できないためFirewall環境下ではRMI接続ができず、VisualVMは利用できません。4以降は、オプションでRMIサーバポートを指定できるようになりました。-Dcom.sun.management.jmxremote.rmi.port=9999</code>なお、com.sun.management.jmxremote.portとcom.sun.management.jmxremote.rmi.portにまったく同じポートを指定できます。ポートが1つ開いてさえいれば、大丈夫です!ただし、インターネット上に公開しているサーバならセキュリティ上の観点からcom.sun.management.jmxremote.authenticate=trueとし(またはこのオプションを指定せず、デフォルトのtrueとして使用し)、パスワードファイルを作成してcom.sun.management.jmxremote.password.fileオプションでパスワードファイルへのパスを指定しましょう。これで接続にユーザ名とパスワードが必要となります。VisualVM起動!さあ、今すぐjvisualvmコマンドを実行して、VisualVMを起動しましょう!使い方は簡単です。画面上のボタンを押せば、CPU使用率やヒープ、Metaspace(PermGen)、クラスやスレッドなどの情報を数値やグラフを見ることができます。http://hirt.se/blog/?p=289Tweet2014年11月4日Vagrantで簡単Ansible実行環境を配布するAnsibleProvisioningVagrantこんにちは。最近、英語の勉強にハマっている国平です。私の部署ではサーバのBashのバージョンアップを1台ずつログインして手動で実行していました。このバージョンアップ作業自体は1コマンドで完了するのですが、サーバ台数が多く1台ずつに順にsshでログインしコマンドを実行するのは結構な手間が掛かりました。そこでAnsibleを使って複数のサーバの状態をまとめて変更できるようにしました。Ansibleによるサーバの管理自体は資料も多くすぐに実行出来ました。現在では非常に多くの優れた資料が公開されていますので、Ansibleを利用する事自体はそれほど難しくないかと思います。次の課題としてチーム全員がAnsibleを利用できるようにしなくてはいけません。Vagrantを利用して実行環境も含めてGitで管理し、配布できるようにしました。今回のポイント今回の課題は、チーム全員が簡単にAnsible実行環境を使えるようにするということです。便利で配布がしやすくなりそうです。Ansibleがインストール済みで、Playbookも利用できる仮想マシンにアクセスできるような仕組みづくりを行いました。AnsibleとはAnsibleはリモートマシンのあるべき状態をPlaybookというファイルに記述し、実行する事で、リモートマシンの環境を整えるツールです。以前にもこのブログの記事でも取り上げました。最近では急速に普及が進んで、利用するための情報も多く公開されていますし、電子書籍ですが入門Ansibleという本も公開されています。VagrantとはVagrantは仮想環境をコマンドラインから利用するツールです。仮想マシンの起動時にShellスクリプトやChef、Puppetなどを利用してプロビジョニングを行う事も出来ます。いった設定を全てVagrantfileにRubyのDSLとして記述する事ができるので、Vagrantfileとプロビジョニングに使うファイルをGitにコミットしておけば、どこからでも同一状態の仮想マシンを利用する事が出来ます。今回は、PlaybookとVagrantfile、そして仮想マシンのプロビジョニングファイルを1つのGitリポジトリにまとめてコミットしておきます。プロビジョニングには、チームメンバーが誰でも読み書きできる前提で、Shellスクリプトを利用することにしました。今回作成したGitリポジトリのサンプルはこちらです。仮想環境構築のポイントVagrantで仮想環境を複数人で利用するためのポイントは下記の3点です。Boxを自動的に取得するようにする仮想マシンを起動したら自動でPlaybookを実行できるようにするBoxを自動的に取得するようにするVagrantでは仮想マシンの起動の際にベースとなるイメージファイルをBoxと呼びます。チームメンバーが個々にBoxを取得するのも面倒です。指定したBoxが存在しなければ、指定したURLからBoxを取得して起動するようになります。いう名前で利用できるように設定しています。"https://github.com/2creatives/vagrant-centos/releases/download/v6.4.2/centos64-x86_64-20140116.box"</code>仮想マシンを起動したら自動でPlaybookを実行できるようにするこの処理には2つのポイントがあります。ホストのディレクトリを同期まずは、仮想マシンとホストマシンのディレクトリを同期する設定をします。設定すると、ホストマシンの指定したディレクトリを、仮想マシンから参照できるようになります。ディレクトリとして扱う事が出来ます。"/playbook"</code>仮想マシンをShellプロビジョニングもう一つのポイントは、Vagrantのプロビジョニング機能を利用して仮想マシンにAnsibleやその実行のために必要なツールをインストールすることです。Vagrantでは前述の通り仮想マシンの新規起動時にシェルスクリプトなどの実行をさせる事ができます。先ほど同期したリポジトリ内に、Ansibleのインストールなどを行う処理をまとめたシェルスクリプトを用意しておいて、実行するようにします。今回は、リポジトリ内のvagrantディレクトリに置いてある、bootstrap.shを実行するようにします。"bootstrap.sh"</code>bootstrap.shは下記のような内容になっています。/etc/ssh/ssh_config'</code>Ansibleを実行するサンプルリポジトリを使ってAnsibleを実行してみます。オプションをつけて明示的にsshを利用するようにしています。このサンプルは、Vagrantが利用できる事が前提となっています。vagrantと入力する</code>上記のコマンドを順に実行すると仮想マシンが立ち上がり、接続し、そしてplaybookが実行出来ます。まとめ今回の記事ではAnsibleの実行環境をVagrantを利用して配布しました。これによって、チームメンバー全員が簡単にAnsibleを利用する事ができます。サーバ環境だけでなく、実行環境にもべき等性を持たせる事が出来ました。これでチームメンバーのローカルマシンの設定の差に影響を受けずに作業する事ができます。