cloud-init + PuppetでEC2をデプロイする

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

これまでの記事で、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デプロイにも対応できると思います。