Chef-soloなどによるプロビジョニングの自動化が大流行りですね。モテるエンジニアの必須条件にプロビジョニングの自動化が加わる日も近いかも知れません。
プロビジョニングと一緒にコマンドライン一発でセットアップ済みのVMを作る Vagrant もキテいる感じがします。
でも、プロビジョニングの設定が難しそう、Chef-soloを勉強する時間も無いし……と言う方や、実は秘伝のセットアップスクリプトがプロジェクトに伝わっていて……と言う方もいると思います。
そんな人々のためなのか、Vagrantには Shellによるプロビジョニング の設定項目があります。
例えば、オペレータユーザにSSHの秘密鍵/公開鍵のセットを作るための設定は以下のようになります。
まず、シェルスクリプトを作ります。
#!/bin/bash
su - $1 -c '
mkdir -p ~/.ssh
if [[ ! -f ~/.ssh/id_rsa ]]; then
ssh-keygen -t rsa -q -f ~/.ssh/id_rsa -P ""
echo created private key: ~/.ssh/id_rsa
fi
'
こんな感じで、ポイントとして、このシェルスクリプトは root 権限で 実行されるので、作業ユーザーのホームに秘密鍵を作る場合は su
などを使うことになります。
Vagrant.configure("2") do |config|
config.vm.provision :shell do |shell|
shell.path = "scripts/gen_rsa_key.sh"
shell.args = 'vagrant'
end
end
path
にスクリプトの場所(vagrant
コマンド実行地点からの相対位置)を指定、 args
には、スクリプトの $1, $2, ...
に入るようなコマンド引数を入れておくんだと思います。ここでは見ての通りユーザ名。
これで、
$ vagrant provision
とすれば
...
[default] Running provisioner: VagrantPlugins::Shell::Provisioner...
created private key: /home/vagrant/.ssh/id_rsa
...
$ vagrant ssh -c "ls ~/.ssh"
authorized_keys
id_rsa
id_rsa.pub
known_hosts
秘密鍵/公開鍵ができました。
このとき重要なのは、シェルスクリプトとは言えもちろん冪等性を保証することで、この場合は複数回実行することで同じ名前の秘密鍵を上書きしないとか、別の名前の鍵を作ってしまうとか、が起こらないようにスクリプトを書かないといけません。例のスクリプトでは単純に if [[ ! -f ~/.ssh/id_rsa ]]; then
でファイルの存在を確認しています。
ということで、個人的には Chef-solo を薦めたいところですが、暫定的にシェルスクリプトを使ってあとから置き換えていく、等の運用はできるかも知れませんね。ちなみに、shellの設定ブロックとchef_soloの設定ブロックが両方ともある場合は、両方とも実行してくれます。