Puppet

環境

Mac

  • MacOS 10.11
  • Vagrant 1.8.1
  • Virtual Box バージョン 5.0.14

VM

  • puppet 3.1.1
  • ruby1.8.7(yum)

説明

  • Vagrant固有の箇所については省略してます。※vagrant up,halt,destroyなど

第3章 Vagrantで開発環境を用意する

[Mac]
$ mkdir ~/Github;cd ~/Github
$ git clone git://github.cim/kentaro/puppet-book-support.git
$ cd puppet-book-support
$ vagrant up
$ vagrant ssh <-- sshログインできることを確認して、ログアウト
$ vagrant ssh-config --host pptest1 >> ~/.ssh/config  <-- ssh pptest1 でSSH出来るようになる。※pptest1の箇所は何でもOK

第4章 Hello, Puppet!

Hello World!デプロイする

[Mac]
$ vagrant ssh
[VM]
$ puppet --version
3.1.1
$ cd /vagrant/puppet-book-support/puppet/hello_puppet
$ puppet apply hello_world.pp
Notice: Scope(Class[main]): Hello, World!
Notice: Finished catalog run in 0.03 seconds 

zshをインストール

[VM]
$ cd /vagrant/puppet-book-support/puppet/hello_puppet
$ sudo puppet apply zsh.pp
Notice: /Stage[main]//Package[zsh]/ensure: created
Notice: Finished catalog run in 19.85 seconds
$ which zsh
/bin/zsh

gemでPuppetをインストールする場合

[Mac]
$ vagrant ssh
[VM]
$ which ruby
/usr/bin/which: no ruby
$ su -
# yum install ruby rubygems
# which ruby
/usr/bin/ruby
# ruby version
ruby 1.8.7
# which gem
/usr/bin/gem
# gem --version
1.3.7
# gem install puppet --no-rdoc --no-ri
Successfully installed facter-2.4.6
Successfully installed json_pure-1.8.3
Successfully installed hiera-3.0.6
Successfully installed puppet-4.3.2
4 gems installed
# gem list --local | grep puppet
puppet (4.3.2)

以上

第5章 nginxのmanifestを書く

[VM]
$ cd /vagrant/puppet
$ mkdir nginx_original
$ cd nginx_original
$ vim nginx_original
---
yumrepo { 'nginx':
 descr => 'nginx yum repository',
 baseurl => 'http://nginx.org/packages/rhel/$releasever/$basearch/',
 enabled => '1',
 gpgcheck => 0,
}

package { 'nginx':
 ensure => installed,
 require => Yumrepo['nginx'],
}

$port = 80

file { '/etc/nginx/conf.d/my.conf':
 ensure => present,
 owner => 'root',
 group => 'root',
 mode => '0644',
 content => template('my.conf'),
 require => Package['nginx'],
 notify => Service['nginx'],
}

$target = 'Puppet'

file { '/usr/share/nginx/html/index.html':
 ensure => present,
 owner => 'root',
 group => 'root',
 mode => '0644',
 content => template('index.html'),
 require => Package['nginx'],
}

