41
40

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Vagrant の shell provisioning

Last updated at Posted at 2013-04-13

Chef-soloなどによるプロビジョニングの自動化が大流行りですね。モテるエンジニアの必須条件にプロビジョニングの自動化が加わる日も近いかも知れません。

プロビジョニングと一緒にコマンドライン一発でセットアップ済みのVMを作る Vagrant もキテいる感じがします。

でも、プロビジョニングの設定が難しそう、Chef-soloを勉強する時間も無いし……と言う方や、実は秘伝のセットアップスクリプトがプロジェクトに伝わっていて……と言う方もいると思います。

そんな人々のためなのか、Vagrantには Shellによるプロビジョニング の設定項目があります。

例えば、オペレータユーザにSSHの秘密鍵/公開鍵のセットを作るための設定は以下のようになります。

まず、シェルスクリプトを作ります。

scripts/gen_rss_key.sh
#!/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 などを使うことになります。

Vagrantfile
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の設定ブロックが両方ともある場合は、両方とも実行してくれます。

41
40
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
40

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?