2014年9月22日月曜日

SoftLayerに冗長化NFSサーバを(その9)

バックアップ手順を簡略化できたので、次はリストア手順を簡略化しようと考えていたのですが、その前に、前提として考えている環境やプロビジョニングスクリプトの内容を少し整理しておきます。

最初は仮想サーバのみで検証しようと思っていたのですが、物理サーバでも検証しないと駄目だと考え直し、要望もあり、Bare Metal Instance による検証も加えたのですが、Bare Metal Instance がなくなってしまいました (File Storage (Consistent Performance) という NFS ベースのサービスも始まりました。こちらの試用記はいずれ機会を持ちたいと思います)。時間課金の Bare Metal Server を検証する目的で月額課金の Bare Metal Server も発注することになり、こちらの方が安いということも分かり、せっかくなので RAID コントローラをはじめとする物理サーバならではの設定についてももう少し詳しく述べておこうかな、ということになった次第です。CentOS6 をミニマム・インストールした前提で、違いを明確化しながら環境を整えていきます。

まず、サーバを発注するときに、もしくは、OS Reload 時に、以下のプロビジョニングスクリプトを指定している前提とさせていただきます。ssh 鍵の指定も必須です。指定されていない場合は何もしません。更に、物理サーバの場合は Linux Extra Partition を選択してください。RAID コントローラ搭載機についての詳細は後述します。

https://raw.githubusercontent.com/pcserver-jp/SoftLayer/master/co6.sh

「SoftLayer の CentOS 6.5 を CentOS 7 にアップグレードしてみた (http://dba-ha.blogspot.jp/2014/08/softlayer-centos-65-centos-7.html)」でも説明した以下のプロビジョニングスクリプトについては、メンテナンスを中止します。近いうちに削除させていただきます。

co6.ams01.sh
co6.dal01.sh
co6.dal05.sh
co6.dal06.sh
co6.dal07.sh
co6.hkg02.sh
co6.hou02.sh
co6.lon01.sh
co6.sea01.sh
co6.sjc01.sh
co6.sng01.sh
co6.wdc01.sh

ファイル名から察していただけるかと思いますが、データセンタ別に作っていました。
内容としては、5行目の「MY_DC=<データセンタ名>」だけが異なっていました。

今後のプロビジョニングスクリプトでは、仮想サーバの場合 API でデータセンタ名を取得します。
物理サーバの場合は、デフォルトを hkg02 データセンタとし、日本にデータセンタができた時点でデフォルトを日本のものに変更します。また、プロビジョニング時に指定する ssh 公開鍵内のコメント部分 (ssh-rsa AA...xx comment@datacenter) のうち、「@」から末尾までの文字列を抽出し、データセンタが指定されているものとして解釈します。想定しているデータセンタ名が抽出できなかった場合はデフォルトのデータセンタが指定されたものとして処理を続行します。
具体的には、以下のように処理しています。


if [ -d /proc/xen/ ]; then
  MY_DC=$(curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getDatacenter 2> /dev/null |
    sed -n -e 's/^"\(.*\)"$/\1/p')
else
  MY_DC=$(grep ^ssh- /root/.ssh/authorized_keys | head -1 |
    sed -n -e 's/^ssh-[^ ]* [^ ]* \(.*@\([a-z0-9]*\)\)$/\2/p')
fi
case "$MY_DC" in
  "ams01" ) :;;
  "dal01" ) :;;
  "dal05" ) :;;
  "dal06" ) :;;
  "dal07" ) :;;
  "hkg02" ) :;;
  "hou02" ) :;;
  "lon01" ) MY_DC=lon02;;
  "lon02" ) :;;
  "mel01" ) :;;
  "sea01" ) :;;
  "sjc01" ) :;;
  "sng01" ) :;;
  "tor01" ) :;;
  "wdc01" ) :;;
  * ) MY_DC=hkg02;;
esac || $Error