service { 'nginx':
 enable => true,
 ensure => running,
 hasrestart => true,
 require => File['/etc/nginx/conf.d/my.conf'],
}
---
$ mkdir template
$ vim index.html
---
Hello <%= target %>
---
$ vim my.conf
--- 
server {
 listen <%=port %>;
 server_name localhost;

 location / {
   root /usr/share/nginx/html;
   index index.html;
 }
}
---
$ cd ../
$ sudo puppet apply --templatedir=template/ nginx.pp
Notice: /Stage[main]//Yumrepo[nginx]/descr: descr changed '' to 'nginx yum repository'
Notice: /Stage[main]//Yumrepo[nginx]/baseurl: baseurl changed '' to 'http://nginx.org/packages/rhel/$releasever/$basearch/'
Notice: /Stage[main]//Yumrepo[nginx]/enabled: enabled changed '' to '1'
Notice: /Stage[main]//Yumrepo[nginx]/gpgcheck: gpgcheck changed '' to '0'
Notice: /Stage[main]//Package[nginx]/ensure: created
Notice: /Stage[main]//File[/usr/share/nginx/html/index.html]/content: content changed '{md5}e3eb0a1df437f3f97a64aca5952c8ea0' to '{md5}58e958909fda3cd0f1a86ac8b0ba25b4'
Notice: /Stage[main]//File[/etc/nginx/conf.d/my.conf]/ensure: created
Notice: /Stage[main]//Service[nginx]/ensure: ensure changed 'stopped' to 'running'
Notice: /Stage[main]//Service[nginx]: Triggered 'refresh' from 1 events
Notice: Finished catalog run in 17.01 seconds
$ curl http://localhost/
Hello Puppet

dependency relationshipについて

  1. yumリポジトリを登録する
    • 依存関係無し
  2. nginxパッケージをインストールする
    • 依存関係有り→require => Yumrepo['nginx'],
  3. 設定ファイルを配置する
    • 依存関係有り→require => Package['nginx'], notify => Service['nginx'],
  4. サービスを起動する
    • 依存関係有り→require => Package['nginx'],

第6章 パッケージをインストールする

パターン1

$ vim package.pp
package {'zsh':
  ensure => installed,
}

パターン2

package {
  [
    'gcc',
    'rsync',
    'wget',
   ]:
   ensure => installed,
}

パターン3

$packages = [
   'gcc',
   'rsync',
   'wget',
]

package {$packages:
  ensure => installed,
}

第7章 yumリポジトリを登録する

yumrepo { 'nginx':
  descr => 'nginx yum repository',
  baseurl => 'http://nginx.org/packages/centos/6/$basearch/',
  enabled => 1,
  gpgcheck => 0,
}

第8章 サービスを起動する

パターン1 > 特定のファイルに変更があったら、nginxが再起動する

service { 'nginx':
  ensure => running,
  enable => true,
  hasrestart => true,
  require => File['/etc/nginx/conf.d/my.conf'],
  subscribe => File['/etc/nginx/conf.d/my.conf'],
}

パターン2 > ファイルが置かれたらservice nginxに通知 > nginxが再起動する

service { 'nginx':
  ensure => running,
  enable => trure,
  hasrestart => true,
  require => File['/etc/nginx/conf.d/my.conf'],
}

file {'/etc/nginx/conf.d/my.conf':
  ensure => present,
  owner => 'root',
  group =>  'root',
  mode  =>  '0644',
  content => template('my.conf'),
  require => Package['nginx'],
  notify  =>  Service['nginx'],
}

第9章 ファイルやディレクトリを作成する

パターン1(ファイルの作成)

$ vim test.pp
file {'/tmp/hello_puppet.txt':
  content => "Hello,Puppet!!¥n",
}
$ puppet apply test.pp
Notice: /Stage[main]//File[/tmp/hello_puppet.txt]/ensure: defined content as '{md5}a6010e5381b0fcaae7b38e67e446775d'
Notice: Finished catalog run in 0.03 seconds
$ cat /tmp/hello_puppet.txt
Hello,Puppet!!

パターン2(ファイルの作成,オリジナル)

$ mkdir template
$ vim template/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
$ vim resolv.pp
file {'/etc/resolv.conf':
  ensure => present,
  owner  => root,
  group  => root,
  mode   => 0644,
  content => template('resolv.conf'),
}
$ sudo puppet apply resolv.pp
Notice: /Stage[main]//File[/etc/resolv.conf]/content: content changed '{md5}1ebb0185f2893f6ff73e29a7bee53e2d' to  '{md5}c7ea09d26e26605227076e0514a33038'
Notice: Finished catalog run in 0.03 seconds
$ cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4

パターン3(ファイルの作成,変数)

