Puppet(パペット) †
- メリット
- 1台のmasterで多数(100台以上)のagentを管理できる
- agentが常駐して定期実行もできるため、定期的に更新する用途に向いている
- デメリット
- DSLの上から下に実行されない。リソースの依存関係を設定しないと、実行時に順序が決定されてしまい、1回目は失敗するが、2回目は成功するなど不安定な挙動になる。これがプログラマにとって理解しにくく、忘れがち
- DSLの構文がRubyのようでRubyでないため、覚えにくい。Rubyの知識があってもそのまま書けない
- 歴史があるため、古いバージョン向けの情報と新しいバージョン向けの情報が混在して理解しにくい。
puppetserverの起動時のタイムアウトを延長 †
puppet v3のデフォルトが2分で、起動時にタイムアウトしてしまう事がある。
puppet v5のデフォルトは5分になっている。
mongodb †
ファイルの存在チェック †
- /tmp/example.tmp ファイルが無い場合に失敗させる
exec { "tmp-exist":
command => "false",
unless => "test -f /tmp/example.tmp",
path => ["/usr/bin", '/bin'],
}
現在の設定値の表示 †
puppet.confに未定義だが、デフォルト値を確認したい時など。
Could not find class †
古いrpmパッケージの取得/yum repoがダウンした時 †
- ansibleでarchivesのyum repoを追加する場合
- defaults または vars
puppetlabs_archive_enabled: yes
puppetlabs_archive_yum_repository:
- name: "puppetlabs-products-archives"
description: "Puppet Labs Products El $releasever - $basearch"
baseurl: "http://release-archives.puppet.com/yum/el/$releasever/products/$basearch"
- name: "puppetlabs-deps-archives"
description: "Puppet Labs Dependencies El $releasever - $basearch"
baseurl: "http://release-archives.puppet.com/yum/el/$releasever/dependencies/$basearch"
- role または task
- name: install archive repository
yum_repository:
name: "{{ item.name }}"
description: "{{ item.description }}"
baseurl: "{{ item.baseurl }}"
enabled: yes
gpgcheck: no
state: "{{ 'present' if puppetlabs_archive_enabled else 'absent' }}"
with_items: "{{ puppetlabs_archive_yum_repository }}"
octocatalog-diff: 2つのブランチ間の変更を表示 †
VM/dockerで試す時 †
ベストプラクティス †
Selectorsを使って インストール/アンインストール処理 †
三項演算子同じような処理がしたい時
- /etc/puppet/modules/example/manifests/init.pp 例:enabledフラグによって、ファイル、ディレクトリの作成と削除を行う
- ディレクトリ削除時に「force => true」にすると強制的に削除される
- hieraで「true/false」が文字列として渡されるので「str2bool($enabled)」が必要
- geppettoだと「default」が無いと警告が出る
class example(
enabled = false
){
file {
'/opt/example':
mode => 755,
force => true,
ensure => str2bool($enabled) ? { true => directory, default => absent };
'/opt/example/start.sh':
mode => 755,
ensure => str2bool($enabled) ? { true => file, default => absent },
require => File['/opt/example'],
content => template('example/start.erb');
}
}
undefined method ... for nil:NilClass †
- 解決: hieraに誤りがある。YAML構文で区切り文字が「---」だが、「--」に間違えると発生。
provider: pipを使えるようにする †
- pipをインストール。'pip-python'が存在しないと失敗するので作成。
package { ['python-setuptools', 'python-pip']: ensure => 'installed' } ->
file { '/usr/bin/pip-python':
ensure => 'link',
target => '/usr/bin/pip',
require => Package["python-pip"]
}
プロキシを経由して実行する †
create_resources: 複数回のリソース呼び出し時にハッシュを渡す †
ハッシュで複数項目を定義して、複数回のリソース(ファイル等)呼び出し時に利用できる。
hieraからhashを渡す時にも使える。
- puppet v3.xの場合:create_resources 3番目の引数はデフォルト値を指定できる
class test::main(
$files = {
'/var/log/messages' => {
'mode' => '0640',
'group' => 'wheel',
},
}
){
$defaults = {
ensure => file,
notify => Service['td-agent'],
}
create_resources('file', $files) # 標準のfileリソースを使う場合
# create_resources('test::set_attr', $files, $defaults) # 独自のdefineを使う場合
}
define test::set_attr(
$ensure = file,
$mode = '0640',
$owner = 'root',
$group = 'wheel'
) {
file { "${title}":
ensure => $ensure,
mode => $mode,
owner => $owner,
group => $group,
}
}
puppet実行時に色(エスケープシーケンス)を付けない †
- puppetの標準出力を取り込む時に、エスケープシーケンスが邪魔な時がある
hieraをローカルでテストする †
- 単純な"key: value"形式なら、"key"だけ指定すれば参照できる。
- hiera中のハッシュや配列を参照する方法が分からない
hiera:設定値をyamlファイルで管理 †
- hiera内で任意のkey: valueを定義できる。manifest上に存在しない変数でもOK
foo: "var123"
文字列の置換 †
- perlを使って、正規表現で置換。シングルクオートとダブルクオートの場合で動作が異なったので注意。
- defines.inc.php
-define('ZBX_GRAPH_FONT_NAME', 'DejaVuSans'); // font file name
+define('ZBX_GRAPH_FONT_NAME', 'ipagp'); // font file name
- example.pp
exec { "/usr/bin/perl -pi.bak -e \"s/ZBX_GRAPH_FONT_NAME\',\\s+\'DejaVuSans/ZBX_GRAPH_FONT_NAME\', \'ipagp/\" 'defines.inc.php'"
: onlyif => "/usr/bin/perl -ne \"BEGIN { \\\$ret = 1; } \\\$ret = 0 if /ZBX_GRAPH_FONT_NAME\',\\s+\'DejaVuSans/ ; END { exit \\\$ret; }\" 'defines.inc.php'",
}
テンプレート(Templates) †
セキュリティアップデート †
Error: Could not retrieve catalog from remote server: SSL_connect returned=1 errno=0 state=SSLv3 read server session ticket A:... †
- 環境
- CentOS 6.x x86_64
- puppet 3.4.x
- master, agentでdate,timeがずれている場合。ntpや ntpdate ntp.nict.jp 等で時刻を合わせる。master,agentでTimeZoneが異なっていても問題は無い
- master,agentのcertを消して再登録する方法(これで直ったケースあり)
- puppet agent側: hostname=agent.example.com
sudo rm -rf /var/lib/puppet/ssl
sudo puppet agent --server master.example.com --no-daemonize --verbose --onetime --pluginsync --noop --test
- puppet master側: hostname=master.example.com
sudo puppet cert list
sudo puppet cert sign agent.example.com
# certを削除する場合
sudo puppet cert clean agent.example.com
- masterのpuppet.confで「certificate_revocation=false」にする方法?影響範囲がよく分からず
facter: Illegal instruction †
puppetでこのエラーが出て調べた所、facterのエラーメッセージだった。
なぜか、t1.microで発生し、m1.smallでは発生しなかった。
既存ファイルの先頭に追加する †
古いpuppet reportsを削除する †
puppet masterの/var/lib/puppet/reports/に古い*.yamlが貯まって、ディスクが溢れる場合がある。
- そもそもpuppet agent apply時(--noopでも増える)にreportsを保存しないように変更
r10k: 環境毎にmanifestとmoduleを分ける †
fqdn_rand : ランダム †
- 例: cronの実行分をランダムで決定
cron { 'test':
ensure => present,
user => 'user01',
hour => '*',
minute => fqdn_rand(60),
command => "/tmp/test.sh > /dev/null 2>&1";
}
stdlib:sortやjoinといったよく使われる関数を追加 †
デバッグメッセージの表示 †
- puppet master(/var/log/messages)に出力したい場合
notice("message")
MySQL †
メール通知 †
- manifestが更新された時だけ、1日1回メール送信
- puppet master側
vim /etc/puppet/puppet.conf
----
[master]
reports = tagmail,daily,security
reportfrom = puppetmaster@example.com
----
vim /etc/puppet/tagmail.conf
----
all: user01@example.com
----
service puppetmaster restart
- puppet agent側
vim /etc/puppet/puppet.conf
----
[agent]
report=true
----
stage:実行の順序を指定できる †
プロセス監視 monitのインストール †
サーバに常駐して指定したプロセスを監視し、落ちたら自動的に再起動等を設定できる
ログ管理 td-agent(fluentd)のインストール †
fluentdの安定版であるtd-agentをpuppetでインストール
- puppet-module-tdagent の導入
- manifest
node default {
include 'td-agent'
package { [ 'fluent-plugin-datacounter', 'fluent-plugin-growthforecast' ]:
ensure => 'installed',
provider => 'fluentgem',
require => Package['td-agent'],
}
}
- puppet実行後
less /etc/yum.repos.d/td.repo
chkconfig --list td-agent
td-agent 0:off 1:off 2:on 3:on 4:on 5:on 6:off
service td-agent status
td-agent (pid 2923) を実行中...
tree -a /etc/td-agent/
/etc/td-agent/
├── conf.d
├── plugin
├── prelink.conf.d
│ └── td-agent.conf
├── td-agent.conf
└── td-agent.conf.tmpl
3 directories, 3 files
naveで異なるバージョンのnodejsをインストールするmodule †
pp/erb/yamlファイルの構文チェック †
/.bashrc に追加
function puppet-validate() {
local ext=${1##*.}
case $ext in
[pP][pP])
puppet parser validate "$1"
;;
[eE][rR][bB])
erb -P -x -T '-' "$1" | ruby -c
;;
[yY][aA][mM][lL]|[yY][mM][lL])
ruby -e "require 'yaml'; YAML.parse(File.open('$1'))"
# find duplicate key
egrep -v "^( |-|$|#)" $1 | cut -d' ' -f1 | sort | uniq -d -c
;;
*)
echo "ERROR: $1 is not supported" 1>&2
;;
esac
}
- 実行
source ~/.bashrc
puppet-validate example.pp
puppet-validate example.erb
puppet-validate example.yaml
エラー †
- Could not retrieve catalog from remote server: wrong header line format
- テンプレートで「<%= %>」になっていない事が多い
エラー「Duplicate definition」 †
- 共通部分をクラスに分割して、includeを使う。includeは重複してもエラーにならないため。
include test::test_file
- definedでリソースの2重定義を避ける例(if ! define() でも良い)
node /^server\d+.localdomain/ {
define test::define_test {
if defined(File['/tmp/test.tmp']) == false {
file {
'/tmp/test.tmp':
ensure => file,
content => "test file",
;
}
}
}
test::define_test {
"test1":;
}
test::define_test {
"test2":;
}
}
エラー「Host is missing hostname and/or domain」 †
- facterでfqdnが取得できないのが原因
facter -p | grep fqdn
終了ステータスの詳細を得る †
0, 2の場合は成功と見なして良い
- --detailed-exitcodes
- 0: 正常終了(manifestにエラーがあってもコレ)
- 2: 変更あり
- 4: 変更なしで失敗
- 6: 変更ありで失敗
puppet agent --server server.localdomain --no-daemonize --verbose --onetime --detailed-exitcodes
echo $?
カスタムfacter †
facter変数や任意のリソースタイプを追加できる
Rubyスクリプトで拡張する †
- ローカルで試す場合: 例 /etc/resolv.conf から nameserver を取得する
- puppet moduleに入れる場合
- <MODULE>/lib/facter/resolver.rb に配置する
環境変数 FACTER_varname として定義する場合 †
export FACTER_my_key1=value1
export FACTER_my_key2=value2
export FACTER_my_key3=value3
facter | grep my
my_key1 => value1
my_key2 => value2
my_key3 => value3
/etc/facter/facts.d/ 以下に固定ファイルを置いて定義する場合 †
- /etc/facter/facts.d/ 以下にファイルを置く事でfacterから参照できる
- *.yaml, *.json, *.txt 形式が使える
sudo mkdir -p /etc/facter/facts.d/
sudo vim /etc/facter/facts.d/my.txt
----
my_key1=value1
my_key2=value2
my_key3=value3
----
facter | grep my
my_key1 => value1
my_key2 => value2
my_key3 => value3
/etc/puppet/modules/MY_MODULE/lib/facter/ 以下にプログラムを配置する場合 †
AmazonWebService †
- custom facter ウノウラボ by Zynga Japan: puppetのCustom factを使って、puppetをもっと柔軟に使う
- AWS以外の環境で「warning: Could not load fact file /var/lib/puppet/lib/facter/ec2.rb: No route to host - connect(2)」の抑制
--- ec2.rb
+++ ec2.rb
@@ -30,4 +30,7 @@
Timeout::timeout(1) { metadata }
rescue Timeout::Error
puts "ec2-metadata not loaded"
+rescue => ex
+ # No route to host - connect(2)
+ puts "#{ex.class}\t#{ex.message}"
end
- aws関係のモジュールを探す
puppet-module search aws
Puppet Dashboard †
正規表現 †
- Puppetはruby製。RubyではPerlとほぼ互換性のある正規表現が使える
- puppet 0.25以降、正規表現が使える。
軽量化/スケーラビリティ †
- Passenger - Documentation - Puppet Labs Apache + Passenger + Puppetmaster
- PuppetをPassengerで動かして大規模サイトに対応させる - rh7's blog
- CentOS6.3 x86_64
- ruby-1.8.7
- rubygems-1.3.7
- 元(WEBrick)のpuppetmasterは停止
service puppetmaster stop
chkconfig puppetmaster off
- 必須ソフトのインストール
sudo yum install httpd httpd-devel ruby-devel rubygems mod_ssl gcc-c++ curl-devel zlib-devel
sudo gem install rack passenger
- Passenger-Apacheモジュールのビルドとインストール
sudo passenger-install-apache2-module
- Rackの設定
mkdir -p /usr/share/puppet/rack/puppetmasterd/{public,tmp}
cp /usr/share/puppet/ext/rack/files/config.ru /usr/share/puppet/rack/puppetmasterd/
chown puppet. /usr/share/puppet/rack/puppetmasterd/config.ru
- Apacheの設定
cat >> /etc/httpd/conf.d/passenger.conf << 'EOS'
# passenger.conf
LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-3.0.17/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-3.0.17
PassengerRuby /usr/bin/ruby
EOS
cat >> /etc/httpd/conf.d/puppetmaster.conf << 'EOS'
# puppetmaster.conf
# Performance
#PassengerPoolIdleTime 300 # default: 300
PassengerUseGlobalQueue on
PassengerMaxPoolSize 60
Listen 8140
<VirtualHost *:8140>
SSLEngine on
SSLCipherSuite SSLv2:-LOW:-EXPORT:RC4+RSA
SSLCertificateFile /var/lib/puppet/ssl/certs/puppet-001.example.com.pem
SSLCertificateKeyFile /var/lib/puppet/ssl/private_keys/puppet-001.example.com.pem
SSLCertificateChainFile /var/lib/puppet/ssl/certs/ca.pem
SSLCACertificateFile /var/lib/puppet/ssl/certs/ca.pem
# CRL checking should be enabled; if you have problems with Apache complaining about the CRL, disable the next line
SSLCARevocationFile /var/lib/puppet/ssl/ca/ca_crl.pem
SSLVerifyClient optional
SSLVerifyDepth 1
SSLOptions +StdEnvVars
# The following client headers allow the same configuration to work with Pound.
RequestHeader set X-SSL-Subject %{SSL_CLIENT_S_DN}e
RequestHeader set X-Client-DN %{SSL_CLIENT_S_DN}e
RequestHeader set X-Client-Verify %{SSL_CLIENT_VERIFY}e
PassengerHighPerformance on # DO NOT USE Global config!!(disable mod_rewrite)
RackAutoDetect On
RackBaseURI /
DocumentRoot /usr/share/puppet/rack/puppetmasterd/public/
CustomLog /var/log/httpd//puppet_access_log combined
ErrorLog /var/log/httpd//puppet_error_log
<Directory /usr/share/puppet/rack/puppetmasterd/>
Options None
AllowOverride None
Order Allow,Deny
Allow from all
</Directory>
</VirtualHost>
EOS
service httpd restart
- 動作確認
sudo passenger-status
sudo passenger-memory-stats
- /etc/rc.d/init.d/puppetmaster は /etc/sysconfig/puppetmaster のオプションを呼んでいる。同じようにオプションを変更したい場合、ARGVに追加するだけ
vi /usr/share/puppet/rack/puppetmasterd/config.ru
----
ARGV << "--masterport=8140"
----
puppetlabsで公開されているモジュールのインストール †
モジュール †
マニフェスト,テンプレート,ファイルのセット
puppet-iptables †
iptablesを設定してくれる
タグ †
特定リソースだけ実行したいなどに使える。
- 単純リソースの場合。
file { '/etc/hosts':
owner => 'root',
group => 'root',
mode => 644,
tag => 'hosts',
}
file { '/etc/sudoers':
owner => 'root',
group => 'root',
mode => 440,
tag => 'sudoers',
}
- 実行
sudo puppetd --tags hosts,sudoers
- classや定義済みタイプ内のリソースは,自動でタグが付く。
class ssh {
# package { 'sshd': ensure => present, tag => 'ssh' } と同じ
package { 'sshd': ensure => present }
# service { 'sshd': ensure => running, tag => 'ssh' } と同じ
service { 'sshd': ensure => running }
}
puppetrun †
デフォルトでは30分でagentがpuppetmasterに取りに行くが、任意のタイミングで実行させたい時にpuppetrunが使える
ファイルサーバ †
masterからagentへファイルを配布できる
Could not run: Invalid mount files †
プロバイダ †
OSのコマンドの違いを吸収してくれる中間レイヤー
masterからagentへ向けての操作 †
masterからagentへ操作(puppet kick)したい時
関数(Function) †
条件文 †
変数と配列 †
- undef
- 未定義。if(undef)はfalse
- 変数をブール値として扱うには $is_virtual == 'true', str2bool("$is_virtual") とする。if 'false' {} では常にtrueとして判定される。
- 配列をCSVに変換。(他には、puppetlabs/stdlibにjoin()がある)
# manifest側
$vars=[ '1', '2', '3' ]
# template側
csv='<% @vars.each_with_index do |var, i| -%><%= var %><%= "," if i < (vars.size - 1) %><% end -%>'
- 変数の定義と参照はできるが、同一スコープ内での再定義はできない
$default_owner = 'root'
$default_group = 'root'
#$default_owner = 'hoge'; # エラー
#$default_owner => 'hoge'; # エラー
file { '/etc/hosts':
#$default_owner = 'hoge'; # エラー
#$default_owner => 'hoge'; # エラー
owner => $default_owner,
group => $default_group,
}
- 配列。単純な文字列配列やFile, User等も配列として扱える
$vars=[ '1', '2', '3' ]
service { 'ntpd':
ensure => running,
require => [ File['ntpd.conf'], User['ntp'], Package['ntp'] ],
}
- my-ntp/manifests/init.pp
$ntp_server=[ 'ntp.nict.jp', 'ntp.jst.mfeed.ad.jp', 'ntp.ring.gr.jp' ]
- my-ntp/templates/ntp.conf.erb
<% ntp_server.each do |val| -%>
server <%= val %>
<% end -%>
- 連想配列
- manifest
$sites = {
'site01' => {
'title' => 'sample01',
'url' => 'http://www01.example.com/'.
},
'site02' => {
'title' => 'sample02',
'url' => 'http://www02.example.com/'.
}
}
- template (連想配列なのでソートしないと順序は保証されない)
<% sites.keys.sort.each do |id| -%>
<%= id %>, <%= sites[id]['title'] %>, <%= sites[id]['url'] %>
<% end -%>
Facter変数 †
- uniqueid: ソースを追った所、hostidコマンドを実行していた。hostidはIPアドレスを16進数に変換した値
リソース †
/etc/hosts †
仮想リソース †
- /tmp/test.tmp を共通ファイルと仮定。複数回実行してもエラーが出ないようにする場合
node /^server\d+.localdomain/ {
@file{
'/tmp/test.tmp':
ensure => file,
content => "test file",
;
}
define test::realize_test {
realize(File["/tmp/test.tmp"])
}
test::realize_test {
"test1":;
}
test::realize_test {
"test2":;
}
}
- /tmp/test.tmp を共通ファイルと仮定。パラメータを渡しつつ、複数回実行してもエラーが出ないようにする場合
node /^server\d+.localdomain/ {
define test::mkfile(
$body=""
){
file {
"$title":
ensure => file,
content => $body,
;
}
}
@test::mkfile{
'/tmp/test.tmp':
body => "test file",
;
}
define test::realize_test {
realize(Test::Mkfile["/tmp/test.tmp"])
}
test::realize_test {
"test1":;
}
test::realize_test {
"test2":;
}
}
依存関係 †
マニフェストでリソースの依存関係を定義できる
- before:Bリソースより前にAリソース適用など
- require:beforeと逆。Aリソースの後にBリソース適用など
- notify:リソースに変更があった場合に通知して、別リソースを適用
- subscribe:notifyとは逆。
- php-mysqlを先に削除してから、php-mysqlndをインストール
package {
'php-mysql':
ensure => 'absent',
provider => 'rpm',
before => Package['php-mysqlnd'],
uninstall_options => ['--nodeps'];
'php-mysqlnd':
ensure => 'installed';
}
リソースタイプ †
- execタイプ
- コマンドを実行するタイプだが、puppetは状態を適用する考えのため、どうしてもという場合のみ使う。複数回の実行でエラーにならないように、冪等性を考慮する。
- creates: ファイルやディレクトリが存在する場合、実行しない。
- onlyif: 指定コマンドの終了コードが0の場合、実行する。
- unless:指定コマンドの終了コードが0以外の場合、実行する。
リソースコマンド †
define †
- define
- classとの違いは、1ホストで複数インスタンスを複数定義できる
- example:backup { "hoge": } の"hoge"は $titleとしてmodule側で参照できる
- $titleに配列も渡せる。 example:backup { ["var1", "var2", "var3"]: }
- /etc/puppet/modules/example/manifests/init.pp
class example
(
)
{
# backup
define backup ( $user, $group, $path, $cron_hour=1, $cron_minute=5, $cron_ensure="absent" ) {
# virtual resource
@file {
"${path}":
ensure => directory,
;
}
realize(File["${path}"])
file {
"${path}/backup.sh":
owner => $user,
group => $group,
mode => 755,
source => "puppet:///modules/example/backup.sh";
}
cron {
"cron-backup.sh":
require => File["${path}/backup.sh"],
ensure => $cron_ensure,
command => "/bin/nice ${path}/backup.sh > ${path}/backup.log 2>&1",
user => $user,
hour => $cron_hour,
minute => $cron_minute,
;
}
}
}
- /etc/puppet/manifests/web01.example.com.pp
node 'web01.example.com' {
include 'example'
example:backup {
'default':
user => 'root',
group => 'root',
path => "/root/bin",
cron_hour => 1,
cron_minute => 5,
cron_ensure => "present", # present, absent
;
}
}
class †
複数のリソースを一つにまとめ、名前を付けられる。
defineとの違いは、インスタンスの数。一つの場合はclass、複数の場合はdefine
- unix.pp
class unix {
file { '/etc/passwd':
owner => 'root',
group => 'root',
mode => 644;
}
file { '/etc/shadow':
owner => 'root',
group => 'root',
mode => 440;
}
exec { 'blah':
path => '/usr/bin',
cwd => '/tmp',
}
}
node †
どのクライアントに適用させるかを記述する
- ノード名に英数字とハイフン'-'以外が含まれる場合にはクオート('〜')する必要がある
- 0.22.4では継承元(inherits 'base')をクオート('〜')するとSyntax errorが出るバグがある
ヘルパーモード †
- メリット
- ソースコードの構文ハイライト
- vim, emacs用が用意されている
エラー「Host is missing hostname and/or domain」 †
- facterでfqdnが取得できないのが原因
facter -p | grep fqdn
自動署名 †
特定ドメインだけ自動承認させる事で、サーバ側で「puppetca sign」する手間が省ける
- puppet master側
- 特定のドメインだけ自動署名。先頭に「#」でコメントも有効
cat >> /etc/puppet/autosign.conf << 'EOS'
client.example.org
*.example.com
*.local
*.localdomain
#*.internal
EOS
service puppetmaster restart
# 確認
service puppetmaster genconfig | grep autosign
autosign = /etc/puppet/autosign.conf
# 後は autosign.conf への変更は puppetmaster の再起動は不要
- すべて自動署名
vi /etc/puppet/puppet.conf
----
[main]
autosign = true
----
service puppetmaster restart
エラー:クライアントが登録できない †
マニフェスト(DSL) †
基本 †
- サーバ上で以下パスにファイルを追加する。例:site.pp
/etc/puppet/manifests/site.pp
- 例:ファイルのパーミッションを変更
file { '/etc/hosts':
owner => 'root',
group => 'root',
mode => 644,
}
- マニフェスト構文チェック
# 2.7.x
puppet parser validate manifests/site.pp
# 2.6.x
puppet --parseonly manifests/site.pp
- dry-run & diff(実際には適用しない)
# 2.7.x
puppet agent --noop --test
# 2.6.x
puppet agent --noop
- マニフェスト更新
puppet apply manifests/site.pp
- デフォルトでは30分後にクライアントに適用されている
デフォルト †
- リソースタイプの先頭を大文字にし,リソース名は指定しない
File {
owner => 'root',
group => 'root',
mode => 644,
}
file {
'/etc/hosts': ;
'/etc/passwd': ;
'/etc/group' : ;
'/etc/sudoers':
mode => 440;
}
yumrepo †
/etc/yum.repos.d/REPONAME.repo を作成するリソース
- 例:rpmforgeをインストールするモジュール, CentOS6.x
package †
- sourceにはローカルファイル、URLが指定できるが、"/bin/rpm -i --oldpackage [URL]"で失敗する場合#8212; Puppet Labs
package {
がある。手動でwgetならうまくいくケースがある
#geshi(bash){{
package { 'zabbix-jp-release':0
ensure => installed,
provider => rpm,
source => 'http://www.zabbix.jp/binaries/relatedpkgs/rhel6/x86_64/zabbix-jp-release-6-5.noarch.rpm'
}
- sourceにURLでエラーになるケースはexecでインストール
exec {
'wget-zabbix-jp-release':
cwd => "/tmp/",
path => ["/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"],
user => "root",
timeout => 600,
command => "wget -q 'http://www.zabbix.jp/binaries/relatedpkgs/rhel6/x86_64/zabbix-jp-release-6-5.noarch.rpm' && rpm -i --oldpackage zabbix-jp-release-6-5.noarch.rpm && rm -f zabbix-jp-release-6-5.noarch.rpm",
creates => "/usr/share/zabbix-jp-release";
}
package { 'zabbix-jp-release':
ensure => installed,
require => Exec['wget-zabbix-jp-release'];
}
- install_options でyumのオプション等を指定できるようだ
package {"epel-release":
provider=>rpm,
ensure=>installed,
install_options => ['--nodeps'],
source=>"http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm",
}
- パッケージ間に依存関係があり同時にインストールする必要がある場合。例:openssl
package { "openssl":
provider => "rpm",
ensure => ["1.0.1e-30.el6.8", "1.0.1e-30.el6.8"],
source => ["rpms/openssl-devel-1.0.1e-30.el6.8.x86_64.rpm","rpms/openssl-1.0.1e-30.el6.8.x86_64.rpm"],
}
exec †
- 削除ファイル復元ツール extundelete をインストールする例
@package {
"gcc":
ensure => installed;
"gcc-c++":
ensure => installed;
"make":
ensure => installed;
"e2fsprogs-devel":
ensure => installed;
}
realize(Package["make"], Package["gcc"], Package["gcc-c++"], Package["e2fsprogs-devel"])
exec {
'install-extundelete':
cwd => "/tmp/",
path => ["/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"],
user => "root",
timeout => 600,
command => "wget -O extundelete-0.2.0.tar.bz2 'http://downloads.sourceforge.net/project/extundelete/extundelete/0.2.0/extundelete-0.2.0.tar.bz2?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fextundelete%2F&ts=1347001409&use_mirror=jaist' && tar xvfj extundelete-0.2.0.tar.bz2 && cd extundelete-0.2.0 && ./configure && make && make install && cd .. && rm -rf extundelete-0.2.0.tar.bz2 extundelete-0.2.0",
creates => "/usr/local/bin/extundelete",
require => [Package["make"], Package["gcc"], Package["gcc-c++"], Package["e2fsprogs-devel"]];
}
file †
- staticファイルを配信
- module_name/files/example.conf
- module_name/manifests/init.pp
file { '/tmp/example.conf':
path => "/tmp/example.conf",
ensure => file,
mode => 644,
source => "puppet:///modules/module_name/example.conf";
}
- sourceに特定の拡張子のファイルを指定すると"Permission denied"で配信されない。しかし、pathで元のファイル名に戻す事はできる。また、数百MBの大きなファイルも無理なのでwget等を使う
# puppet-server-2.6.17-2.el6.noarch
OK: なし
OK: .tar
OK: .conf
OK: .gz
OK: .hoge.gz
OK: .tar.bz2
NG: .tar.gz
- 内容が変わるdynamicファイルを配信
- module_name/templates/example.conf.erb
# facter変数
hostname=<%= hostname %>
- module_name/manifests/init.pp
file { '/tmp/example.conf':
path => "/tmp/example.conf",
ensure => file,
mode => 644,
content => template("module_name/example.conf.erb");
}
- templateに配列を使う
- my-ntp/templates/ntp.conf.erb
<% ntp_server.each do |val| -%>
server <%= val %>
<% end -%>
- my-ntp/manifests/init.pp
class my-ntp
(
$package_version='latest',
$ntp_server=[ 'ntp.nict.jp', 'ntp.jst.mfeed.ad.jp', 'ntp.ring.gr.jp' ]
)
{
package { "ntp": ensure => $package_version }
service { "ntpd":
enable => true,
ensure => running,
require => Package["ntp"];
}
exec { "/sbin/chkconfig --add ntpd":
cwd => "/etc",
unless => "/bin/ls /etc/rc3.d | grep ntp"
}
exec { "/bin/mv localtime localtime.org;/bin/ln -s /usr/share/zoneinfo/Japan /etc/localtime":
cwd => "/etc",
onlyif => "/usr/bin/test ! -h /etc/localtime.org"
}
file { "/etc/ntp.conf":
path => "/etc/ntp.conf",
ensure => file,
require => Package[ntp],
content => template('my-ntp/ntp.conf.erb'),
notify => Service["ntpd"];
}
}
user †
- ユーザ追加
user { 'testuser':
name => 'testuser',
password => 'test123',
managehome => true,
groups => 'wheel',
}
コマンド †
puppetサーバコマンド †
- puppetクライアント認証(autosignやってない時)
puppetca sign hostname
- 認証済みクライアントの拒否
puppetca revoke hostname
- 証明書の表示
puppetca print hostname
puppetクライアントコマンド †
- クライアント設定の表示
service puppet genconfig
- 各サービス状態をマニフェスト形式で出力
puppet resource service
service { 'httpd':
ensure => 'stopped',
enable => 'false',
}
service { 'iptables':
ensure => 'running',
enable => 'true',
}
service { 'ntpd':
ensure => 'running',
enable => 'true',
}
- 各パッケージ状態をマニフェスト形式で出力
puppet resource package
package { 'httpd':
ensure => '2.2.3-65.el5.centos',
}
package { 'iptables':
ensure => '1.3.5-9.1.el5',
}
package { 'iptables-ipv6':
ensure => '1.3.5-9.1.el5',
}
puppetインストール †
puppet-serverインストール †
|
|