NFS サーバの IP アドレスを渡すとか、Portable Private IP Address を渡すなども考えましたが、誰もが使えるものから乖離していくのでやめておきます。
仮想サーバであれば、User Metadata というものを渡すことができるのですが、残念ながら、物理サーバでは渡せません。

参考までに、SoftLayer API の発行方法を記載しておきます。以下の API はアクセスキーがなくても実行可能です。つまり、公開の GitHub に置かれたプロビジョニングスクリプト内でもちょっとした情報収集をできることになります。本格的にプロビジョニングスクリプト内で API を活用したい場合は、ソースコード内にアクセスキーを仕込む必要が出てきて、併せて、セキュリティ対策も必要となります。物理サーバではエラーとなる点に気を付けてください。getTags、getServiceResources についてはまだ検証していないので、加工せずにそのまま出力しています。


curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getBackendMacAddresses 2> /dev/null | sed -n -e 's/^\["\(.*\)"\]$/\1/p' ;echo
06:09:54:64:90:90

curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getDatacenter 2> /dev/null | sed -n -e 's/^"\(.*\)"$/\1/p' ;echo
hkg02

curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getDatacenterId ;echo
352494

curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getDomain 2> /dev/null | sed -n -e 's/^"\(.*\)"$/\1/p' ;echo
example.com

curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getFrontendMacAddresses 2> /dev/null | sed -n -e 's/^\["\(.*\)"\]$/\1/p' ;echo
06:c9:5c:ba:cc:bb

curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getFullyQualifiedDomainName 2> /dev/null | sed -n -e 's/^"\(.*\)"$/\1/p' ;echo
client.example.com

curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getHostname 2> /dev/null | sed -n -e 's/^"\(.*\)"$/\1/p' ;echo
client

curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getId ;echo
1234567

curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getPrimaryBackendIpAddress 2> /dev/null | sed -n -e 's/^"\(.*\)"$/\1/p' ;echo
10.110.69.4

curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getPrimaryIpAddress 2> /dev/null | sed -n -e 's/^"\(.*\)"$/\1/p' ;echo
123.123.123.123

curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getProvisionState 2> /dev/null | sed -n -e 's/^"\(.*\)"$/\1/p' ;echo
COMPLETE

curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getRouter/$(curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getBackendMacAddresses 2> /dev/null | sed -n -e 's/^\["\(.*\)"\]$/\1/p') 2> /dev/null | sed -n -e 's/^"\(.*\)"$/\1/p' ;echo
bcr01.hkg02

curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getRouter/$(curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getFrontendMacAddresses 2> /dev/null | sed -n -e 's/^\["\(.*\)"\]$/\1/p') 2> /dev/null | sed -n -e 's/^"\(.*\)"$/\1/p' ;echo
fcr01.hkg02

curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getTags ;echo
{"error":"No tags were found.","code":"SoftLayer_Exception_NotFound"}

curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getUserMetadata 2> /dev/null | sed -n -e 's/^"\(.*\)"$/\1\n/p' | sed -e 's/\\n/\n/g' ;echo
User Metadata
Second Line


curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getVlanIds/$(curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getBackendMacAddresses 2> /dev/null | sed -n -e 's/^\["\(.*\)"\]$/\1/p') 2> /dev/null | sed -n -e 's/^\[\(.*\)\]$/\1/p' ;echo
123456

curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getVlanIds/$(curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getFrontendMacAddresses 2> /dev/null | sed -n -e 's/^\["\(.*\)"\]$/\1/p') 2> /dev/null | sed -n -e 's/^\[\(.*\)\]$/\1/p' ;echo
223456

curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getVlans/$(curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getBackendMacAddresses 2> /dev/null | sed -n -e 's/^\["\(.*\)"\]$/\1/p') 2> /dev/null | sed -n -e 's/^\[\(.*\)\]$/\1/p' ;echo
973

curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getVlans/$(curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getFrontendMacAddresses 2> /dev/null | sed -n -e 's/^\["\(.*\)"\]$/\1/p') 2> /dev/null | sed -n -e 's/^\[\(.*\)\]$/\1/p' ;echo
975

curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getServiceResource 2> /dev/null | sed -n -e 's/^"\(.*\)"$/\1/p' ;echo
10.2.160.40

curl -k https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getServiceResources ;echo
[{"backendIpAddress":"10.2.160.40","type":{"type":"DOWNLOAD_HOST"}},{"backendIpAddress":"172.18.1.149","type":{"type":"MCAFEE_EPO"}}]



自前でプロビジョニングスクリプトを配信するサーバを立てたときに改修するためのヒントとなるようにプロビジョニングスクリプト co6.sh の内容をコメントしておきます。

基本的には、プロビジョニングスクリプトの実行時間が長くなってしまうことを許容する前提で作りこんでいきます。オートスケール等については考慮しません。
また、GitHub に設置する前提で、セキュリティ的に書きこんでおいて問題が発生するものは組み込みません。例えば、ssh のホスト鍵やサーバ証明書、秘密鍵、パスワードは組み込みません。ただし、sl-admin アカウントの初期パスワードは例外です。パラメータ・ファイル等については、例示するために書いてあるので、プロビジョニング後、利用前に書き換えてください。
2台目以降のローカルストレージについては、swap を除き全量 LVM の vg0 ボリュームグループに所属させます。論理ボリュームの作成は行いません。

root の初期パスワードを指定します。
 空の場合はランダムな50文字以上の文字列にします。
 デフォルトは空です。

・wheel グループに所属する一般ユーザ名とパスワード、UID を指定します。
 デフォルトは以下の通りです。
 ユーザ名: sl-admin
 初期パスワード: sl-admin
 UID: 65501wheel グループに所属するユーザが sudo コマンドを使う場合にパスワード入力が必要かどうか指定します。
 デフォルトはパスワード入力不要です。

・デバッグ目的の Error ファンクションを定義します。
 このファンクションが呼ばれた際は、エラーメッセージを表示します。
 終了コード、引数に指定されていた文字列も表示します。
 端末で実行していた場合には、さらに10秒間 sleep します。
 使い方は以下の通りです。
 <成功してほしいコマンド> || $Error
 <成功してほしいコマンド> || $Error : エラー時に表示したい文字列
 <失敗してほしいコマンド> || $Error
 <失敗してほしいコマンド> || $Error : エラー時に表示したい文字列
 このように記述しておけば、 Error ファンクションを定義し忘れていた場合にも処理は続行できます。
 ただし、終了コードは保存されなくなります。

・root アカウントで実行されていることをチェックします。
 そうでなかった場合はプロビジョニングスクリプトを終了します。

・root アカウントに ssh 公開鍵が登録されていることをチェックします。
 登録されていなかった場合はプロビジョニングスクリプトを終了します。

・SoftLayer がダウンロードしたプロビジョニングスクリプトの名前を以下に変更します。
 /root/post_install.sh

・プロビジョニングスクリプトのログを以下に保存するようにします。
 端末への出力が多いと、特に仮想サーバの場合に、プロビジョニングスクリプトの実行が途中で止まってしまうようです。
 /root/post_install.log

・データセンタを指定します。

・iptables を設定します。
 デフォルトでは全許可となっているので、設定完了後速やかに有効化しています。
 アウトバウンドは全許可しています。
 SoftLayer の Ping 監視を許可しています。データセンタごとに監視サーバが異なるので書き換えています。
 Public VLAN 側のインターフェイスへの通信を Drop しています。
 東京の VPN 中継サーバ、対象データセンタの VPN 中継サーバ経由の ssh 接続を許可しています。
 Private VLAN 側の ssh 接続を許可しています。
 Private VLAN 側の ICMP 通信は全て許可しています。
 その他はすべて Reject しています。

・ネットワークを設定します。
 NetworkManager の管理外となるように設定しています。
 物理サーバでは、Private VLAN 側ネットワークでジャンボフレームを有効化しています。
 NIC のオフロード機能を無効化しています。
 IPv6 無効化設定を補完しています。
 仮想サーバについて、可能なものは物理サーバ設定に揃えています。

