株式会社コーソル

コーソルDatabaseエンジニアのブログ

技術ブログ

弊社検証環境にAnsibleを使用した感想徒然

弊社では Oracle VM Server for x86 上に多数のVMを作成して、主にOracle Database関連製品のサポート業務向けとなる検証環境を構築しています。2011年ごろからコツコツVMを追加してきた結果、現時点では100近い製品導入済みのVMがホストされるまでになっています。

Oracle Databaseはバージョンアップを続けて行くでしょうから、今後もVMを追加してゆくことになるでしょう。また、嬉しいことに、Oracle Database以外の製品に関するサポートの引き合いを弊社がいただくことも増えてきており、Oracle Database以外の製品に対応するためにも、やっぱり今後 VMを多数作成してゆくことになりそうです 🙂

弊社ビジネスが継続し、成長してゆくことはまったくもって良いことなのですが、毎度毎度VMを手作業で作成するは面倒ですし、私がVM作成に割ける時間も有限です。ということで、最近話題のプロビジョニングツール Ansibleを使ってLinux系VMの作成を自動化することにしました。

VM作成手順の概要は以下の通りです。

  1. ベースとなるOSのイメージを作成する。kickstartでゼロからOSをインストールするか、構築済みのOSをテンプレートとして活用する
  2. 自作スクリプトで、ベースOSイメージを特定のディレクトリにコピーする。この際、VM外部から指定する必要があるVM固有属性(VM識別名、MACアドレスなど)を設定する。必要があれば共有ディスクを追加する。
  3. VMを起動し、Ansibleで各種設定を行う

Ansibleで気に入っている点

これまで、Ansible, Chef, Puppetなどのプロビジョニングツールを使ったことはなかったのですが、Ansibleは非常に簡単に使いこなすことができました。適用領域次第の部分があるかとは思いますが、一度に多くて数台(Oracle RACクラスタ等)を構成する程度であれば、完全にフィットするはずです。

Ansibleで気に入っている点を書いておきます。

クライアント(ここでは構成しようとするVM)に求められる要件が少ない → pythonの一部モジュール、ssh接続程度

ホスト固有パラメータ、グループ固有パラメータを host_vars/[ホスト名]、group_vars/[グループ名] というファイルで簡単に定義できる。

[root@ol65n5 post]# cat hosts
[l59sdbx]
l59sdbx1 ansible_ssh_host=xxx.xxx.xxx.222
l59sdbx2 ansible_ssh_host=xxx.xxx.xxx.223
[root@ol65n5 post]# cat host_vars/l59sdbx1
vmid: 222
distribution_major_version: 5
processor_architecture: x86_64

ora_node_no: 1
[root@ol65n5 post]# cat group_vars/l59sdbx
template: false

ora_rac_group: l59sdbx

ora_db_name: b204ru
ora_db_domain: .world
ora_password: oracle
ora_db_charset: AL32UTF8
  : 

ホスト固有パラメータ、グループ固有パラメータをテンプレートで簡単に参照して 展開できる。

  • 例: /etc/sysconfig/network-scripts/ifcfg-eth0 のテンプレート
[root@ol65n5 post]# cat templates/ifcfg-eth0.j2
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
USERCTL=no
IPADDR=172.31.{{vmid}}.1
HWADDR=xx:xx:xx:00:{{ "%X"|format(vmid) }}:00
NETMASK=255.255.0.0 

Ansibleをうまく使うために

使ってみての実感ですが、プロビジョニングツールを使って、構成が異なる 多数の環境を効率的に構築するためは、構成のベース部分のテンプレート化(標準)が必要になりますね。 環境ごとにあまりにも構成が異なると、それぞれの構成に合わせてプロビジョニング定義を書く必要がでてきて、あまり省力化につながりません。

たとえば、弊社検証環境ではNICおよびセグメントの構成を以下の構成でそろえています。

eth0 : 172.31.[VM識別子].1/16   xx:xx:xx:00:[VM識別子]:00
eth1 : 172.30.[VM識別子].1/16   xx:xx:xx:00:[VM識別子]:01
eth2 : 172.29.[VM識別子].1/16   xx:xx:xx:00:[VM識別子]:02
eth3 : 172.28.[VM識別子].1/16   xx:xx:xx:00:[VM識別子]:03
eth4 : xxx.xxx.xxx.[VM識別子]/24 → DHCPで固定IPアドレスを割り当て、社内LANに接続
                                xx:xx:xx:00:[VM識別子]:04

そろえることで、プロビジョニング定義を共通化できます。逆に言うと、そろえたとしても、それぞれのVMの用途に併せた設定ができる余地があるような、構成にしておく必要があります。

細かいところではありますが、上記の構成は以下の点を気にしています。

  • 各種アドレスを体系化する。VMの識別子を導入して、これと対応付けるのが簡単でしょう。
  • Oracle RAC構成を意識して、パブリックLANとプライベートLANを構成できるように
  • さらに発展的なOracle RAC構成のために、複数のパブリックLANとプライベートLANを構成できるように
  • Oracle ClusterwareのVIPを意識して、同一のNICに対して複数のIPアドレスをVMIDと対応付けた形で割り当てられるように
  • VMに導入する製品(例: Oracle Database) が使用するNICと、VMにアクセスするNICを分ける。通常の運用でも業務LANと管理LANとわけると思いますが、そのイメージです。

その他、いくつかノウハウが見えてきたので、メモ書きレベルですがまとめておきます。

  • ベースとなるOSイメージを作成するとき、NICの設定でMACアドレスに依存しないようにしておく。依存していると、VMデプロイ時にMACアドレスが変わると、NICが上がらないので面倒。
  • Ansibleでプロビジョニングを開始するためにはssh接続が必要。ssh接続するためのネットワーク設定をVM内部から実施するのは面倒なので、DHCPを用いて VM外部から自動的にネットワーク設定するようにしておくのがよい。これは、そのVMのMACアドレスに対して、固定IPアドレスを割り当てるようにDHCPサーバを構成することで実現できる。
  • 上記のssh接続で使用するNICは、VMに導入する製品(例: Oracle Database) が使用するNICとは別のNICがよい。ssh接続後、Ansibleで、VMに導入する製品(例: Oracle Database) が使用するNICを構成する流れとする。
  • あまり 有用性が感じられなかったので gather_facts は使用していません。
  • べき等にするのは結構大変・・・。設定内容に特化したモジュールがない場合は厳しい。lineinfileモジュールを使用して、Ansibleが各種設定ファイルを事実上手編集するような場合は、特に。
  • Oracle製品のインストール自動化をするには、サイレントインストール+レスポンスファイルの知識が必要(あたりまえ)

あとはWindows VMの導入効率化を検討したいですが・・・ いつ着手できることやら。

プロフィール

On7tWW6m1Ul4

渡部 亮太

・Oracle ACE
・AWS Certified Solutions Architect - Associate
・ORACLE MASTER Platinum Oracle Database 11g, 12c 他多数

カテゴリー

アーカイブ