インフラの世界へようこそ。私はこれまで数多のサーバー群と対峙してきましたが、規模が大きくなればなるほど「手作業」は最大の敵になります。
「1台なら設定できるが、100台になると絶望する」。これを解決するのがPuppetです。今日は、クラウド環境(AWS/GCP)でPuppetを使い、サーバーを「コードで定義して、自動で育てる」究極のプロトタイピング手法を伝授します。
—
1. なぜ、いまさらPuppetなのか?
Terraformが「インフラの土台(箱)」を作るのが得意なら、Puppetは「箱の中身(OS設定やミドルウェア)」を厳密に管理するスペシャリストです。
Puppetの真髄は「宣言的アプローチ」にあります。「こうなっていてほしい」という状態をコード(Puppet DSL)で書けば、Puppetが勝手に今の状態を調べ、足りないものを補い、余計なものを消してくれます。これが冪等性(べきとうせい)です。何度実行しても結果が同じになる安心感。これこそがSREの礎です。
—
2. Cloud-Initによる「魔法のブートストラップ」
クラウド環境では、インスタンスが起動した瞬間に自動でPuppetをインストールし、マスターサーバーへ参加させるのが鉄則です。これを実現するのがUserData(Cloud-Init)です。
以下のスクリプトを、インスタンス起動時のUserDataに埋め込みます。
!/bin/bash
Puppet Agentのインストールと自動登録スクリプト
1. リポジトリの追加(例: Ubuntuの場合)
wget https://apt.puppet.com/puppet7-release-focal.deb
dpkg -i puppet7-release-focal.deb
apt-get update
2. Agentのインストール
apt-get install -y puppet-agent
3. マスターサーバーの指定と自動署名設定
echo “[main]
server = puppet.your-domain.com
runinterval = 30m” >> /etc/puppetlabs/puppet/puppet.conf
4. サービス起動と有効化
/opt/puppetlabs/bin/puppet resource service puppet ensure=running enable=true
これで、インスタンスは起動した瞬間にPuppetの一員として迎え入れられます。
—
3. Auto Scaling環境でのライフサイクル管理
Auto Scalingでサーバーが増減するたびに、手動で証明書を承認していられませんよね? ここで「autosign」の出番です。
Puppetマスター側で、特定のパターンに一致するノードの証明書を自動承認するように設定します。
/etc/puppetlabs/puppet/autosign.conf
.ec2.internal
.c.project-id.internal
こうすることで、スケールアウトしてきたノードは、自動的に設定をプルし、数分後には完璧な設定で稼働を開始します。スケールインで削除される際は、Puppetマスター側のノード情報を削除するAPI(`puppet node purge`)を、ライフサイクルフックと組み合わせるのがプロの技です。
—
4. HelloWorld: 初めての「設定コード」を書いてみよう
Puppetの良さを実感するために、まずは「Nginxをインストールして、特定のHTMLを置く」というHelloWorldを行いましょう。
`site.pp`(マスター側のメインマニフェスト)にこう書きます。
ノードごとの定義
node default {
# Nginxパッケージのインストールを保証
package { ‘nginx’:
ensure => installed,
}
# 設定ファイルの定義
file { ‘/var/www/html/index.html’:
ensure => file,
content => “
Hello, Puppet World!
“,
mode => ‘0644’,
}
# サービスの稼働を保証
service { ‘nginx’:
ensure => running,
enable => true,
require => Package[‘nginx’], # パッケージが入ってからサービス起動
}
}
このコードを保存して、Agent側で `puppet agent -t` を実行してみてください。瞬時にNginxが立ち上がり、Webページが更新されます。何度叩いてもNginxが壊れることはありません。
—
5. SRE現場で生き残るためのベストプラクティス
最後に、現場で震えるほど重要になる「心得」を3つだけ伝授します。
1. Hieraを活用せよ: 設定値(IPアドレスや環境変数)をコード内にハードコーディングしてはいけません。`Hiera`というキーバリューストアを使い、環境(開発・本番)ごとに設定を分離してください。
2. モジュール化の徹底: すべてを1つのファイルに書くのは素人です。`puppet module generate` を使い、Apache、Nginx、MySQLなど、機能単位で部品(モジュール)を作りましょう。
3. テスト駆動開発: `puppet-lint` や `rspec-puppet` をCIパイプラインに組み込んでください。コードの構文エラーで本番サーバーが全滅するようなミスは、テストで100%防げます。
—
最後に:自動化は「愛」です
Puppetを導入するということは、サーバーを手作業の苦役から解放してあげるということです。最初は難しく感じるかもしれませんが、一度この「宣言的な世界」を知ってしまえば、もう二度と手動で `apt-get` を叩く日々には戻れません。
さあ、あなたのインフラを「コード」という名の設計図で支配しましょう。何か詰まったら、いつでも聞きに来てください。応援していますよ。