・ローカルストレージを設定します。
 追加ディスク、拡張領域の LVM 設定を行います。

・OS 起動設定を補完します。

・パスワードハッシュ化方法を RHEL6 のデフォルトに合わせます。

・wheel グループに所属しないアカウントについて su 実行権限を奪います。

・wheel グループに sudo 実行権限を与えます。
sudo 実行権限を持つ一般ユーザを作成します。

・タイムゾーンを日本に変更します。

・コンソールで使うキーボード設定を日本語106キーボードに変更します。

・yum のメイン設定を RHEL6 のデフォルトに合わせます。

・CentOS の yum リポジトリを参照する設定を変更します。

・epel リポジトリを追加します。デフォルトでは無効化しておきます。

・ELRepo リポジトリを追加します。デフォルトでは無効化しておきます。

・パッケージを最新化します。

・仮想サーバ、物理サーバのパッケージ差異を最小化します。

・RAID コントローラ監視ログを詳細化します。

・必要なパッケージを追加します。

・NTP を設定します。

・IPMI を設定します。

・watchdog を設定します。

・NFS を設定します。

・SoftLayer CLI をインストールします。
 設定ファイル .softlayer.softlayer.user については、ダミーのものにしています。

・各種ファイルを作成します。

・不要な cron 設定をコメントアウトします。

・不要なサービスを登録解除します。

・ssh デーモン設定を変更します。
 root によるログインを禁止します。
 公開鍵認証以外の認証を禁止します。
 エージェント転送は有効のままです。
 root を信用できないサーバにログインする可能性があるのであればエージェント転送してはいけません。
 ssh TCP転送は有効のままです(利便性よりもセキュリティ重視であれば無効化すべきです)。
 その他の転送は無効化しています。
 PAM 設定の使用を有効化しています。
 PAM 設定もいじるのであれば、PAM の設定次第ではセキュリティが緩くなることもあり得る点に注意すべきです。

・root パスワードを変更します。

・OS を再起動します。


プロビジョニング後に実施すべきことをまとめます。


1. Private VLAN への VPN 接続を確立し、sl-admin でログインして、初期パスワードを変更します。
   再ログイン後に、プロビジョニングのエラーを確認します。
   sudo grep post_install /var/log/messages
   sudo cat /root/post_install.log
   sudo cat /root/post_install.log | grep -i error

2. SoftLayer の API を利用する場合は、設定ファイルにアクセスキーを登録します。

3. プライベート IP アドレスについては、Portable IP Address に変更します。
   IP アドレスを固定しなくてもよい設計であれば Primary IP Address をそのまま使ってもよいですが、お勧めできません。
   サーバを作り直した際には、同じ Primary IP Address が使えない可能性が高い点に注意が必要です。
   次のコマンドを利用して変更してください。
   プロビジョニングスクリプトが書き込んだ設定ファイル中の IP アドレスも変更します。
   実行完了後に再起動されます。
   sudo /rescue/mk_portable_ip <portable private ip address>

4. Public VLAN 側の NIC については、原則として停止させます。
   デフォルトゲートウェイを Private VLAN 側のゲートウェイに向けます。
   ファイアウォールを別途用意しない小規模の場合はこの限りではありません。
   インターネットへのアウトバウンドは Proxy サーバを用意して Proxy サーバ経由以外は許さないようにすべきです。
   インターネットからのインバウンドは、ファイアウォール、ロードバランサを経由することになると思われるので、グローバル IP アドレスは不要なはずです。
   踏み台への入り口をインターネット側に用意するときには、踏み台のセキュリティ確保を厳重に行ってからとすべきです。
   SoftLayer の Ping 監視設定変更も行います。
   必要に応じて、iptables 設定も変更します。

5. ローカルストレージの構成を確認します。
   lsblk
   sudo vgdisplay

6. NFS サーバにバックアップスクリプトを登録します。
※ 2014/9.27追記
プロビジョニングスクリプトに組み込めたので不要となりました。