$ vim test.pp
$content = "Hello,Puppet!!"

file {'/tmp/hello_puppet_template.txt':
 content => template("hello_puppet_template.erb"),
}
$ vim template/hello_puppet_template.erb
<%= content %>
$ sudo puppet apply test.pp --templatedir=template/
Notice: /Stage[main]//File[/tmp/hello_puppet_template.txt]/ensure: defined content as '{md5}a6010e5381b0fcaae7b38e67e446775d'
Notice: Finished catalog run in 0.03 seconds

パターン1(ディレクトリの作成)※下記方法だと再帰的にディレクトリを作成できないので注意

$ vim test.pp
file {'/tmp/hello_puppet/':
  ensure => directory,
  owner  => 'root',
  group   => 'root',
  mode    => '0755',
}
$ sudo puppet apply test.pp    <= rootの所有者,グループにするのでsudoが必要
Notice: /Stage[main]//File[/tmp/hello_puppet]/ensure: created
Notice: Finished catalog run in 0.03 seconds 
$ ls -l /tmp/
drwxr-xr-x 2 root    root    4096  3月 18 00:52 2016 hello_puppet

パターン1(シンボリックリンクの作成)

$ vim test.pp
file {'/tmp/hoge':
 ensure => link,
 target => '/etc/hosts',
 owner  => 'root',
 group  => 'root',
 mode   => '0644',
}
$ sudo puppet apply test.pp
Notice: /Stage[main]//File[/tmp/hoge]/ensure: created
Notice: Finished catalog run in 0.03 seconds
$ ls -l /tmp
lrwxrwxrwx 1 root    root      10  3月 18 01:10 2016 hoge -> /etc/hosts

第10章 ユーザやグループを作成する

ユーザーの作成

$ vim user.pp
user {'testuser':
ensure  =>  present,
comment =>  'testuser',
home    =>  '/home/testuser',
managehome => true,
shell   =>  '/bin/zsh',
}

managehome をtrueにすることで、ensureがpresentの際はホームディレクトリを作成し、ensureがabsentの時はホームディレクトリを削除する

$ sudo puppet apply user.pp
Notice: /Stage[main]//User[testuser]/ensure: created
Notice: Finished catalog run in 0.10 seconds
$ ls -l /home/
drwx------  2 testuser testuser 4096  3月 20 04:08 2016 testuser

グループの作成

$ vim group.pp
group {'developers':
 ensure => present,
 gid    => 999,
}
$ sudo puppet apply group.pp
Notice: /Stage[main]//Group[developers]/ensure: created
Notice: Finished catalog run in 0.07 seconds
$ sudo cat /etc/group | grep developers
developers:x:999:

ユーザーとグループを作成して、指定したグループに所属させる

$ vim user.pp
user {'testuser':
ensure  =>  present,
gid     =>  'guest',
comment =>  'testuser',
home    =>  '/home/testuser',
managehome => true,
shell   =>  '/bin/zsh',
}

group {'guest':
  ensure  =>  present,
  gid     =>  1000,
}
$ sudo puppet apply user.pp
Notice: /Stage[main]//Group[guest]/ensure: created
Notice: /Stage[main]//User[testuser]/gid: gid changed '503' to 'guest'
Notice: Finished catalog run in 0.10 seconds

第11章 任意のコマンドを実行する -exec

※xbuildの実行についてはリポジトリ内のマニフェストを実行しても正常に処理されなかったため一旦飛ばす。

execコマンドでファイルを作成

$ vim test.pp
exec { "touch test.txt":
 user => 'vagrant',
 cwd  => '/tmp',
 path => ['/bin','/usr/bin'],
 creates => '/tmp/test.txt',
}

