PuppetでApacheを管理してみる part2

前回に引き続き、Apacheの構成管理をやって見たいと思います。

前回:PuppetでApacheを管理してみる part1 - ressyのナレッジ的なブログ

Apacheモジュールのマニフェストを書く

Apacheモジュール用のマニフェストを書いていきます。
具体的には以下のファイルを作成します。

/etc/puppet/modules/http/manifests/init.pp

moduleのマニフェストを作成する際には、以下のルールを守る必要があります。
他にもルールはあるのですが、まずは、以下を抑えておけば最低限書くことはできると思います。

  • init.ppを必ず用意する
  • module名と同じclassを用意する必要がある
    • 今回でいうと、httpというclassを作成する必要があります

骨組み

出来上がり品を見せる前に、今回作成するhttpクラスの骨組みを示します。
おおよそ、このような骨組みにします。

# cat /etc/puppet/modules/http/manifests/init.pp
class http (
    変数:運用する/しない
) {
    case 変数 {
       運用する: {
            - パッケージをインストールする
            - ファイルは、httpd.confのテンプレートを使用する
            - サービスは有効にする
        }

        運用しない: {
            - パッケージをインストールする
            - サービスは無効にする
        }
    }
}
# cat /etc/puppet/manifests/site.pp
node 'WEB01' {
    class { 'http':
        変数:運用する,
   }
}

node default {
    class { 'http':
        変数:運用しない,
   }

前回の記事の通り、今回は勉強環境のWEB01というサーバのみhttpを運用し、他のサーバでは運用しない構成とします。
今回は、クラスの変数として運用する/しないを用意し、その値に応じて処理を変えるようにしました。
あとは、/etc/puppet/manifests/site.ppにてクラスを呼び出し、サーバWEB01なら運用する、他のサーバなら運用しない。というふうにします。
サーバ単位でリソースをまとめる場合は、上記のようにnode定義を使用すればOKです。

実際のところ、この骨組みがスマートかどうかはわかりませんが、今回の勉強環境で実現するには十分だと思うので、これで進めていきます。

実際に書いて見た

上記の骨組みを、実際に記述して見ます。
細かい説明は省略しますが、おおよそ内容はつかめるのではないかと思います。

# cat /etc/puppet/modules/http/manifests/init.pp
class http(
    $enabled = 'false',    # 変数:運用する/しない
    $port = '80'           # 変数:ポート番号(templatesで使用する予定)
) {
    case $enabled {
        # Apacheを運用する場合
        'true': {

            # パッケージをインストールする
            package { 'httpd':
                ensure => present,
            }

            # ファイルは、httpd.confのテンプレートを使用する
            file { '/etc/httpd/conf/httpd.conf':
              ensure  => present,
              content => template('/etc/puppet/modules/http/templates/httpd.conf'),
              require => Package['httpd'],
            }

            # サービスは有効にする
            service { 'httpd':
              ensure  => running,
              enable  => true,
              subscribe => File['/etc/httpd/conf/httpd.conf'],
            }
        }

        # Apacheを運用しない場合
        'false': {

            # パッケージをインストールする
            package { 'httpd':
                ensure => present,
            }

            # サービスは無効にする
            service { 'httpd':
              ensure  => stopped,
              enable  => false,
            }
        }
    }
}
# cat /etc/puppet/manifests/site.pp
node 'WEB01' {
    # WEB01ではApacheは運用する
    class { 'http':
        enabled => 'true',
        port => '80'
   }
}

node default {
    # 他のサーバではApacheは運用しない
    class { 'http':
        enabled => 'false',
   }
}

補足として2点ほど

補足1

骨組みの説明には出ていきていない変数portを用意しています。
この変数を使用して、templatesに格納したhttpd.confにてポート番号を指定できるようにしています。

補足2

上記マニフェストを書いただけでは、Agentサーバへのマニフェストの適用はできません。
理由は、templateのhttpd.confを用意していないためです。
puppet agent -t --verbose --noopを任意のAgentサーバで実行してみると、適用に失敗するかと思います。

細く2点を踏まえて、詳しいことは次回以降取り上げます。

参考

この記事は、以下を参考にしています。

私とPuppet 基本編 その1 (Resource,Ordering,Class,Define,Node) - Qiita