作業手順書はもういらない! Puppetにおける自動化の定義書「マニフェスト」の書き方と基礎文法まとめ:新人インフラ技術者のためのサーバー構築/運用自動化入門(4)(5/5 ページ)
サーバー構築の自動化で利用される技術、自動化ツールとして「Kickstart」「Puppet」を紹介し、構築から運用まで、システムライフサイクル全体にわたる運用管理の自動化についても解説する連載。今回は、自動化ツールを使う上で大切な3つのことを基に、Puppetの変数とテンプレート、条件分岐、クラス、モジュールの使い方などを解説します。
「クラス」と「モジュール」でマニフェストをひとまとめ
Puppetのクラス
Puppet言語には「クラス(class)」があります。オブジェクト指向言語を使ったことがある方ならピンと来たことでしょう。Puppet言語のそれは、一般的な言語のクラスと概念は似ているところもありますが別物です。とは言っても、基本的な使い方は難しくありません。クラスの基本記法は以下のようになります。
class (クラス名) {
:
(マニフェストなど)
:
}
Puppetのモジュール
さらにクラスは付随するファイルなどのデータをひとまとめにして「モジュール」にできます。先ほどテンプレートの実験をしたときはローカルファイルとして配置していました。これではテンプレートを使うときはあらかじめ配布する必要があって面倒です。モジュールを使うとテンプレートをmaseter側から配布できるようになり、とても便利になります。
クラス名を付けてマニフェストをモジュールにしてみよう
それではクラス名を「http_server」として、先ほどのマニフェストをモジュールにしてみましょう。最初にモジュールを配置する“入れ物”を準備します。「/etc/puppet/modules」配下にモジュール名のディレクトリを作成し、さらに「manifests」「files」「tenmplates」ディレクトリを作成します。作成後は以下のようなツリー構造になります。
/etc/puppet/modules/http_server/ +-- manifests +-- files +-- templates
manifestsディレクトリにはマニフェストファイルを配置します。モジュールは最初init.ppを実行しますので、メインのコードはこのファイルの中に収めます。templatesディレクトリには先ほど作成したようなerbテンプレートを配置します。filesディレクトリは今回使いませんが、fileリソースで取得するファイルを配置できます。
それでは作成したディレクトリの中に先ほど作成したテンプレートファイルをコピーします。
次にinit.ppの中身ですが、先ほど作成したマニフェストをクラスの基本記法に収めたものになります。基本は「class http_server{ 〜 }」の間にマニフェストを収めるだけです。fileリソースのtemplate関数のところだけ修正していますが、これについては後述しますので、そのままコピーして保存してください。
class http_server { if $memorysize_mb >= 8192 { $keepalive = 500 } else { $keepalive = 100 } case $operatingsystem { centos: { $httpd = "httpd" $conf = "/etc/httpd/conf/httpd.conf" $template = "httpd.conf_centos.erb" } ubuntu: { $httpd = "apache2" $conf = "/etc/apache2/apache2.conf" $template = "httpd.conf_ubuntu.erb" } default: { fail("unknown operatingsystem") } } package { $httpd: ensure => present, } file { $conf: ensure => present, content => template("http_server/$template"), require => Package[$httpd], } service { $httpd: ensure => running, enable => true, subscribe => File[$conf], } }
ここまでの作業でツリーの構造が以下のようになれば完成です。
/etc/puppet/modules/http_server/ |-- manifests | +-- init.pp +-- files +-- templates +-- httpd.conf_centos.erb +-- httpd.conf_ubuntu.erb
最後に「site.pp(/etc/puppet/manifests/site.pp)」ファイルを作成しましょう。ホスト名を「www01」とした場合、クラスやモジュールを呼び出すには以下のように記述します。
node www01 { include http_server }
「include (モジュール名)」が今回作成したモジュールを呼び出している部分です。これなら1行で済みますし、サーバー増設のときもnodeブロックを同様に追加していくだけですので、ラクラク対応できますね。
また、クラスやモジュールの呼び出しは以下のようにも記述できます。
node www01 { class {'http_server': } }
この記述ではクラスにパラメーターを渡すこともできます。
Puppet言語の詳細は公式サイトへ
なお本連載では、分かりやすさを重視していますので、クラスやモジュールで他にできること、「型の定義」「変数のスコープ」などの入門者向けだと少し難しい内容は説明しません。それらの詳しいことは公式サイトにあります。以下のドキュメントを参照してください。
- Learning Puppet日本語訳:https://docs.puppetlabs.com/ja/learning/introduction_ja.html
- Puppet Labs日本語ホーム:https://docs.puppetlabs.com/ja/
作成したマニフェストを動かしてみよう
準備は整いましたので、実際に構築してみましょう。まずはここでもドライランしてみましょう。agent側のサーバーで以下のように実行します。
# puppet agent -t --noop Info: Retrieving pluginfacts Info: Retrieving plugin Info: Caching catalog for www01 Info: Applying configuration version '1417487814' Notice: /Stage[main]/Http_server/Package[httpd]/ensure: current_value absent, should be present (noop) Notice: /Stage[main]/Http_server/File[/etc/httpd/conf/httpd.conf]/ensure: current_value absent, should be present (noop) Info: /Stage[main]/Http_server/File[/etc/httpd/conf/httpd.conf]: Scheduling refresh of Service[httpd] Notice: /Stage[main]/Http_server/Service[httpd]/ensure: current_value stopped, should be running (noop) Info: /Stage[main]/Http_server/Service[httpd]: Unscheduling refresh on Service[httpd] Notice: Class[Http_server]: Would have triggered 'refresh' from 3 events Notice: Stage[main]: Would have triggered 'refresh' from 1 events Notice: Finished catalog run in 0.17 seconds
ここでエラーが出た場合はエラーの内容に応じて修正してください。問題なければ「--noop」オプションを外して実際に構築してみましょう。
# puppet agent -t Info: Retrieving pluginfacts Info: Retrieving plugin Info: Caching catalog for www01 Info: Applying configuration version '1417487814' Notice: /Stage[main]/Http_server/Package[httpd]/ensure: created Notice: /Stage[main]/Http_server/Service[httpd]/ensure: ensure changed 'stopped' to 'running' Info: /Stage[main]/Http_server/Service[httpd]: Unscheduling refresh on Service[httpd] Notice: Finished catalog run in 6.49 seconds
構築できたらブラウザーでアクセスしてApacheの初期ページが表示されることを確認しましょう。CentOSで動くのを確認できたら、環境のある方はUbuntuでも試してみるとよいでしょう。
次回は、マニフェストの開発や運用でのtips
次回はマニフェストの開発や運用に入ってからのtipsを紹介します。お楽しみに。
R子 うぇ〜ん、また最初からだぁ(悲)。
K男 どうしたのかな?
R子 マニフェスト間違って、構築するの失敗しちゃって……。検証用サーバーを作り直しなんですぅ(泣)。
K男 ん? VM使って実験しているんじゃなかったっけ? バックアップしなかったの?
R子 バックアップはあるんですよ……。でも、サイズが大きくて復元にすごく時間が掛かるんです(悩)。
K男 フッフッフッ、そんなときには強い味方があるんだよ(ニヤリ)。
R子 え? なんですかそれ!? イジワルしないで教えてくださいよぉ〜(願)。
K男 それは次回のお楽しみ。
R子 ひどぉ〜い(泣)。
著者プロフィール
菅原亮(すがはら りょう)
所属:NTT OSSセンタ シニア・エキスパート
1973年生まれ。10歳の時にプログラミングに目覚める。
1994年にFM-TOWNS上でLinuxを使い始めて以来、仕事趣味問わずOSSシステムを構築するようになる。
2012年よりOSSシステムの構築自動化に取り組み始め、昔の苦労を懐かしみつつ自動化の普及促進に取り組んでいる。
個人ではNTSyslog日本語対応版など主にWindows用アプリを手掛ける。趣味は家庭菜園と料理の手動構築で愛車はシルビア。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ChefのKnifeでCloudStackを操作する方法
knife-cloudstackを用意してコマンドラインでCloudStackを操作してみよう。基本コマンドのリファレンスも紹介する - PowerShell Desired State Configuration(DSC)とは(前編)
Windows OSの設定や構成を変更する場合、GUIの管理ツールを使うのが一般的である。だが台数が多かったり、構成変更や以前の構成への復旧などが頻繁だったりするとGUIでは非常に面倒だし、間違いもしやすくなる。こんな場合はPowerShell DSCを使ってインフラ構築作業を自動化するとよい。 - JobSchedulerの機能と設定〜基礎編
本連載では運用管理の一要素である「バッチジョブ管理」に着目し、より効率よいバッチジョブ管理を実現するためのツールであるオープンソースの「JobScheduler」について解説します。 - DevOps実践に有用なZabbixの機能〜自動化機能で運用負荷削減
ますますクラウド化が進む環境において、システムにはより迅速な対応が求められるようになっています。変化の早いシステムを適切に運用していくためにはどうすればいいのでしょうか? この記事では、クラウドやDevOpsを前提としたITシステムの「運用」に求められることを整理し、そういった運用に対して、オープンソースの統合監視ツール「Zabbix」がどのように有効活用できるかを紹介します。 - 工数削減だけじゃない、自動化ツールの真のメリット
運用自動化というと「人員削減」「コストが掛かる」といったネガティブな見方をする向きも多い。だが仮想化、クラウド時代において運用自動化とはそれほど単純なものではない。国内ベンダ4社のツールに真の意義を探る。 - 運用自動化ツールは経営の武器へ
運用自動化というと「コスト削減」「効率化」といったイメージが強いが、攻めの経営を支える武器となるものでもある。後編では外資ベンダー3社の運用自動化ツールを紹介する。