StupidDog's blog

IT関連の手近な所で、疑問に思った事を調べた記録

「rbenvを、Ubuntu13.10 ServerへPuppetでインストールする」|ただいまPuppetも修行中です

はじめに

「gitを、Ubuntu13.10 Serverにpuppetでインストールする」|ただいまpuppetも修行中です - StupidDog's blog

gitのインストールが分かったので、今回はgithubからsstephenson/rbenv · GitHubをインストール(clone)します。
puppetlabsで公開されているmoduleの中にgitやsubversionなどに対応したものが有ったのですが
(puppetlabs/puppetlabs-vcsrepo · GitHub)、gitへのアクセスがsshでの接続となってしまい別の設定を必要とするので断念しました。
素の状態のPuppetでは、resource typeとしてgitは扱っていないため、任意のコマンドを実行するresource typeであるexecを使用してgitコマンドを実行します。

環境

puppetlabs提供のvagrant向けboxファイルから作成した仮想環境を使用します(gitインストール時の環境と同じ)。

  • Ubuntu13.10 Server
  • puppet v3.4.2

マニフェストの作成

下記の内容でマニフェストを作成する。ファイル名は任意、ここではrbenv.ppとします。

package { 'git':
  ensure => installed,
}

$username = 'vagrant'
exec { 'rbenv':
  user       => "${username}",
  cwd        => "/home/${username}",
  path       => ['/usr/bin'],
  command    => "git clone https://github.com/sstephenson/rbenv.git /home/${username}/.rbenv",
  creates    => "/home/${username}/.rbenv",
  require    => Package['git'],
}
execの属性について
  • コマンドは、userで指定したユーザ・groupで指定したグループの何れかの権限で実行されます。user・groupとも省略するとroot権限で実行されます。
  • コマンドは、cwdで指定したディレクトリをカレントディレクトリとして実行されます。
  • execでは、環境変数やコマンドのサーチパス(PATH)が空の状態でコマンドを実行します。そのためコマンドのパスを指定する必要があります。
  • commandは、実行したいコマンドそのままです。
  • createsは、指定したファイルかディレクトリが存在している場合は、コマンドを実行しないという条件です。
  • requireは、コマンドを実行するのに依存している条件で、例ではgitのパッケージがインストールされている事が条件となります。

マニフェストの適用

gitが未インストールの場合、apt-getコマンドによりインストールされます。
ubuntu以外なら別のコマンドになります。CentOSyumなど。
apt-getコマンドを実行する権限が必要なるので、sudo付きでpuppetコマンドを実行します。
2014.03.24 追記
ここで使用しているexec自体がroot権限を必要とします。

$ sudo puppet apply -v rbenv.pp
Notice: Compiled catalog for z003.local in environment production in 0.19 seconds
Info: Applying configuration version '1395423805'
Notice: /Stage[main]/Main/Exec[rbenv]/returns: executed successfully
Notice: Finished catalog run in 16.43 seconds

$ tree ~/.rbenv
/home/vagrant/.rbenv
├── bin
│   ├── rbenv -> ../libexec/rbenv
│   └── ruby-local-exec
├── completions
│   ├── rbenv.bash
│   ├── rbenv.fish
│   └── rbenv.zsh
├── libexec
│   ├── rbenv
│   ├── rbenv-commands
│   ├── rbenv-completions
│   ├── rbenv-exec
│   ├── rbenv-global
│   ├── rbenv-help
│   ├── rbenv-hooks
│   ├── rbenv-init
│   ├── rbenv-local
│   ├── rbenv-prefix
│   ├── rbenv-rehash
│   ├── rbenv-root
│   ├── rbenv-shims
│   ├── rbenv-sh-rehash
│   ├── rbenv-sh-shell
│   ├── rbenv-version
│   ├── rbenv---version
│   ├── rbenv-version-file
│   ├── rbenv-version-file-read
│   ├── rbenv-version-file-write
│   ├── rbenv-version-name
│   ├── rbenv-version-origin
│   ├── rbenv-versions
│   ├── rbenv-whence
│   └── rbenv-which
├── LICENSE
├── README.md
└── test
    ├── commands.bats
    ├── completions.bats
    ├── exec.bats
    ├── global.bats
    ├── help.bats
    ├── hooks.bats
    ├── init.bats
    ├── libexec
    │   └── rbenv-echo
    ├── local.bats
    ├── prefix.bats
    ├── rbenv.bats
    ├── rehash.bats
    ├── shell.bats
    ├── shims.bats
    ├── test_helper.bash
    ├── --version.bats
    ├── version.bats
    ├── version-file.bats
    ├── version-file-read.bats
    ├── version-file-write.bats
    ├── version-name.bats
    ├── version-origin.bats
    ├── versions.bats
    ├── whence.bats
    └── which.bats

これで、githubからrbenvをインストールすることが出来ました。
この後、rbenvへのサーチパス追加と環境変数の設定を.bashrcに追加しなければなりません。

追加するのは次の2行です。

export PATH="$HOME/bin:$PATH"
eval "$(rbenv init -)"

新規ファイルを配置するのは楽だけど、既存のファイルへ追記する場合のベストプラクティス的な方法は無いだろうか。

まとめ

既存のファイルへ追記する方法を探していたらPuppetでrbenvを扱うmoduleを見つけてしまいました。
サーチパスの設定どころか指定バージョンのRubyをインストールする所までマニフェストで書けてしまいます。
puppetのmoduleとして提供されているので導入も楽です。
次は、このalup/rbenv/1.2.0 · Puppet Forgeを調べることにします。

今回は、resource typeにexecを使用する場合にPATHと環境変数が空の状態で実行される事が分かったので良しとします。