7. バックアップします。
   sudo /rescue/backup <NFS サーバの IP アドレス>

8. バックアップをリストアします。
   ここでの失敗であれば、手戻りは最少に抑えられます。

9. サーバごとに構築内容が異なります。
   それぞれの構築を済ませます。

10. バックアップします。

11. バックアップをリストアします。

12. テストを始めます。
    テストにより不具合が見つかるなどして設定変更をした場合は、9. に戻ります。

13. 本番稼働を開始します。


プロビジョニングスクリプトを読み解くための前提、私がブログで紹介しているコピペによる実行が可能なスクリプトを読み解くための前提を説明しておきます。

SoftLayer のサーバ上で処理する場合に、仮想サーバなのか物理サーバなのか判断したい場合は、/proc/xen/ ディレクトリがあるかどうか判断すればよいです。存在すれば仮想マシンと判断してよいです。


[ -d /proc/xen/ ] && echo xen


仮想サーバの場合は OS からみて NIC が冗長化されていることはあり得ません。ジャンボフレームも対応していません。
ローカルストレージのデバイス名は /dev/xvda 等となっています。
/dev/xvda1/boot 用パーティション、
/dev/xvda2/ 用パーティション、
/dev/xvdb1swap 用パーティション、
となっています。
この連載で構築している NFS サーバでは、ローカルストレージを追加し、/dev/xvdc が共有ストレージ用領域として 100GB 以上確保されている前提にしています。

物理サーバの場合、Adaptec の RAID コントローラが搭載されているかどうかは aacraid カーネルモジュールがロードされているかどうかで判断すればよいです。SoftLayer の場合、他の RAID コントローラが搭載されている可能性はないと思っています。3ware や LSI の可能性もありますが、今後出会ったらその時に考えることにします。
時間課金の Bare Metal Server では、RAID コントローラ搭載サーバが選択肢にありません。


lsmod | grep -q ^aacraid && echo raid


物理サーバの場合は NIC を冗長化できます。私は基本的に冗長化を選択しています。
ジャンボフレームに対応しており、プライベートネットワーク内では MTU=9000 を常に有効化しています。
ローカルストレージのデバイス名は /dev/sda 等となっています。

RAID コントローラが搭載されている場合、
/dev/sda1/boot 用パーティション、
/dev/sda2/ 用パーティション、
/dev/sdb1swap 用パーティション、
/dev/sdc1 が残りのパーティション、
となるように調整したいところです。
論理ドライブとして
disk1: 25GB
disk2: 2GB (要件により16GB、32GB 等に変更することもあり)
disk3: 残り全て
を作成する前提とします。
発注時には、disk1 にパーティションテンプレートとして「Linux Extra Partition」を選択し、後で swap 領域を移動します。ちなみに、ブート用論理ドライブは上限が 2TB に制限されています。OS Reload 時でも、swap パーティションの指定は必須で、disk1 のパーティションしか構成できないため、仮想サーバの構成とそろえたい場合は swap の移動が必要となります。

以下の順序でパーティションが構成されていることを確認します。


lsblk /dev/sda
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    1   25G  0 disk
├sda1   8:1    1  256M  0 part /boot
├sda2   8:2    1   10G  0 part /
├sda3   8:3    1    1G  0 part [SWAP]
├sda4   8:4    1    1K  0 part
└sda5   8:5    1 13.8G  0 part /disk0


swap 領域の移動にあたり、swap が使われていないことを確認します。


free
             total       used       free     shared    buffers     cached
Mem:       8018232    2440020    5578212          0      88880    2075092
-/+ buffers/cache:     276048    7742184
Swap:      1048572          0    1048572


追加領域 /disk0 (/disk) を解放します。


sudo sed -i -e '/ \/disk/d' /etc/fstab
sudo umount /disk{,0}
sudo rmdir /disk*


swap 領域を解放します。


sudo sed -i -e '/ swap  *swap /d' /etc/fstab
sudo swapoff /dev/sda3


パーティションを切りなおします。


