会社にKVM環境を構築したのでメモしておく2 - ゲスト構築&運用編 -

会社にKVM環境を構築したのでメモしておく1 - ホスト構築編 - - CREATE INDEXの続き。

ゲスト構築

ディスクイメージ作成

一番無難なqcow2で作成します。qcow2は作成時に全容量を確保しないので、ディスクスペースを有効に活用できます。詳細オプションはこちらを参照して下さい。qemu-img(1): QEMU disk image utility - Linux man page

# cd /var/lib/libvirt/images/
# qemu-img create -f qcow2 testvm.img 64G
ゲスト起動&インストール

ゲストを起動します。ここではドメインとして"testvm"、仮想CPUとして2、仮想RAMを4G、vncポートを5900として起動しています。ホスト同様にCenOS6.2を使用するので、os-variantはrhel6を指定しています。noautoconsoleはvncへの接続はWindowsPCから行うので、ゲスト起動時にホストからvncに起動しに行くのを防ぐために指定しています。他詳細オプションはこちら。virt-install(1): provision new virtual machines - Linux man page

# virt-install \
-connect=qemu:///system \
--cdrom=/var/iso/CentOS-6.2-x86_64-minimal.iso \
--name=testvm \
--ram=4096 \
--vcpus=2 \
--disk path=/var/lib/libvirt/images/testvm.img,format=qcow2 \
--os-variant=rhel6 \
--accelerate \
--network=bridge:br0 \
--graphics vnc,port=5900,keymap=ja \
--noautoconsole \
--hvm \
--virt-type=kvm

あとはゲストにvncで繋いで通常通りOSインストールを進めればOKです。インストールが終わると一旦ゲストはシャットダウンされます(リブートを選んでいても)

運用

ゲスト一覧表示

ゲスト一覧を表示します。--allオプションをつけるとshutoff状態のゲストも表示してくれるので、普段からこちらを使うようにしておくのが良いでしょう。

# virsh list --all
 Id Name                 State
----------------------------------
  - testvm               shut off
ゲスト起動

ゲストのドメインを指定してvirsh startします。

# virsh start testvm
ゲスト自動起動

何らかの原因でホストを再起動した時にすべてのゲストを起動するのは面倒です。なので、ホスト起動時にゲストも起動するように設定しておきます。

# virsh autostart testvm

因みにゲストの自動起動をやめたい時は--disableオプションを付けます。

# virsh autostart --disable testvm
ゲストの設定を変えたい

virsh editコマンドを使います。viで直接xmlを編集しても反映されないので要注意です。

# virsh edit testvm
ゲストの削除

まず、virsh上でドメインを削除します。その後、このゲストのイメージファイルを削除すればOKです。

# virsh undefine testvm
# rm /var/lib/libvirt/images/testvm.img
ゲストのバックアップ&リストア

未検証ですがvirsh dumpxmlとvirsh create でできるみたいです。後日試します。

終わりに

ここまであればほぼ、KVMを使える状態にあるんじゃないかと思います。enjoy!

会社にKVM環境を構築したのでメモしておく1 - ホスト構築編 -

会社のサーバーを諸々整理するのにKVM使って構築したのでそのメモを残しておく(ホントはvmware esxiで構築したかったのだがハード発注には関わってなかったので、esxiで非サポートのRAIDボードが乗ってきたので断念)。

前提

ホストマシンにはCentOS 6.2 x86_64をminimal isoを使ってインストール。ホストマシンとゲストマシンは同一セグメント上に配置して使用することを想定。

設定

ネットワーク設定

BondingとBridge interfaceの設定してnetworkを再起動。IP等は社内の環境なので念のため伏せてます。Bondingの設定はKVMで使う場合はmode3(broadcast)の方がいいかも?というのもネット上では見かけたのですが、未検証なことと、瞬断がクリティカルとなる用途を想定していない環境だったので、mode1(active-backup)としています。

  • /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE="br0"
