OSのRubyと違うバージョンでPuppetを動かす方法

Puppet Advent Calendar 2015の9日目です。後日投稿するベンチマークの準備でつまった内容を、Tipsぽくまとめました。ベンチマークの投稿は、読みづらいくなりそうなので。。。もっと簡単にバージョン変更できる方法があれば、教えていただけるとうれしいです。

# これは何 
CentOS6とかだと、普通に入るRubyが1.8.7だったりしますが、もっと新しいRubyでPuppetを動かしたいとかあったりします。なので、他ツールに影響与えずに、Puppetが使うRubyだけ変える方法の紹介です。

# 方法① puppet-agent
新しいpuppet-agentを入れる。以前からのpuppetパッケージとは別物ぽいです。リポジトリ設定に使うrpmも違うので、旧puppetインストールと微妙にコマンドが違います。
puppet-agentをインストールすると、専用のRubyがセットで入ります。

OSの確認

```
# cat /etc/centos-release 
CentOS release 6.7 (Final)
```

puppet-agentのインストール(CentOS6)。

```
# rpm -ivh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-6.noarch.rpm
# yum clean all
# yum install -y puppet-agent
```

※CentOS7の場合

```
# rpm -ivh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm
# yum clean all
# yum install -y puppet-agent
```

インストール後のPuppet側のバージョン確認。Ruby2.1.7

```
# /opt/puppetlabs/bin/puppet --version
4.3.1
# /opt/puppetlabs/bin/facter ruby     
{
  platform => "x86_64-linux",
  sitedir => "/opt/puppetlabs/puppet/lib/ruby/site_ruby/2.1.0",
  version => "2.1.7"
}
# /opt/puppetlabs/puppet/bin/ruby --version
ruby 2.1.7p400 (2015-08-18 revision 51632) [x86_64-linux]
```

OS側のバージョン確認。Ruby1.8.7

```
# ruby --version
ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
```

共存できました。

# 方法② rbenv + Gems
Puppetのバージョンを変えずに、Rubyのバージョンを変えたい場合はこっち。ただちょっと手順は多いうえに、結局再インストールです。なので、Puppetのバージョンにこだわらなければ、方法①推奨です。

## rbenvでRubyをインストール

このブログを参考にRubyを入れていきます。Rubyをビルドするので少し時間がかかります。

