ao-log

インフラ系ITエンジニアのメモ帳です。

Windows 上で Vagrant を用いて仮想ゲストを起動するところまで

Chef の情報を得るために、伊藤直也さんの『入門Chef Solo (Amazon.co.jp: 入門Chef Solo - Infrastructure as Code eBook: 伊藤直也: Kindleストア)』を読んでいると Vagrant というソフトの情報がありました。

動作検証用の仮想ゲストをお手軽操作でさくっと作れるソフト。プラグインを使えばスナップショットも取れるので、試行錯誤したいときに便利そう! 実機で検証している場合、再起動が入るだけで間が空いてテンポが悪くなるので、Vagrant はすごくありがたいものに見えました。OpenStack のようなプライベートクラウド構築系のソフトで、検証用ノード作成も考えたのですが、ちょっと大げさすぎると思っていました。


さっそく自分のマシンに入れてみるのですが、どうも各所で得た情報通りさくっといかず。理由は、私のマシンが Windows だったから。特に SSH クライアントが入っていない点が Linux, Mac と異なるところですね。

備忘録までに、仮想ゲストの起動までの手順を残しておきます。


(1) Virtual Box のインストール

※ ちなみに、Virtual Box 4.2.0 で検証していると、後の仮想ゲストの起動時にエラー終了したので、4.2.16 に update しています。

(2) Vagrant のインストール

