それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

puppetで構成管理で困ったときに最初に見るまとめ。

puppetで構成管理をする。なれると楽と言うか、安心していられる。なんせ台数が増えるとこれがないと安心できない。

一番参考になる puppet 資料

http://www.sssg.org/~naoya/puppet/project.html

puppetで設定を適用する

とりあえず設定を反映したりテストする。

$>puppetd --server debian00.local --no-daemonize --verbose  --onetime

オプションの説明はこれ

--sever
puppetmasterサーバー指定
--no-daemonize --onetime
この一回だけを実行する。
--verbose
進捗表示

これでクライアントが、サーバーに設定を取りにいく。


puppet masterサーバーをフロントで起動して状況を見る

進捗状況が表示されながら、クライアントの接続状況がみえる。

sudo /usr/sbin/puppetmasterd  --no-daemonize  --verbose
--no-daemonize
デーモン化せずに、フロントで起動
--verbose
進捗表示

puppet 設定ディレクトリ

debianの場合はこんな感じになっていた。

/etc/puppet/
├── auth.conf                   -------------------------------  マスターに接続許可するネットマスク
├── autosign.conf             ---------------------------       SSL通信をするクライアント設定
├── files                            --------------------------  同期用ファイル
│   ├── etc
│   │   ├── apt
│   │   │   ├── sources.list
│   │   │   └── sources.list.d
│   │   │       ├── hadoop.list
│   │   │       └── virtualbox.list
│   │   ├── hosts
│   │   ├── ntp.conf
│   │   ├── resolv.conf
│   │   ├── ssh
│   │   │   └── sshd_config
│   │   └── sudoers
│   ├── home
│   │   └── takuya
│   └── var
│       └── cache
│           └── debconf
│               └── jre6.seeds 
├── fileserver.conf        --------------------------------------  同期用ファイルの設置場所など
├── manifests
│   └── site.pp              --------------------------------------   puppetの同期設定。一番大事
├── modules
├── puppet.conf            ---------------------------------------   puppet自体の設定
└── templates    

puppet 設定の自動生成

Syntaxエラーなしに設定書くのがしんどい。その上、どう書いていいかわからない。サンプルもよくわからない。
そこで、Generatorを活用する。

ralsh を使う

ユーザー設定の作成

takuya@debian00:~$ ralsh user takuya
user { 'takuya':
    ensure => 'present',
    shell => '/bin/bash',
    uid => '1000',
    gid => '1000',
    comment => 'here,i am ',
    home => '/home/takuya',
    groups => ['takuya','admin']
}

パッケージ設定の作成

takuya@debian00:~$ ralsh package openssh-server
package { 'openssh-server':
    ensure => '1:5.5p1-6+squeeze1'
}

基本設定のジェネレーター

  • ralsh user
  • ralsh package

これで、現在の設定をすべて取り出せる。

設定の連鎖についての設定

ある設定が書き換わったら、まとめて更新する という設定。

たとえば、ntpdサーバー設定が変わったら、ntpdを再起動するみたいな

 19 class ntp {
 20   package { 'ntp' : ensure => latest
 21   file { '/etc/ntp.conf':
 22     source  => 'puppet://debian00.loc
 23     require => Package['ntp'],
 24   }
 25   service { 'ntp':
 26     ensure  => running,
 27     enable  => true,
 28     subscribe => [ File['/etc/ntp.con
 29   }
 30 }

こういう依存関係を記述できる所がPuppetの強みです。

a subscribe b
AはBが書き換わったら更新する
b notify a
Bが書き換わったらAを更新する
B require A
AのインストールにはBが必要

設定を有効にする

class A{
##ほげほげ
}
#作ったクラスを有効に
include A 


include を書かないとClassは有効にならないので注意。
逆に、Classは残すけど、無効化するときは、include をコメントする。

ファイルが書き換わったらコマンドを実行する

ファイルが書き換わったら、◯◯コマンドを実行する。

300   }
301   exec{ "hadoop_restart":
302     command =>  'for service in /etc/init.d/hadoop-0.20-*;do sudo $service restart;done;',
303     refreshonly => true,
304     path =>  '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
305     subscribe => [
306             File['/etc/hadoop/conf.my_cluster/slaves'],
307             File['/etc/hadoop/conf.my_cluster/masters'],
308             File['/etc/hadoop/conf.my_cluster/mapred-site.xml'],
309             File['/etc/hadoop/conf.my_cluster/log4j.properties'],
310             File['/etc/hadoop/conf.my_cluster/hdfs-site.xml'],
311             File['/etc/hadoop/conf.my_cluster/hadoop-policy.xml'],
312             File['/etc/hadoop/conf.my_cluster/hadoop-metrics.properties'],
313             File['/etc/hadoop/conf.my_cluster/hadoop-env.sh'],
314             File['/etc/hadoop/conf.my_cluster/fair-scheduler.xml'],
315             File['/etc/hadoop/conf.my_cluster/core-site.xml'],
316             File['/etc/hadoop/conf.my_cluster/configuration.xsl'],
317             File['/etc/hadoop/conf.my_cluster/capacity-scheduler.xml']],
318   }
319   exec { "hadoop_enable_my_conf":
320     command =>  'update-alternatives --install /etc/hadoop-0.20/conf hadoop-0.20-conf /etc/hadoop-0.20/conf.my_cluster 50',
321     refreshonly => true,
322     path =>  '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
323     subscribe => File['/etc/hadoop/conf.my_cluster']
324   }

証明書がおかしくなったら、クライアント側の証明書を消す

PuppetサーバーとPuppetクライアントの間は、証明書でお互いを確認しているが、それが時々壊れるので。一旦、証明書を破棄する。

sudo su 
cd /var/lib/puppet/ssl
find -name "*.pem" | xargs -I@ rm @

そしておもむろに、再接続。

サーバー側でautosign.confに指定されているドメインなら一瞬で終わるよ

puppetでpuppetがインストールできない。

問題は、puppet がインストールされている環境を作り込むことです

どうやってもpuppetで管理できないもの

resolv.conf ---puppet はresolv.confのエラーを修正できないことがる。これが壊れると証明書関連のエラーになってファイルを受信できないのでresolv.confの破壊後はresolv.confを使うPuppetはエラーになる。

次の失敗はpuppetが壊れるので再起不能になる。

puppet自身の更新失敗
rubyの動作不良
rubygemsの破壊

なのでシステムRubyの更新は慎重に。被害甚大です。

わかりやすいドキュメント(オススメ)

http://www.sssg.org/~naoya/puppet/project.html