sudo fdisk /dev/sda << 'EOF'
u
d
5
d
4
d
3
d
2
n
p
3


n
p
2


d
3
p
w
EOF


OS を再起動します。


sudo /usr/local/sbin/reboot_quick


swap を作成します。


sudo fdisk -H 64 -S 32 /dev/sdb << 'EOF'
o
n
p
1


t
82
p
w
EOF

sudo mkswap -L swap -U 299ff4da-8897-405b-ae8e-5648a14fc81e /dev/sdb1
Setting up swapspace version 1, size = 2086892 KiB
LABEL=swap, UUID=299ff4da-8897-405b-ae8e-5648a14fc81e

cat << 'EOF' | sudo tee -a /etc/fstab
UUID=299ff4da-8897-405b-ae8e-5648a14fc81e swap  swap    pri=9,defaults  0 0
EOF
sudo swapon -a


/ パーティションを拡大します。


sudo resize2fs /dev/sda2


このようにして、swap が作り直されたものとして話を進めます。
プロビジョニングスクリプトでは、自動的にこの作業を行っています。
RAID コントローラが搭載されていない物理サーバや仮想サーバの場合も UUID を揃える目的で swap を作り直しています。swap サイズを増やしたい場合は、以下のように実行します。RAID コントローラ搭載物理マシンでは、第2論理ディスクのサイズを増やした方がよいと思います。


sudo dd if=/dev/zero of=/.swap bs=1M count=2048
sudo mkswap -f /.swap
echo '/.swap                                    swap  swap    sw,pri=2        0 0' | sudo tee -a /etc/fstab
sudo swapon -a


第3論理ディスク以降に LVM のボリュームグループを作成します。
2TB 越えを考慮し、gpt パーティションを作成します。この部分もプロビジョニングスクリプトでは、自動的にこの作業を行っています。


echo Yes | sudo parted /dev/sdc mklabel msdos
sudo dd if=/dev/zero of=/dev/sdc bs=1M count=1
echo Yes | sudo parted /dev/sdc mklabel gpt mkpart primary 1MiB 100% set 1 lvm on
sudo pvcreate /dev/sdc1
sudo vgcreate -s 32M vg0 /dev/sdc1
for i in d e f g h i j k l m n o p q r s t u v w x y z
do
  [ -e /dev/sd$i ] || break
  echo Yes | sudo parted /dev/sd$i mklabel msdos
  sudo dd if=/dev/zero of=/dev/sd$i bs=1M count=1
  echo Yes | sudo parted /dev/sd$i mklabel gpt mkpart primary 1MiB 100% set 1 lvm on
  sudo vgextend vg0 /dev/sd${i}1
done


用途に合わせ、LVM の論理ボリュームを作成します。この部分は自動化できないです。


sudo lvcreate --name drbd0 --extents 90%FREE vg0

sudo lvcreate --name drbd0 --size 90G vg0

sudo lvcreate --name data --extents 100%FREE vg0



もう少し、SoftLayer の RAID コントローラ関連の話を続けます。

RAID コントローラ搭載物理サーバの場合、以下の2つのパッケージが追加インストールされています。

kmod-aacraid
EventMonitor

kmod-aacraid は SoftLayer でビルドされたものがインストールされています。ライセンスが GPLv2 になっているので、/root/DD-0/2.6.32-71.el6/x86_64/ にあったものを GitHub に置いておきます。

https://raw.githubusercontent.com/pcserver-jp/SoftLayer/master/kmod-aacraid-1.2.1-2.el6.x86_64.rpm

最新版が欲しい場合は、Adaptec のサポートサイトにソースが置いてあります。DKMS (Dynamic Kernel Module Support) 用も置いてあります。
kABI-tracking kmod Driver がよければ、ELRepo サイトから取得できます。

EventMonitor は Adaptec でビルドされたものがインストールされているようです。

http://download.adaptec.com/raid/storage_manager/adaptec_event_monitor_v1_06_21062.zip を解凍したら出てくる EventMonitor-1.06-21062.x86_64.rpm をインストールしているようです。SoftLayer の Rescue モードで利用可能だった arcconf コマンドも含まれています。