TYPE="Bridge"
IPADDR="xx.xx.xx.xx" 
NETMASK="xx.xx.xx.xx"
GATEWAY="xx.xx.xx.xx"
BROADCAST="xx.xx.xx.xx"
NM_CONTROLLED="no"
ONBOOT="yes"
BOOTPROTO="none"
USERCTL="no"
  • /etc/modprobe.d/bonding.conf
alias bond0 bonding
  • /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE="bond0"
NM_CONTROLLED="no"
ONBOOT="yes"
BOOTPROTO="none"
USERCTL="no"
BONDING_OPTS="mode=1 primary=eth0 miimon=100 updelay=5000"
BRIDGE="br0"
  • /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
HWADDR="xx:xx:xx:xx:xx:xx"
NM_CONTROLLED="no"
ONBOOT="yes"
BOOTPROTO="none"
MASTER="bond0"
SLAVE="yes"
USERCTL="no"
  • /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE="eth1"
HWADDR="xx:xx:xx:xx:xx:xx"
NM_CONTROLLED="no"
ONBOOT="yes"
BOOTPROTO="none"
MASTER="bond0"
SLAVE="yes"
USERCTL="no"
# service network restart

ネットワークケーブルを交互に抜き差しして、failoverがきちんと行われることを確認します。あわせてbrctl showでBridge interfaceがあることを確認します。

# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             xxxx.xxxxxxxxxxxx 
KVM設定

KVMに必要なパッケージをインストール&モジュールがロードされているのを確認。avahiがないとlibvirtdが立ち上がらないので、忘れずに入れる。

# yum groupinstall Virtualization "Virtualization Client" "Virtualization Platform" "Virtualization Tools" avahi
# lsmod | grep kvm
kvm_intel              50380  0
kvm                   305081  1 kvm_intel

ホストマシンシャットダウン時にゲストマシンもシャットダウンするように設定。

START_DELAY=20
ON_SHUTDOWN=shutdown
SHUTDOWN_TIMEOUT=180

デフォルト設定ではvnc127.0.0.1でlistenして、他のPCから繋がらないのでここを修正。今回は社内サーバーということで0.0.0.0でlistenするようにしていますが、環境にあわせて下さい。

vnc_listen = "0.0.0.0"

起動&自動起動on

# service messagebus start
# service avahi-daemon start
# service libvirtd start
# chkconfig messagebus on
# chkconfig avahi-daemon on
# chkconfig libvirtd on

ここまででKVM自体の設定は完成。ただこのままだと外部からvncへのポートが閉じられているのでiptablesの設定を変更します。

iptablesの設定

iptablesを無効にしている場合は省略)

A INPUT -p tcp --dport 5900:5910 -j ACCEPT
# service iptables restart

開けるポートは起動予定のゲスト数にあわせて適宜調整して下さい。

構築完了!

ここまで終われば後はゲストマシンを立ててあれこれできます。(長くなってしまったので、別エントリーに続く)

アジャイルサムライを読んだ。

読み終えたのは2月とかだったけど、その後何回か読み返してるし、自分の理解の整理も兼ねて感想をまとめておく。

キッカケ

今の上司がやたらと「プランを出せ」という人で、今までの仕事のやり方(主に社内B2Bでの経験)では行き詰まりを感じていた頃、twitterのTLに流れてきたのがこのエントリ。 Software Engineerにお勧めの技術書 - dann's blog - #

後発だけあってよくまとまってます。今からならこれから読むとよいかもしれません。

アジャイルはなんとなく理解しているつもりではいたけど、これを機にちゃんと勉強してみようと早速購入。

感想

まず、読みやすい。この手の技術書としてはビックリする程に読みやすい。ところどころ2ちゃんねる臭がするけど(これは翻訳の旨さだと思う)、これはこれでアリ。アジャイル本はこの本と、次に読んだ「アジャイルな見積りと計画づくり」しか読めていないけど、最初の取っ掛かりとしてはこっちの本がいいかなと。あと、この本は一度読んだらおしまい、という類の本ではなく、特にPM/PLをやっている人は計画づくりの3部、プロジェクト運営の4部は何度も目を通すことになるハズ(実際目を通している)なので、手元においておくことを是非オススメしたい。

