こんにちは、藤城(@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権限で実行している例です。
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をリリース!