Oracle Linux をインストールする場合の参考情報です。CentOS をスクラッチでインストールしたい場合にも参考になると思います。以下の3ファイルを適切に配置できると、RAID がエラーとなった場合に、SoftLayer のサポートにメールが飛ぶはずです。この3ファイルは明らかに SoftLayer が作成しているファイルです。

/usr/Adaptec_Event_Monitor/Email_Notification_Status.cfg
/usr/Adaptec_Event_Monitor/Mail_Recipients.cfg
/usr/Adaptec_Event_Monitor/SMTP_Server_Details.cfg

以下の xml ファイルは、自動生成されるような気がしていますが、調べきれていません。念のため保存しておきましょう。

/usr/Adaptec_Event_Monitor/NRMFSAConfig.xml

これらのマニュアルは以下にあります。

http://download.adaptec.com/pdfs/user_guides/adaptec_event_monitor_iug_v1_04_20853.pdf
http://download.adaptec.com/pdfs/user_guides/ja/cli_v1_06_21062_users_guide_ja.pdf

ログ出力を詳細化したい場合は以下のように変更します。


sudo sed -i -e 's/^nrm.debugMask.*$/nrm.debugMask = 2/' /usr/Adaptec_Event_Monitor/NRMConfig.conf



ここからは、物理サーバと仮想サーバにインストールされている CentOS6 の差異について話を進めます。

仮想サーバと物理サーバでインストールされているパッケージの差異は以下の通りでした。


物理サーバにのみインストールされているパッケージ

OpenIPMI
OpenIPMI-libs
apr
apr-devel
apr-util
apr-util-devel
apr-util-ldap
autoconf
automake
bind-devel
cyrus-sasl-devel
db4-cxx
db4-devel
expat-devel
expect
httpd
httpd-devel
httpd-tools
ipmitool
iscsi-initiator-utils
libc-client
lm_sensors-libs
mailcap
net-snmp-libs
ntp
openldap-devel
php
php-cli
php-common
php-devel
php-imap
python-tools
tcl
tix
tk
tkinter

仮想サーバにのみインストールされているパッケージ

xe-guest-utilities
xe-guest-utilities-xenstore


最後の2つは XenServer のユーティリティです。ライセンスが GPL になっているので、GitHub に置いておきます。

https://raw.githubusercontent.com/pcserver-jp/SoftLayer/master/xe-guest-utilities-6.2.0-1137.x86_64.rpm
https://raw.githubusercontent.com/pcserver-jp/SoftLayer/master/xe-guest-utilities-xenstore-6.2.0-1137.x86_64.rpm


rpm で管理されていないパッケージとして、以下のものが存在しています。ライセンスがどうなっているか分からないので、使ってよいかどうか確認していません。気に入らなければ削除しておけばよいです。


物理サーバにのみインストールされているパッケージ