アジャイルって何さ?

つまるところ「顧客に最高の価値を提供するために最善の努力をし続けること」というなんじゃないかなー、と。それをどうやって実現するか?というヒントはこの本にたくさん書かれているけど、あくまでヒントにすぎない、という理解。プロジェクトの状況によって最適な方法論は違って当然だし、その方法論を考え続ける(勿論最高の価値を提供するために!)、ということがアジャイルなんじゃないかな、と。と思ってたら、監訳者あとがきに全く同じことが書かれていた。

自分の頭で考えるのをやめちゃだめだ

DevOps Day Tokyo 2012に参加してきた。


GMOさんで開催された、DevOps Day Tokyo 2012に参加してきました。主催の@jhottaさん、会場提供のGMOさん、そしてスポンサー企業の皆様、本当にありがとうございました。あと、事前に資料を頂けなくてぶっつけ本番だった通訳さん、本当にお疲れ様でした。特にChef関連のセッションは大変だったと思います。

資料はFBファンページにあげられるということと、ust録画があるということで(@understeerさんに感謝!)、気になったポイントを箇条書きで。

  • 成功するアイデアは4%しか無い。だからアイデアに価値に変える活動であるDev/Opsは細かく行い継続的に改善することが必要。そのために自動化は必須。
  • 要件がFixすることはない。要件が決まらない中でいかに開発を進めていくかが重要。
  • PodcastのDevOps cafeオススメ。John WillisとDamon Edwardsでやってるよ!
  • crowbarはchefをベースにbare metalレイヤーのプロビジョニングを実現したもの。
  • crowbarのインストールすると(面倒くさい)Chefサーバーのインストールもカバーしてるのでオススメ。
  • Damonのdev2opsも読むべき。
  • Chefは近々dry-runをサポート、developer MLに入ることオススメ。

Open Space Session#2では僕はMonitoring & Metricsというセッションに参加。@jhottaさんに「最初のネタ出ししてw」と言われて、「リソース監視とビジネスメトリクスの可視化は取り組んでるんだけど…」というところからDamonが話を広げていく(というか一方的に喋るw)かたちで開始。Process monitoringが重要ということで、Ticket Trackingの他にデプロイや設定変更等のコマンド実行履歴や、そもそもサーバー上のファイル改ざんが起きていないかどうかもモニタリングすべきとのこと(TripwireやSplunkが使える)。そのためには、自動化が実現できてないといけないよー、という話。その次に自動化と継続的デリバリーをどう実現するか、に話題は移り、継続的デリバリーにはvisibility(上の話)、culture of testing、automationの3要素があるという話をしてくれました。culture of testingとは本番環境の変更に対するリスクを抑えるために変化は小さな単位で、しかも十分にテストしてから行う必要があり、それが強固なシステムを作ることに繋がるというお話。開発のアプローチとしてはTDDは必須とのこと。automationは下のレイヤーからBootstrap、Configuration、Orchestrationと3つのレイヤーからあるけど、ここへの取り組みは順番はあまり重要ではなく、やれるところから手をつけていけば良いとのこと。更に話はチームビルディングに飛び、devとopsに加えてProducer(アジャイル的には顧客かな?)が近いところでコミニュケーションをと取りながら仕事を進めていくのが重要、という話をしていることろでタイムアップとなりました。

Open Space Sessionが終わったところで@jhottaさんに「レポートよろしく」とまたも振られw,セッションのレポートをすることに。上に書いたことを何とか5分ぐらいで喋ってきました。

その後は懇親会にも参加。ust職人あるある〜インフラエンジニアあるあるで話が大盛上がりw。また、「日本だとDevOpsってOpsからDevへの一方的な片思いに近いよねー(なんとかしたい)」という話をしてきました。

ともあれ、9:30〜21:00と長丁場でしたが、内容は非常に濃く、ここで得たものを色々フィードバックしたいと思ってます。次(来年?)はDay"s"にしたい!という話もあり、非常に楽しみにしています!

