cloud-init + PuppetでEC2をデプロイする
はじめに
これまでの記事で、Amazon Linuxのcloud-initで実行されるモジュールをご紹介してきましたが、その中に含まれるものとしてPuppetモジュールがあります。
# The modules that run in the 'config' stage cloud_config_modules: - locale - ssh - set-passwords - mounts - yum-configure - yum-add-repo - package-update-upgrade-install - timezone - puppet - disable-ec2-metadata - runcmd
はい、それではcloud-initからPuppetを叩いてEC2をデプロイしてみます!
やってみる
Puppet Master Serverの構築
EC2にManifestを配布するためのPuppet Master Serverを構築します。yumでさくっとインストールします。
$ sudo yum install puppet-server $ sudo service puppetmaster start Starting puppetmaster: [ OK ]
Puppetのクライアント/サーバ間の通信は8140/tcpで行われるのでSecurity Groupでポートを開放しておきます。
またPuppetのクライアント/サーバ間通信はhttpsで行われ、最初にクライアントがサーバに通信するタイミングで証明書に対する署名のやり取りが行われるのですが、今回はcloud-initを使って面倒臭い事無しにサクっとEC2をデプロイしたいので、署名リクエストには自動で署名するようにサーバ側を設定します。
$ sudo vi /etc/puppet/autosign.conf *
次にManifestsを用意します。こんな感じで作りました。上手くいけばユーザmainteとグループmainteが作られるはずです。
$ tree /etc/puppet/manifests/ /etc/puppet/manifests/ ├── nodes │ └── common.pp └── site.pp
$ cat /etc/puppet/manifests/site.pp import 'nodes/*.pp' if $ipaddress == "172.31.*.*" { include common }
$ cat /etc/puppet/manifests/nodes/common.pp group { "mainte": ensure => present, gid => 1000 } user { "mainte": ensure => present, uid => 1000, gid => 1000, home => "/home/mainte", managehome => true, shell => "/bin/bash", password => '$6$wfuAkNeDEZN2fFfH$YhY4aKjhTGo9vsL3duOARS9wKTo8dbM6z/wsG4qQQa8cy3jVmQQ1Rl9P3DWodCoIA.bcnPKzrkdKKzGnriphj.' }
これでPuppet Master Serverの準備はOKです。
cloud-initを使ったEC2のデプロイ
EC2をLaunchするときに、User-Dataに以下のように記述します。serverにはPuppet Master ServerのPrivate DNS Nameを入れておきます。
#cloud-config repo_update: true repo_upgrade: all puppet: conf: agent: server: "ip-172-31-10-10.ap-northeast-1.compute.internal" certname: "%i.%f"
で、Launchすると...ユーザmainteとグループmainteが作られています!
$ cat /etc/passwd mainte:x:1000:1000::/home/mainte:/bin/bash $ cat /etc/group mainte:x:1000:
はい!出来ました!
まとめ
今回はサンプルとして簡単な設定しかしていませんが、Puppetとcloud-initを組み合わせることで大規模なEC2デプロイにも対応できると思います。