IDCF テックブログ

IDCF テックブログ

クラウド・データセンターを提供するIDCフロンティアの公式テックブログ

CentOS7上にrbenvやSCLを使って指定のRubyバージョン環境を構築

こんにちは、藤城(@tafujish)です。前回のidcfcloud-cliリリースに続きまして、今回はidcfcloud-cliを動かすためのRuby環境の構築について紹介します。

idcfcloud-cliはRuby 2.2.7以降が必要となります。Ubuntu16.04ではRuby 2.3.1なので問題ないですが、CentOS7ではRuby 2.0.0なのでバージョンが古く未対応です。そこで今回は、CentOS7環境でRuby 2.3.1の環境を構築する手順を扱います。Rubyのソースを持ってきてビルドすれば終わりですが、管理の問題やそもそもビルド自体が大変ですよね。Rubyのバージョン管理は最近ではrbenvを利用するのが一般的です。Rubyでの開発目的であればrbenvで環境構築するのが一般的ですが、idcfcloud-cliを動かすだけならSoftware Collections(以下SCL)でインストールするのが楽でしょう。ここでは、rbenvとSCL両方の手順を紹介して、idcfcloud-cliをcronで回すような使い方ができるところまでやります。

rbenvにする?それともSCLにする?

RHEL/CentOS上で必要なバージョンのRuby環境を用意するには、rbenvかSCLを用いるのが現実的な方法だと思います。どちらか一方を用いてRubyをインストールすればよいので、ここではrbenvとSCLのどちらを選択するかの検討材料を紹介します。

rbenvは様々なrubyのバージョンを指定しビルド・インストールすることができます。インストールした後は、rbenvコマンドでバージョンを切り替えることができます。そのため、Ruby環境での開発や検証には適しています。

一方、SCLはRHEL/CentOSの標準パッケージ外のパッケージをyum(rpm)インストールし、sclコマンドで標準パッケージとの切り替え含め提供します。rbenvとの違いとして、yumでパッケージ管理されかつビルドされたパッケージを使うのでインストールがすぐに終わるメリットがあります。例えば、HighCPU.L8(4コア/8GBmem)のマシンで環境構築にかかる時間は、rbenvで5分かかったものがSCLでは1分で完了します。一方で、SCLでは2.2系もしくは2.3系というバージョンのくくりで提供されているので、2.3.1などのパッチバージョンレベルでの切り替えは提供されません。

idcfcloud-cliを利用してクラウドの操作を自動化するという目的だけであれば、SCLで十分ではないでしょうか。
下図に両パターンのインストールしたときの関係する階層の例です(青字が今回インストールするところ)。以降では、CentOS7.3のIDCFクラウド標準テンプレートで実行しておりroot権限で実行している例です。

f:id:ynagaoka:20170908101948p:plain

rbenvでrubyインストール

まずはrbenvの手順です。SCL希望ならこの章はスキップしてください。

rbenvでruby 2.3.1インストール

はじめにrbenv環境構築に必要なパッケージをインストールしておきます。

# yum install git gcc make bzip2 openssl-devel readline-devel -y

次にrbenvをインストールし、環境設定まで行います。

# git clone https://github.com/rbenv/rbenv.git ~/.rbenv
# cd ~/.rbenv && src/configure && make -C src
# echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
# echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
# source ~/.bash_profile

次にruby-buildをrbenvのプラグインとしてインストールします。

# mkdir ~/.rbenv/plugins
# git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

動作確認用のスクリプトを実行し、インストールが正常に行えたか確認します。

# curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash
Checking for `rbenv' in PATH: /root/.rbenv/bin/rbenv
Checking for rbenv shims in PATH: OK
Checking `rbenv install' support: which: no rbenv-install in (/root/.rbenv/shims:/root/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin)
/root/.rbenv/plugins/ruby-build/bin/rbenv-install (ruby-build 20170726-9-g86909bf)
Counting installed Ruby versions: none
  There aren't any Ruby versions installed under `/root/.rbenv/versions'.
  You can install Ruby versions like so: rbenv install 2.2.4