Linuxエンジニア養成読本

ずーっと積み本してたんですが英語の勉強が一段楽したこともあり、夏休みの間に読もうと思って今日読み終えました。目次はこんな感じです。

1,5-7はlinux初心者向きだけど、2-4は勉強になりました。僕みたいにアプリエンジニアからサーバーエンジニアにクラスチェンジしたような人はカーネルの仕組みとかの基本的な部分が断片的な知識になってたりするので、その辺を整理する意味ではよい本でした。UpstartとかBtrfsとかの新しいこともちょっと紹介的なところもあり。価格も安いのでおススメです。

EC2上にgitサーバーを構築してみる

最近仕事上でコード書くこと機会が完全に無くなってしまい、その関係で開発環境構築なんてことをすることも無くなってしまったので(しくしく)、オレオレ開発環境を作ってみようと立ち上がってみました。

とりあえず、こんな前提の環境を作ってみようかと。

将来的にはCI環境構築まで持って行きたいところですが、まずは手に届く範囲から。

方針

gitosisはgitosisの設定自体もgitで管理するもので、リポジトリ毎のアカウント管理や、新規リポジトリの作成もリモートからできるものです。便利そうなので使ってみることにします。
具体的な手順は下記の通り。EC2(Amazon Linux)とEBSは立ててある前提です。

gitインストール

git自体はyumで入れます。

# yum install git

gitosisインストール

gitosisはgitで引っ張ってきて入れます。epelリポジトリにもあるのでそちらを使ってもいいかもしれません。

$ git clone git://eagain.net/gitosis.git
$ sudo python setup.py install

gitosis設定

gitosis用のユーザーを作成して、gitosisに公開鍵を登録します。今回はgitユーザーを作成し、ec2-userの公開鍵を登録することにします。ここで一つ注意なのが、gitosis用ユーザーのホームディレクトリ(/home/git)にリポジトリがあることが前提となっています。今回は/opt/gitをリポジトリディレクトリにしたかったので、シンボリックリンクで対応しています。

まず、/optの中身をEBSにコピーしてから、/optとしてマウントします。

$ sudo mount /dev/sdf /mnt
$ sudo mv -r /opt /mnt
$ sudo umount /mnt
$ sudo mount /dev/sdf /opt

/etc/fstabにも1行追加。

/dev/sdf    /opt        ext4    defaults,noatime  0   0

git用ディレクトリ作って、シンボリックリンクを張ります。

$ mkdir /opt/git
$ ln -s /opt/git /home/git/repositories

gitユーザーに公開鍵を登録します。

$ sudo -H -u git gitosis-init < ~ec2-user/authorized_keys

post-updateの実行ビットが立っていないので、設定します。

$ chmod 755 /opt/git/gitosis-admin.git/hooks/post-update

とりあえず、サーバーの構築はこれで完了です。

接続確認

接続してみます。

$ ssh git@localhost
PTY allocation request failed on channel 0
ERROR:gitosis.serve.main:Need SSH_ORIGINAL_COMMAND in environment.
Connection to localhost closed.

gitコマンドを実行していないのでサーバーから切断されますが、これは正常な動作です。

とりあえず、gitサーバー構築はこれで完了です。念のためEBSのスナップショットをS3に取っておいてもよいかもしれません。

Webのアクセス制限でIP制限とDigest認証を併用する方法

部門専用Webサーバー等で特定のIPからは無条件でアクセス許可しつつ、他のIPからはDigest認証かけたい場合の設定方法です。


  AuthType Digest
  AuthName "member only" 
  AuthUserFile /etc/httpd/.htdigest
  Require valid-user

  Satisfy Any
 
  Order deny,allow
  deny from all
  Allow from 192.168.0.0/24

ここでのポイントはSatisfy Any。Apacheのマニュアルはこちら

ちなみにAnyをAllに変えると、IP制限かつDigest認証が必要になります。部門内でエライ人だけ閲覧可能、とかしたい場合には有効かもしれません。