BurnInTest Linux(負荷テストツール)
(/usr/local/burnintest//usr/local/bin/burnin)

仮想サーバにのみインストールされているパッケージ

NimBUS System Monitoring Software(監視ツール)
(/opt/nimsoft//etc/rc.d/init.d/nimbus)


パッケージの差異は無い方が何かと便利なので、rpm になっているものは揃えておきます。


sudo yum -y update

[ -d /proc/xen/ ] || sudo yum -y remove apr autoconf bind-devel cyrus-sasl-devel db4-cxx expat-devel libc-client mailcap php-common tcl
sudo rm -rf /etc/iscsi

[ -d /proc/xen/ ] && sudo yum -y install OpenIPMI ipmitool net-snmp-libs ntp iscsi-initiator-utils

[ -d /proc/xen/ ] || sudo yum -y localinstall https://raw.githubusercontent.com/pcserver-jp/SoftLayer/master/{xe-guest-utilities-6.2.0-1137.x86_64.rpm,xe-guest-utilities-xenstore-6.2.0-1137.x86_64.rpm}

if ! lsmod | grep -q ^aacraid; then
  wget http://download.adaptec.com/raid/storage_manager/adaptec_event_monitor_v1_06_21062.zip
  unzip adaptec_event_monitor_v1_06_21062.zip
  sudo yum -y localinstall https://raw.githubusercontent.com/pcserver-jp/SoftLayer/master/kmod-aacraid-1.2.1-2.el6.x86_64.rpm linux_x64/EventMonitor-1.06-21062.x86_64.rpm
  rm -rf adaptec_event_monitor_v1_06_21062.zip debian debian_x64 freebsd* linux linux_x64 solaris_x86 windows*
fi

[ -d /proc/xen/ ] || sudo chkconfig --del xe-linux-distribution
sudo chkconfig --del EventMonitorService
lsmod | grep -q ^aacraid && sudo chkconfig --add EventMonitorService
sudo chkconfig --del ipmi
[ -d /proc/xen/ ] || sudo chkconfig --add ipmi
[ -d /proc/xen/ ] || sudo chkconfig ipmi on
sudo chkconfig --del ipmievd
[ -d /proc/xen/ ] || sudo chkconfig --add ipmievd
[ -d /proc/xen/ ] || sudo chkconfig ipmievd on
sudo chkconfig --del ntpd
[ -d /proc/xen/ ] || sudo chkconfig --add ntpd
[ -d /proc/xen/ ] || sudo chkconfig ntpd on


SoftLayer で配布している ipmi のコマンドラインツールをインストールしておきます。


sudo wget -O /usr/local/sbin/ipmicli http://downloads.service.softlayer.com/ipmi/linux/cli/ipmicli.x86_64
sudo chmod 755 /usr/local/sbin/ipmicli


物理サーバを検証範囲に入れたので、watchdog の設定も追加することにします。


sudo yum -y install watchdog
chkconfig watchdog on
sudo sed -i -e 's/^#watchdog-device/watchdog-device/' /etc/watchdog.conf

sudo sed -i -e 's/^IPMI_WATCHDOG=.*$/IPMI_WATCHDOG=yes/' /etc/sysconfig/ipmi
sudo sed -i -e 's/^IPMI_WATCHDOG_OPTIONS=.*$/IPMI_WATCHDOG_OPTIONS="timeout=60 action=reset pretimeout=30 preaction=pre_int preop=preop_panic"/' /etc/sysconfig/ipmi
sudo sed -i -e 's/^# watchdog drivers/# watchdog drivers\nblacklist iTCO_wdt/' /etc/modprobe.d/blacklist.conf


仮想サーバは softdog による watchdog 設定を入れます。


cat << 'EOF' | sudo tee /etc/modprobe.d/softdog.conf
alias char-major-10-130 softdog
options softdog soft_margin=60
EOF
echo '[ -d /proc/xen ] && modprobe softdog' | sudo tee -a /etc/sysconfig/watchdog


ここまでに紹介した設定ファイルもプロビジョニングスクリプトにできるだけ含めていきます。パラメータ変更が必要なものは、設定ファイルを作るスクリプトをできるだけ含めていきます。しばらくお時間をください。

※ 2014/9/27追記
本日追いつきました。残るは、リストアの簡略化です。実は、NFS サーバ Stand-by 機再構築のスクリプトは既に入っていたりします。1号機を単独で構築するスクリプトに対し、VIP を指定して実行すると2号機の構築スクリプトとなっていますが、2号機が Active 機の状態で1号機を再構築してそのスクリプトを VIP 指定で実行しても動きます。OS 領域でデータや別途インストールしたアプリ等を置いていないのであれば、バックアップをリストアするよりもクリーンな状態となります。ただし、その時点で存在するすべてのパッチがあたってしまうので、バックアップからリストアすべきと考える管理者も多いはずです。パブリックなリポジトリを利用せずにプライベートなリポジトリを用意して、必要最小限のパッチを適用する、というのが正解のような気がしています。

0 件のコメント:

コメントを投稿