公式サイトから、インストーラをダウンロードし、インストール(Vagrant_1.2.7.msi
http://downloads.vagrantup.com/

(3) 使用する仮想ゲストの雛形の選定

仮想ゲストは、まずはお試しということで、CentOS 32bit を選定。
powershell を起動し、次のコマンドで CentOS 32bit の box をダウンロードして追加。

$ vagrant box add centos_32 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-i386-v20130427.box
Downloading or copying the box...
[0KExtracting box...ate: 83545/s, Estimated time remaining: --:--:--)
Successfully added box 'centos_32' with provider 'virtualbox'!

仮想ゲストには様々な OS を使用できます。次のサイトでは OS の一覧を確認でき、ダウンロード URL をコピーできます。

A list of base boxes for Vagrant - Vagrantbox.es

利用可能なボックスを確認すると、確かに追加されています。

$ vagrant box list
centos_32 (virtualbox)

(4) セットアップ

公式ドキュメントの通り、セットアップを進めていきます。

http://docs.vagrantup.com/v2/getting-started/project_setup.html

$ mkdir centos_32
$ cd centos_32

vagrant init すると「Vagrantfile」というファイルが生成されます。

$ vagrant init centos_32
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

「Vagrantfile」中の、次の行のコメントを解除しておきます。
この場合、仮想ゲストの IP アドレスは 192.168.33.10 になります。

config.vm.network :private_network, ip: "192.168.33.10"

(5) 仮想ゲストの起動

いよいよ、vagrant up で仮想ゲストを起動。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'centos_32'...
[0K[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Configuring and enabling network interfaces...
[default] Mounting shared folders...
[default] -- /vagrant

(6) ssh 接続

vagrant ssh で仮想ゲストに接続したいですが、Windows には素で ssh クライアントが入っていないので… putty で接続することにします。

(6.1) 次の URL から、puttygen.exe と putty.exe をダウンロード。

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

(6.2) PPK 鍵の作成

ホームディレクトリ下に「.vagrant.d」というフォルダがあります。フォルダ内に、「insecure_private_key」をいうファイルがあるので、 puyttygen で読み込み、「Save private key」から、適当な名前で PPK 鍵を保存。

(6.3) putty から ssh 接続

putty を起動し、接続先 IP アドレス「192.168.33.10」、ポート番号「2222」を指定し、(6.2) で作成した PPK 鍵を指定。ログイン名「vagrant」を入力し、ログイン成功です。

login as: vagrant
Authenticating with public key "imported-openssh-key"
Welcome to your Vagrant-built virtual machine.
[vagrant@localhost ~]$

python 2.6 の subprocess で wait() を使うと子プロセスが defunct してしまう

python 内部から、OS のコマンドを実行したい場合は、os.system や subprocess モジュールを用います。subprocess モジュールを用いて、コマンド実行終了を Popen.wait() で待つような実装をしていたのですが、いざ動かしてみると問題が。

OS のコマンドから、大量の子プロセスが生成されるような処理をしており、生成する子プロセスが少ないとうまくいくのですが、500 個くらいの子プロセスを実行したあたりで、子プロセスが defunct してしまい、そこで処理が固まってしまってます。

どう対応すべきか、すぐ分からなかったのですが、ドキュメントを見ると、次の記述が。

子プロセスが stdout もしくは stderr パイプに対してブロックするまで出力し、 OSのパイプバッファが送信可能になるまで待つ場合、このメソッドを呼ぶとデッドロックします。これを避けるために、 communicate() を利用してください。
http://docs.python.jp/2.6/library/subprocess.html より

Popen.wait() → Popen.communicate() に書き換えることで解決しました。

python 2.6 の ConfigParser で順序付き辞書を使う方法

ConfiParser で順序付き辞書を使いたかったのに、少しはまってしまったので、メモ。

Python では、言語に標準で、次のような設定ファイルを解析して、設定内容を読み込める便利なモジュールがあります。ConfigParser です。

[section]
key_001 = value_001
key_002 = value_002

[section] の設定内容をリストで受け取る場合は、次のように書きます。

import ConfigParser

config = ConfigParser.ConfigParser()
config.readfp(open("test.cfg"))
print config.items("section")

実行すると、次のようにリストで結果を得られます。

[('key_001', 'value_001'), ('key_002', 'value_002')]

v2.7 の場合、デフォルトの dict_type は collections.OrderedDict を使います。そのため、特に意識しなくても、得られるリストの内容は設定ファイルに上から読んだものになります。ただ、v2.6 の場合は、順序を記憶しない辞書なので、リストを得たとき順番の情報が消えてしまいます。

v2.6 での対応としては、少々荒っぽいやり方ですが、v2.7 系のソースを入手し、ConfigParser と collections を v2.7 のものを import することで、順序つきの辞書を使えるようになります。他にも、v2.6 の ConfigParser を継承したクラスを作って処理をラッピングするなど、色々と手はありそうです。

openSUSE 12.3 で Jenkins - パスワードリセット

Jenkinsでユーザ権限設定を誤って、ログインできなくなってしまう愚を犯したので、回復方法を探してみた。

対応としては、参考サイトで載せられていた方法で対応できました。感謝です。

<authroizationStrategy>や<securityRealm>をコメントアウトすることで、無効化できた。

私の場合は、バックアップをとった後、該当行をすべて削除し、jenkins サービスを再起動するというちょっと荒っぽいやり方ですが・・・
設定ファイルは、openSUSE でも、/var/lib/jenkins/config.xml です。

================================================
【参考サイト】
○エンジニアきまぐれTips:Jenkins パスワードのリセット方法
http://d.hatena.ne.jp/okinaka/20120404/1333524730

日経コンピュータ2013年5月2日号「ビッグデータは99%失敗する」を読んで

日経コンピュータ2013年5月2日号  p.137 「ビッグデータは99%失敗する」を読んでの感想。
http://itpro.nikkeibp.co.jp/article/COLUMN/20130508/475341/?top_tl1

挑発的な内容ですが、非常に納得できる記事でした。

ビッグデータという言葉が先行していて、重要なキーワードになっていますが、どうも言葉だけが踊っているような印象をずっと持っていました。

ビッグデータというと、よく3V(Volume、Variety、Velocity)がキーワードとして挙げられます。なんとなくお宝ざっくざくなイメージを受けるのですが、この中にどれほどの価値が詰まっているのか。ハーバードビジネスレビューのビッグデータの回でも見かけたのですが、ビッグデータは価値の密度が低い。なので、単純にデータの大きさに比例して価値が上がっていく世界ではなく、しかも密度が低い中から勝ちパターンにつながるような因果関係を見つけるのは実に難しい。

また、ビッグデータの解析は所詮、情報戦略のコンポーネントの一つに過ぎません。なので、情報戦略という幹の部分がしっかりしていないとだめで、どういう意思決定をしていきたいのか、そのためにどういうデータを蓄積する必要があるか、そしてそれをどう分析し仮説をたてストーリーを作っていくかといった、経営レベルでのライフサイクルをしっかり考えて、体制を整えていないと、ろくな成果は出ないと思っています。少なくともビッグではない従来のシステムで成果が出ないうちは、ビッグデータに手を出しても大した投資対効果は出ないと考えるのが自然です。もちろんAmazonなどの事例のように有効に活用できれば素晴らしいですが、果たしてそれが出来るかどうか。

黎明期でシェアが伸びている技術は、成功事例だけがピックアップされがちな感じがするのですが、失敗事例はどれくらいなのか、成功している割合は全体のどれくらいなのか、失敗から得られる教訓はどんなことがあるかも情報を収集したいところですね。感覚論ですが成功事例に対する失敗事例の伝達速度が遅い気がしています。

私は技術者なのでビッグデータはとても面白い題材だと感じていますが、ユーザ視点から見るとネガティブに見てしまいますね。

書籍レビュー『Googleがほしがるスマート脳のつくり方 ニューエコノミーを生き抜くために知っておきたい入社試験の回答のコツ』

Googleが採用面接で出題している、様々なジャンルの難題と解答が載せられた本です。どういう問題が出るのだろうと、好奇心で買ってみました。

私もそれぞれ解いてみました。知っていれば解ける問題はまずなく、どれも試行錯誤が必要な問題ばかりです。自分なりに答えを出してみても、本書の解答では、よりスマートに切れ味のよい回答が載っていて、最善の解にたどりつくのは至難の業だと思います。ちょっと考えただけでは、どういうアプローチを取ればいいかまったくわからない問題も多数。ただ、本書によるととにかく色々なアプローチを思いつくだけ考えて、試行錯誤しつつも、よりベターな答えは無いか模索する姿勢が重要らしいです。
問題は、数学の問題(組合せの数から、調和級数のようなものまで。オイラーの等式など当たり前のように知っていないといけない)、大学の情報系学生が習うようなアルゴリズムの知識を生かす問題(二分探索のような基礎的なものから、グレイコード、最近点対問題のような情報系専攻外の人は聞いたことがないようなものまで)、フェルミ推定、柔軟な発想を問うものまで様々です。
これらの問題は、ブレーンストーミングや、ロジカルシンキングの練習に、あるいは普段仕事で数学的な思考が求められる人にとっては、思考を強化する材料として役立つのではと思います。

Googleで採用を承認するまでのプロセス、問題の出題意図、また誤採用をなくすための思想も詳しく解説されています。そのため、人事の人にもお勧めできる本です。

ちなみに、Googleがためこんでいるデータを分析したところ、コンピュータに早くから触れていた人ほど、入社後の業績がいいらしいです。

書籍レビュー『コンサルタントの「質問力」』

ITストラテジスト受験にあたっての知識習得を目的に購入した一冊。そもそも、コンサルタントは普段何をしているのか、あまりよく知らないので、知っておきたいという動機もありました。

コンサルタントの仕事といえば、顧客の抱える悩みや問題点、あるいは目標・夢実現に迫るために、ゴールへの橋渡しをすることと理解しています。そのためにコンサルタントには優れた質問力が必要となりますが、ここで、そもそも「質問力」とは何なのか。筆者は「仮説力」「本質力」「シナリオ力」から構成されると主張しています。十分練り上げた仮説を立て、質問の中から本質をえぐりだし、なおかつそれらの質問をゴールに向かって組み立てるためのシナリオ力。この 3 つの力に関して、筆者の豊富で高レベルな経験を交えて、読みやすく解説されています。
ただ、実例に凄みがあるというか、常人が行うには難しい内容も多く、逆にだからこそ、励みになる内容でした。少なくともロジカルシンキング、2軸分析あたりのフレームは、現場レベルのエンジニアでもそこそこ使って、顧客への質問事項に活かせていければいいかなと思ったのですが、日々訓練しないとモノにならなさそうですね。

ちなみに、本書の最後の一文「質問力なきコンサルタントやビジネスパーソンは、プロフェッショナルとはいえない」はグサッと来るものがあります。自分が、お客様のために、本気で考えて、問題点に切り込む本質的な質問をできているかというと、、、うーむ、まだまだ酷い水準だ。ちょっとでも貢献できるようにがんばろう。