[CentOS/RHEL に Ruby 2.x をインストールする](http://dotnsf.blog.jp/archives/1020034700.html)

### ビルドに必要なパッケージを入れる
ビルドするRubyのバージョンで必要なパッケージが違うので、ビルドエラーになったらエラー文を頼りに必要なパッケージを入れてください。

```
yum install -y git tar gcc make openssl-devel libffi-devel readline-devel
```

### rbenvの準備

```
# cd /opt
# git clone git://github.com/sstephenson/rbenv.git
# mkdir /opt/rbenv/plugins
# cd /opt/rbenv/plugins
# git clone git://github.com/sstephenson/ruby-build.git
```

### 環境変数の設定
次回ログイン時にも有効にするために、/etc/profileなどに設定が必要ですが、今回は省略。

```
# export RBENV_ROOT="/opt/rbenv"
# export PATH="${RBENV_ROOT}/bin:${PATH}"
# eval "$(rbenv init -)"
```

### Rubyインストール
rbenv install -lで、2.1.7があったので、2.1.7をインストール。古いバージョンだと、コード修正しないとビルドが通らないとかあるようなので、結構トライ＆エラーです。

```
# rbenv install -l

Available versions:
  :
  2.1.7
  :

# rbenv install 2.1.7

Downloading ruby-2.1.7.tar.gz...
-> https://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.7.tar.gz
Installing ruby-2.1.7...
Installed ruby-2.1.7 to /opt/rbenv/versions/2.1.7
```

### Rubyのバージョン確認
2.1.7に設定時とシステムのに設定した場合での確認。Rubyの切り替えできました。今回は、デフォルトを切り替えているので、共存ではないです。

```
# rbenv global 2.1.7
# ruby --version
ruby 2.1.7p400 (2015-08-18 revision 51632) [x86_64-linux]
# rbenv global system
# ruby --version
ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
```

## PuppetをGemsでインストール

### PuppetをGemsでインストール

rbenvで2.1.7に切り替え後、PuppetをGemsでインストール。
3.8.4があったので、3.8.4をインストール。

```
# rbenv global 2.1.7
# rbenv global
2.1.7
# gem list ^puppet$ --remote --all

*** REMOTE GEMS ***

puppet (4.3.1 ruby x64-mingw32 x86-mingw32, 4.3.0 ruby x64-mingw32 x86-mingw32, 4.2.3 ruby x64-mingw32 x86-mingw32, 4.2.2 ruby x64-mingw32 x86-mingw32, 4.2.1 ruby x64-mingw32 x86-mingw32, 4.2.0 ruby x64-mingw32 x86-mingw32, 4.1.0 ruby x64-mingw32 x86-mingw32, 4.0.0 ruby x64-mingw32 x86-mingw32, 3.8.4 ruby x64-mingw32 x86-mingw32, 3.8.3 ruby x64-mingw32 x86-mingw32, 3.8.2 ruby x64-mingw32 x86-mingw32, 3.8.1 ruby x64-mingw32 x86-mingw32, 3.7.5 ruby x64-mingw32 x86-mingw32, 3.7.4 ruby x64-mingw32 x86-mingw32, 3.7.3 ruby x64-mingw32 x86-mingw32, 3.7.2 ruby x64-mingw32 x86-mingw32, 3.7.1 ruby x64-mingw32 x86-mingw32, 3.7.0 ruby x64-mingw32 x86-mingw32, 3.6.2 ruby x86-mingw32, 3.6.1 ruby x86-mingw32, 3.6.0 ruby x86-mingw32, 3.5.1 ruby x86-mingw32, 3.4.3, 3.4.2, 3.4.1, 3.4.0, 3.3.2, 3.3.1, 3.3.0, 3.2.4, 3.2.3, 3.2.2, 3.2.1, 3.1.1, 3.1.0, 3.0.2, 3.0.1, 3.0.0, 2.7.26, 2.7.25, 2.7.24, 2.7.23, 2.7.22, 2.7.21, 2.7.20, 2.7.19, 2.7.18, 2.7.17, 2.7.16, 2.7.14, 2.7.13, 2.7.12, 2.7.11, 2.7.9, 2.7.8, 2.7.6, 2.7.5, 2.7.4, 2.7.3, 2.7.1, 2.6.18, 2.6.17, 2.6.16, 2.6.15, 2.6.14, 2.6.13, 2.6.12, 2.6.11, 2.6.10, 2.6.9, 2.6.8, 2.6.7, 2.6.6, 2.6.5, 2.6.4, 2.6.3, 2.6.2, 2.6.1, 2.6.0, 0.25.5, 0.25.4, 0.25.3, 0.25.2, 0.25.1, 0.25.0, 0.24.9, 0.24.8, 0.24.7, 0.24.6, 0.24.5, 0.24.4, 0.24.3, 0.24.2, 0.24.1, 0.24.0, 0.23.2, 0.23.1, 0.23.0, 0.22.4, 0.18.4, 0.16.0, 0.13.6, 0.13.2, 0.13.1, 0.13.0, 0.9.2)

# gem install puppet -v 3.8.4
```

### インストール後の確認
puppetが入りました。

```
# puppet --version
3.8.4
```

ちなみに、システムのバージョンに戻した状態で、間違って実行するとpuppetを使えるRubyバージョンを教えてくれるようです。戻したバージョンにもpuppetがあれば、そっちが動くだけですが。。。

```
# rbenv global system
# rbenv global       
system
# puppet --version
rbenv: puppet: command not found

The `puppet' command exists in these Ruby versions:
  2.1.7
```

### サービス用の設定
Gemsでインストールした場合、サービスとして動かすための設定はされないので、puppetをサービスとして動かす場合は別途設定が必要です。

- puppetグループ、ユーザ作成（serverの場合）
- /etc/puppet/*
- /etc/init.d/puppet
- /etc/sysconfig/puppet
- /etc/logrotate.d/puppet 

参考：[
Installing Puppet: From Gems](https://docs.puppetlabs.com/guides/install_puppet/install_gem.html)

リンク先にサンプルファイルがありますが、同じバージョンをrpmでいれたサーバからコピーするとかの方がよいかもです。