Checking RubyGems settings: OK
Auditing installed plugins: OK

rbenvでインストールできるRubyのバージョン一覧の取得は次のとおりです。

# rbenv install --list

たとえば、2.3.1をインストールし全ユーザー環境(global)で利用する場合は次のとおりです。

# rbenv install 2.3.1
# rbenv global 2.3.1

ruby -vでバージョンを確認すると2.3.1になっていれば成功です。

rbenvからidcfcloud-cliを利用

必要なRubyが入ったので、idcfcloud-cliをインストールします。OS側で必要なパッケージをyumインストールし、脆弱性があったgemを更新した後、idcfcloudをgemインストールします。

# yum install gcc gcc-c++ make -y
# gem update --system
# gem install idcfcloud

インストール後の初期設定からは同様にidcfcloud initからはじめます。

シェルスクリプトをcronでまわす

たとえば、IDCFクラウドの課金の推移を毎日見ようと前日分までの請求情報を日次で記録したい場合、idcfcloudを用いてシェルスクリプトを作成し、cronの日次処理に突っ込むことでしょう。

cronで動かすとなると、今シェル上で動かしている環境は使えないので、rbenvの設定が効きません。このようなときは、スクリプトの中でさきほど作成した~/.bash_profileをフルパスで指定し反映させます。このようなスクリプトになります。

【/etc/cron.daily/idcf-billing-detail】

#!/bin/sh
OUTPUT=/tmp/`date --date='1 day ago' +%Y-%m-%d`.csv
source /root/.bash_profile
idcfcloud your list_billing_detail ` date --date='1 day ago' +%Y-%m` -o csv \
  > $OUTPUT

SCLでrubyインストール

次にSCLの手順です。やることは上述のrbenvと同じです。

SCLでruby 2.3.xインストール

はじめにSCLのリポジトリを登録します。

# yum install centos-release-scl -y

次にRuby環境をインストールします。今回は2.3系をインストールします。

# yum install rh-ruby23 rh-ruby23-ruby-devel -y

インストールが完了したら、sclコマンドで2.3系環境に切り替えます。

# scl enable rh-ruby23 bash

ruby -vでバージョンを確認すると2.3.1(執筆時点)になっていれば成功です。

SCLからidcfcloud-cliを利用

ここは上述のrbenvのときと同様です。
必要なRubyが入ったので、idcfcloud-cliをインストールします。OS側で必要なパッケージをyumインストールし、脆弱性があったgemを更新した後、idcfcloudをgemインストールします。

# yum install gcc gcc-c++ make -y
# gem update --system
# gem install idcfcloud

インストール後の初期設定からは同様にidcfcloud initからはじめます。

シェルスクリプトをcronでまわす

rbenvのところと同じ例で、IDCFクラウドの課金の推移を毎日見ようと前日分までの請求情報を日次で記録したい場合、idcfcloudを用いてシェルスクリプトを作成し、cronの日次処理に突っ込むことでしょう。

cronで動かすとなると、今シェル上で動かしている環境は使えないので、SCLの設定が効きません。このようなときは、スクリプトの中でsource scl_source enable rh-ruby23というように環境を設定します。このようなスクリプトになります。

【/etc/cron.daily/idcf-billing-detail】

#!/bin/sh
OUTPUT=/tmp/`date --date='1 day ago' +%Y-%m-%d`.csv
source scl_source enable rh-ruby23
idcfcloud your list_billing_detail ` date --date='1 day ago' +%Y-%m` -o csv \
  > $OUTPUT

まとめ

ここでは、CentOS7環境でidcfcloud-cliをインストールするためのRuby環境の構築として、rbenvとSCLを用いた方法を紹介しました。Rubyとしてはrbenvが定番でしょうけど、単にidcfcloud-cliを実行するためだけであれば、SCLでも十分使えるのではないでしょうか。
CentOS7環境でもidcfcloud-cliをご活用ください。

idcfcloud-cliの初期設定などを行いたい方はこちらの記事もどうぞ!
idcfcloud-cliをリリース!

Copyright © IDC Frontier Inc.