読者です 読者をやめる 読者になる 読者になる

PuppetのマニフェストとChefのレシピの書き方比較

Puppetのマニフェストを全部Chefのレシピに書きなおしてみました。
ので、その違いとか。

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

例:httpdのインストール

Puppet
package { 'httpd':
        name => 'httpd',
        ensure => latest,
        require => File['/etc/yum.repos.d/CentOS-Base.repo'],
        }
Chef
package 'httpd' do
  action :install
end


パッケージのアンインストール

例:sendmailのアンインストール

Puppet
package { 'sendmail':
	ensure => purged,
	}
Chef
package 'sendmail' do
  action :remove
end


デーモンの起動と自動起動設定

例:httpdの起動と自動起動設定

Puppet
service {'httpd':
     name => 'httpd',
     enable => 'true',
     ensure => running,
        require => Package['httpd'],
     }
Chef
service 'httpd' do
  action [:enable, :start]
end


ファイルのownerやパーミッションの変更

例:/tmp/test.txtのownerやパーミッションの変更

Puppet
file { '/tmp/test':
    owner => 'root',
    group => 'root',
    mode  => 644,
}
Chef
file '/tmp/test.txt' do
  owner 'root'
  group 'root'
  mode '0644'
end


ディレクトリの作成

例:/tmp/testdirを作成
既にディレクトリが存在したら上書きしない。パーミッションなど。

Puppet
     file { '/tmp/testdir':
     ensure => directory,
     owner => 'root',
     group => 'root',
     mode => 775,
     recurse => 'true',
     replace     => 'false',
     }
Chef
directory '/tmp/testdir' do
  owner 'root'
  group 'root'
  recursive true
  mode 0775
  action :create
  not_if { File.exists? '/tmp/testdir' }
end


グループの作成

例:testgroupを作成

Puppet
group { 'testgroup':
     gid => 500;
}
Chef
group 'testgroup' do
  gid 500
  action :create
end


ユーザの作成

例:testuser作成

Puppet
user { 'testuser':
        gid => 500,
     home => '/home/testuser',
     managehome => true,
     shell => '/bin/bash',
}
Chef
user 'testuser' do
  home '/home/testuser'
  shell '/bin/bash'
  uid 10000
  gid 'testgroup'
  supports :manage_home => true
  action :create
end


テンプレートファイルを使ったファイルの配置

例:/etc/aliasesを配置

Puppet
file { '/etc/aliases':
     content  => template('/etc/puppet/manifests/templates/etc/aliases'),
     owner => 'root',
     group => 'root',
     mode => 644,
     }
Chef
template '/etc/aliases' do
  source 'etc/aliases.erb'
  group 'root'
  owner 'root'
  mode '0644'
  notifies :run, 'execute[newaliases]'
end


execを使ったシステムコマンドの実行

例:/etc/aliasesが更新されたらnewaliasesコマンドを実行

Puppet
exec { 'newaliases':
     path => ['/usr/bin'],
     command => 'newaliases',
     require => File['/etc/aliases'],
     subscribe => File['/etc/aliases'],
     refreshonly => true,
     }
Chef
execute 'newaliases' do
  command '/usr/bin/newaliases'
  action :nothing
end


テンプレートに変数を埋め込む構文

例:/etc/resolv.confのテンプレートにドメインとNSのIPを埋め込む

Puppet

ドメインはfacter変数を埋め込む(domain)
NSのIPアドレスはマニフェストで定義した独自定義変数を埋め込む(nameserver01とnameserver02)

テンプレートファイル

search <%= domain %>
nameserver <%= nameserver01 %>
nameserver <%= nameserver02 %>

facter変数
以下コマンドで出力されたものが代入される。

facter domain

マニフェスト独自変数定義

class common {
    resolv_conf{resolv:
        nameserver01 => '10.0.53.1',
        nameserver02 => '10.0.53.2',
    }
Chef

ドメインはohai変数を埋め込む(domain)
NSのIPアドレスはレシピで定義した独自定義変数を埋め込む(nameserver01とnameserver02)

テンプレートファイル

search <%= node['domain'] %>
nameserver <%= @nameserver01 %>
nameserver <%= @nameserver02 %>

Puppetはfacter変数も独自定義変数もテンプレートファイルに埋め込む書式は一緒だったが、
Chefはohai変数と独自定義変数は書式が異なる。

ohai変数
以下コマンドで出力されたものが代入される。

ohai domain

変数をAttribute化

default['resolv']['nameserver01'] = '10.0.53.1'
default['resolv']['nameserver02'] = '10.0.53.2'

attribute化した変数をレシピで定義

template '/etc/resolv.conf' do
  source 'etc/resolv.conf.erb'
  group 'root'
  owner 'root'
  mode '0644'
  variables(
    :nameserver01 => node['resolv']['nameserver01'],
    :nameserver02 => node['resolv']['nameserver02']
  )
end