Puppet Manifest の書き方

Puppetの簡単な説明

PuppetとはRubyで作られているシステム自動管理ツールです。
競合としてChefなどがあります。

例えばひとつのサーバでサービスを稼働して、
容量が足らないのでもう一つ増やすとなった場合簡単にコピーを作成することができます。

しかしコマンド実行のマニフェストが独特な構文のため、実際に利用することを断念することが多いため、
構文について説明します。

パッケージのインストールする

yum install git

Puppet Manifest

package { 'git':
    ensure   => 'installed', # 
    provider => 'yum',    # 使用するプロバイダ yum, gem ...
}

ユーザを作成する

useradd puppetuser

Puppet Manifest

user {
    'puppetuser':
    home => '/home/puppetuser',
    managehome => true,
    uid => ***, # ユーザID
    gid => ***, # グループID
    groups => 'puppetgroup',
    shell => '/bin/bash',
    comment => 'puppetuser',
    ensure => present
}

ユーザのパスワードを設定する

passwd puppetuser

Puppet Manifest

# glub-crypt にて生成 testのハッシュ
$password = '$6$OXRz84Tay0sxTjEN$Aiba7OiA1Q.pXqHwMU2hQbjx/4vfha00/Gech2Psvxn/iTshLLrfH3HQ0116N8Tr0bTYFxUbSUJT.MHCnALlS0'
exec {
    'create password':
    command => "usermod -p '${password}' puppetuser",
    path => ["/bin", "/sbin", "/usr/bin", "/usr/sbin"],
    user => 'root', # このコマンドの実行ユーザ
}

ディレクトリを作成する

mkdir /home/puppetuser/directory

Puppet Manifest

file {
    "craete /home/puppetuser/directory":
    ensure => "directory",
    mode => "0640",
    owner => "puppetuser",
    group => "puppetuser",
}

実行コマンドをまとめて実行する

例としてここではnode.jsのインストールを行います。

wget http://nodejs.org/dist/v0.12.0/node-v0.12.0.tar.gz
tar -zxf node-v0.12.0.tar.gz.tar.gz
cd ./node-v0.12.0
./configure
make
make install

Puppet Manifest

# グローバルで使用するpath (以下のコマンドではこのpathを使うという意味)
Exec { path => [ "/bin/", "/sbin/" , "/usr/bin/", "/usr/sbin/" ] }
# version
$node_version = 'v0.12.0'
# wget nodejs.tar.gz
exec {
    'wget-nodejs':
    alias => 'wget-nodejs', # グローバルの名前
    command => "wget http://nodejs.org/dist/v${node_version}/node-${node_version}.tar.gz",
    cwd => '/home/puppetuser/git/', # 実行ディレクトリ current working directory 
    user => puppetuser,
}
# 解凍
exec {
    'tar-zxf-nodejs':
    alias => 'tar-zxf-nodejs',
    command => "tar -zxf node-${node_version}.tar.gz",
    cwd => '/home/puppetuser/git/',
    require => Exec['wget-nodejs'], # wget-nodejs後に実行
    user => puppetuser,
}
exec {
    'configure-nodejs':
    alias => 'configure-nodejs',
    command => './configure',
    cwd => "/home/puppetuser/git/node-${node_version}",
    require => Exec['tar-zxf-nodejs'], # 解凍してから実行
    user => puppetuser,
}
exec {
    'make-nodejs':
    alias => 'make-nodejs',
    command => 'make',
    cwd => "/home/puppetuser/git/node-${node_version}",
    require => Exec['configure-nodejs'], # configure後に実行
    user => puppetuser,
}
exec {
    'make-install-nodejs':
    alias => 'make-install-nodejs',
    command => 'make install',
    cwd => "/home/puppetuser/git/node-${node_version}",
    require => Exec['make-nodejs'], # make後に実行
    user => puppetuser,
}

Puppet Manifestではコマンドを上から順次実行していくので、
requireで依存関係をつけて順番に実行させています。

Execは各execの集合です。
つまりExec['export-path'] == exec["export-path"]です。

Rubyで作られているためRubyファイルを実行することも出来ますが、
それについては省略します。