cwd → このパスで実行する
path → pathを指定しないとコマンドが実行できない
creates → 冪等性を保つために指定する。これがあると再実行した際にtouchコマンドは実行されない。
$ sudo puppet apply test.pp    <--sudoを付けないと特定ユーザーとしてのコマンドは実行できないというエラーが表示される。
Notice: /Stage[main]//Exec[touch test.txt]/returns: executed successfully
Notice: Finished catalog run in 0.09 seconds
$ ls -l /tmp/
-rw-r--r-- 1 vagrant vagrant    0  3月 23 00:36 2016 test.txt
$ sudo puppet apply test.pp
Notice: Finished catalog run in 0.02 seconds
$ ls -l /tmp/
-rw-r--r-- 1 vagrant vagrant    0  3月 23 00:36 2016 test.txt
↑変化無し=上書きされていないことがわかる。

第12章 td-agentのmanifestを書く

説明のみのため飛ばす

第13章 resource typeのグルーピング - class

$ cd /vagrant/puppet
$ mkdir class
$ vim td-agent.pp
class td-agent {
 include td-agent::install
 include td-agent::config
 include td-agent::service

 Class['td-agent::install']
 -> Class['td-agent::config']
 ~> Class['td-agent::service']

}

class td-agent::install{
 yumrepo { 'treasuredata':
   descr => 'treasuredata',
   name  => 'treasuredata',
   baseurl => 'http://packages.treasure-data.com/redhat/$basearch/',
   enabled => 1,
   gpgcheck => 0,
 }

 package {'td-agent':
   ensure => installed,
   require => Yumrepo['treasuredata'],
 }
}

class td-agent::config{
 file {'/etc/td-agent/td-agent.conf':
   content => template('td-agent.conf'),
 }
}

class td-agent::service{
 service {'td-agent':
   enable => true,
   ensure => running,
   hasrestart => true,
 }
}

include td-agent

$ vim td-agent.conf
<source>
 type forward
</source>

<match debug **>
 type stdout
</match>

$ sudo puppet apply td-agent.pp
$ sudo service td-agent status
td-agent (pid  6815) is running...
$ echo '{"hello":"puppet"}' | /usr/lib64/fluent/ruby/bin/fluent-cat debug.test
$ cat /var/log/td-agent/td-agent.log
2016-03-31 09:33:08 +0900 debug.test: {"hello":"puppet"}

第14章 manifestに関連するファイルをまとめる - module

$ mkdir -p modules/td-agent $ mkdir manifests $ mkdir templates $ vim init.pp

class td-agent {
 include td-agent::install
 include td-agent::config
 include td-agent::service

    Class['td-agent::install']
 -> Class['td-agent::config']
 ~> Class['td-agent::service']
}

$ vim install.pp
class td-agent::install {
 yumrepo { 'treasuredata':
   name     => 'treasuredata',
   descr    => 'treasuredata repo',
   baseurl  => 'http://packages.treasure-data.com/redhat/$basearch/',
   enabled  => 1,
   gpgcheck => 0,
 }

 package { 'td-agent':
   ensure  => installed,
   require => Yumrepo['treasuredata'],
 }
}

$ vim service.pp

class td-agent::service {
 service { 'td-agent':
   enable     => true,
   ensure     => running,
   hasrestart => true,
 }
}

$ vim config.pp

class td-agent::config {
 file { '/etc/td-agent/td-agent.conf':
   content => template("td-agent/td-agent.conf"),
 }

 file {'/etc/td-agent/conf.d':
   ensure => directory,
 }
}

$ vim templates/td-agent.conf
include conf.d/*.conf

<source>
 type forward
</source>

# Debug
<match debug.**>
 type stdout
</match>

# ivent log
<match fluent.**>
type file
path /var/log/td-agent/fluent.log
</match>

# not match
<match **>
type file
path /var/log/td-agent/no_match.log
</match>

# drb
<source>
type debug_agent
port 24230
</source>

$ sudo puppet apply --modulepath=. --execute 'include td-agent'

第15章

第16章 サーバーの役割を定義するPart2


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-06-30 (木) 01:40:11