Browse Month: July 2010

Linux から IPMI の IP アドレスを変更する方法

通常の IA サーバは、IPMI の IP アドレスは BIOS 上から変更できるようになっています。最初に BIOS から IPMI の IP アドレスを変更して、Linux(CentOS) をセットアップして本番投入直前になって諸事情によって IPMI の IP アドレスとサブネットマスクを変更することになりました。

このとき OS を再起動して、BIOS から変更すれば IPMI の IP アドレスを変更することが可能ですが、データセンターの現地にいって一台ずつ再起動するのが面倒です。

Linux 上からだと、IPMI のサービスを起動することによって、IPMI の IP アドレスを変更することができます。仮想化をしている場合には、物理サーバ上から変更することができます。

まず、IPMI のサービス、imptool をインストールします。

$ sudo yum install OpenIPMI ipmitool

次に IPMI のサービスを起動します。

$ sudo service ipmi start

Starting ipmi drivers:                                     [  OK  ]

IPMI サービスを起動すると、ipmi のデバイスが見えます。

$ dmesg | grep ipmi

ipmi message handler version 39.1
ipmi_si: Trying SMBIOS-specified kcs state machine at i/o address 0xca2, slave address 0x0, irq 0
ipmi: Found new BMC (man_id: 0x00XXXX,  prod_id: 0xXXXX, dev_id: 0xXX)
ipmi device interface

この状態で、ipmitool を使って IP アドレスとサブネットマスクを変更します。

$ sudo ipmitool lan set 1 ipaddr X.X.X.X

$ sudo ipmitool lan set 1 netmask 255.255.0.0

この変更にはすこし時間がかかることもあるので、プロンプトが返ってくるまで待ちます。

変更したら、正しく変更されているか確認します。

$   ipmitool -I lanplus -H X.X.X.X -U <ユーザ名> -P <パスワード> lan print

IPMI の IP アドレスなどの変更ツールは、IA サーバのメーカー製のツールがあってそのツールからも変更できますが、ipmitool を使うことによって同じ方法で変更できるので便利です。

Puppet キャンプ in ヨーロッパ

すこし前のことになりますが、ベルギーにて 3 月 27 〜 28 日まで Puppet キャンプが開催されました。

Puppet Labs に、そのときの動画をスライドがすべて公開されています。

動画はあとでチェックすることにして、スライドだけチェックしてみました。講演のタイトルは、次のとおりです。

  • Portable infrastructure with Puppet – Luke Kanies (Slides|Video)
  • Embedded Puppet – Alban Peignier (Slides|Video)
  • Deploying datacenters with Puppet – A user’s perspective – Rafael Brito (Slides|Video)
  • Puppet modules and module standards – Alessandro Franceschi (Slides|Video)
  • Auditing change management policies with Puppet and Splunk – Jeff McCune (Slides|Video)
  • Puppet in complex, real-time environments – Rick van der Zwet (Video)

まずは、Puppet の中心人物である Luke さんの発表。この発表では、おもに Puppet の現在の状況と、これからの展望について発表がありました。以下、メモです。

  • Puppet は、安定している(現在のリリースバージョンは、0.25.5)
  • Puppet は、さまざまな面で日々高速に進化している
  • Puppet は、さまざまな分野で使われている(Google、DELL、Disney、J.P.Morgan など)
  • Puppet キャンプ 2009 では、次のことを約束した
  • バージョン 1.0 のリリース … 1.0 / 2.0 はスキップして、現在 2.6 で開発中で、いくつか大きな機能を盛り込んでいる、Pure Ruby DSL(*1)、クラスパラメータ(*2)、REST への移行がすべて完了する、puppet のプログラム一つに移行する(例えば、puppetmastered -> puppet master となる)、レポートにさらに詳細な情報が含まれるようになる、新しい関連を示すシンタックスが追加される(*3)、ハッシュ(*4)
  • Web GUI アプリケーション … Puppet Dashboard としてリリースした
  • モジュール … モジュールを共有できる場所として Puppet Forge をリリースした

(*1) Pure Ruby DSL

Puppet 2.6 では、Ruby で DSL として、次のような感じで記述することができる。ついにこの機能が登場しそうです。Ruby で記述できれば、特殊な Puppet DSL を学習することができなくて済みますね(大きな概念は変わらないと思いますが)。おそらく、これはユーザの声をきいた結果だと個人的に思います。

hostclass “foo” do

package :foo, :ensure => :present

service :foo, :ensure => :running

end

node “hoge.example.com” do

acquire “ssh”

end

(*2) クラスにパラメータを与えることができる

class foo($hoge = “bar”) {

}

class { foo: hoge => “bar” }

(*3) 次のようなシンタックスが追加される、個人的にはちょっと複雑な文法なので使いこなせなさそうです

notify { b: } -> notify { a: } -> notify { c: }

Notify[b] ~> Notify[a] ~-> Notify[c]

(*4) ハッシュ、Ruby のハッシュっぽく記述することができる、これは重宝しそうです

class foo {

$data = {}

$data[one] = 1

$data[one] = 2

file { “/tmp/hoge”: content => template(“foo/tmp/hoge”), }

Puppet Forge については、改めて別の機会に紹介したいと思います。

次の話は、Puppet を組み込む方法について。これは省略します。

その次の話は、Puppet を使って複数のデータセンターを構築する方法の話。OS は、RHEL でしたが、その中で kickstart の pre セクションで、MAC アドレスを登録する次のスクリプトは、なるほどと思いました。

%pre
SERVER=`grep ‘url address’ /tmp/anaconda.log | awk ‘{print $6}’`
cd /tmp && wget -q http://${SERVER}/pub/dmidecode
chmod +x /tmp/dmidecode
SN=`dmidecode | grep “Serial Number” | head -1 | awk ‘{print $3}’`
MAC=`ifconfig | grep HWaddr | awk ‘{print $5}’`
wget -q http://${SERVER}/cgi-bin/register.pl?mac=$MAC\&sn=$SN
reboot

上のスクリプトでは、MAC アドレスと dmidecode をしたマシンのシリアル番号を register.pl へ送っています。

僕は、いままでマシンの BIOS などで MAC アドレスを確認していましたが、この方法を応用すれば自動化できる可能性が出てきました、さっそく挑戦してみたいと思います!

その次の話では、Puppet モジュールの標準的な書き方について、いくつか参考になる話があったのでまとめておきます。

include するときのポイント。次のように使い分けると分かりやすい。

  • include postfix – Postfix サービスをインストールして実行する
  • include postfix::disable – Postfix をインストールするがサービスは実行しない
  • include samba::server – Samba サーバをインストールする
  • include samba::client – Samba クライアントをインストールする

import と include の違いは、Puppet の中で重要なので押さえておきたいところです。次のような違いがあります。

  • import autofs – $modulepath/autofs/manifests/init.pp を読み込む
  • include autofs::server – $modulepath/autofs/manifests/server.pp を読み込む

puppetdoc コマンドを使うと、コメントが含まれているマニフェストからドキュメントを生成することができる。例えば、次のようなマニフェストを書く。

# Class: apache
#
# このモジュールは Apache を管理します
#
# Parameters:
#
# Actions:
#
# Requires:
#
# Sample Usage:
#
# [注意: コメントとクラス定義の間には空行を入れないこと]
class apache {
	...
}

最後の二つの講演は、特に参考になる情報はありませんでしたが、Puppet キャンプ楽しそうです!