オフライン環境にyumリポジトリ、rubyをインストールする

## 背景と概要

筆者は某SI企業にお勤めしておりますが、
SIerが扱う案件は、**割とオフライン環境を前提とした開発**が経験上多い気がします。

このオフライン環境を前提とした環境構築すると、以下のようなことが起きやすいです。
(セキュリティの考慮など、いろいろな背景があってのオフラインなのですが..)

* 業務上必要なツールをシェルで作りがちになる。yumの便利なパッケージやらRubyやらPythonやらの便利なライブラリを利用すれば、再発明が必要ないのにそもそものライブラリが入っていなかったり。枷になることが多い。。

このオフライン環境に悩まされる人は多い気がするのですが、環境構築のスキルを持っていないアプリ担当者は解決できなかったりして、生産性を下げたり、不要な作業を生んでしまう要因になっているのでは、、と思う次第です。

本記事では、オフライン環境下にyumリポジトリ構築、Rubyを使えるようにするまでの手順メモを記しています。
なお、オフライン環境を構築するにあたっての前提条件として、資材のダウンロードはインターネットにつながる環境で実施する必要があります。

**[環境]**

* オフライン環境（以下、オフラインマシン）
  * CentOS7
  * Nginx, Vim, dstat, sysstatをインストール
  * Rubyをインストール
* インターネットにつながる環境（以下、オンラインマシン）
  * CentOS7 (Vagrantで構築)
  * 何もインストールされていないような状態から以降の手順を実施してください。

## 手順1. オンラインマシン側でyum資材をダウンロード

インターネットにつながるオンラインマシンで資材をダウンロードします。
yumリポジトリ資材をまとめることが目的です。まとめた資材をあとでオフラインマシンに持っていきます。

```
# yumリポジトリ構築用ディレクトリ。ここにyumリポジトリ構築用のライブラリをダウンロードします。
mkdir yum_repo

# vim, dstat,sysstatのライブラリをダウンロード。
sudo yum install -y vim dstat sysstat --downloadonly --downloaddir=yum_repo

# Nginxのライブラリダウンロード
cat <<EOF | sudo tee /etc/yum.repos.d/nginx.repo > /dev/null
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/x86_64
gpgcheck=0
enabled=1
EOF

sudo yum install -y nginx --downloadonly --downloaddir=yum_repo
```

ポイントは`--downloadonly --downloaddir=yum_repo`の部分です。ライブラリをダウンロードしています。(インストールはせずに.)

必要な資材がダウンロードできたら、yumリポジトリを構築します。

```
# yumリポジトリ構築
sudo yum -y install createrepo
sudo createrepo --simple-md-filenames yum_repo
```

固めます。

```
tar cvfz yum_repo.tar.gz yum_repo
```

ここで作成した`yum_repo.tar.gz`は**手順3.で使います**。


## 手順2. オンラインマシン側でRuby資材をダウンロード

この手順もインターネットにつながるオンラインマシンでRuby資材をダウンロードします。
Rubyの資材をまとめることが目的です。まとめた資材をあとでオフラインマシンに持っていきます。

```
# インストールに必要なライブラリをインストール
sudo yum install -y git
sudo yum install -y bzip2 gcc openssl-devel readline-devel zlib-devel
```

```
# 注意事項) ここでユーザを作っていますが、
# このユーザはオフラインマシンでRubyを利用するユーザと合わせてください。
# 以下の例では、`sample`ユーザとしています。
sudo useradd sample
sudo su - sample

git clone https://github.com/rbenv/rbenv.git rbenv
mkdir rbenv/plugins
git clone https://github.com/rbenv/ruby-build.git rbenv/plugins/ruby-build
chmod -R 777 $HOME/rbenv

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

rbenv install 2.5.0
rbenv global 2.5.0

gem source --add http://rubygems.org

# ここは必要に応じて変えてください。
# 筆者の場合は、オフライン環境で構成管理をしたかったため、下記の資材をダウンロードしています。
gem install bundler
gem install itamae -v "1.9.11"
gem install capistrano -v "3.10.2"
gem install serverspec -v "2.41.3"
gem install cassandra-driver -v "3.2.2"
gem install parallel -v "1.12.1"
gem install rspec -v "3.7.0"
```

固めます。

```
tar cvfz rbenv.tar.gz rbenv
```

ここで作成した`rbenv.tar.gz`は**手順4.で使います**。


## 手順3. オフラインマシンでyumリポジトリを構築する

この作業は、オフラインマシンで実施します。
手順1.で作成した`yum_repo.tar.gz`をオフラインマシンに転送し、以下のコマンドを実行してください。

```
# /etc/yum.repos.d/配下のrepoファイルを無効化しておきます。
for f in /etc/yum.repos.d/CentOS-*repo; do sudo mv $f{,.back}; done
sudo yum clean all

# yum_repoを/usr/share/resources配下に解凍します。
sudo mkdir -p /usr/share/resources
sudo tar xvfz yum_repo.tar.gz -C /usr/share/resources

# repoファイルを作成します。
cat << EOF | sudo tee /etc/yum.repos.d/local.repo > /dev/null
[local-repository]
name=Headway repository
baseurl=file:///usr/share/resources/yum_repo
gpgcheck=0
enabled=1
EOF
```

ここまででオフラインマシンにリポジトリを構築できています。

構築できているかは、`yum install`で確認してください。

```
sudo yum install vim nginx sysstat dstat
```

## 手順4. オフラインマシンでRubyを使えるようにする

```
# sampleユーザでRubyを使えるようにします。
# このユーザは手順3に合わせてください。
sudo su - sample

# rbenv.tar.gzを解凍してください。
tar xvfz rbenv.tar.gz -C ~/
chown -R sample:sample ~/rbenv

#  sampleユーザのbash_profileにRubyの環境変数を追加してください。
echo 'export RBENV_ROOT="$HOME/rbenv"' >> ~/.bash_profile
echo 'export PATH="$RBENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
```

ここまででRubyが使えるようになっているはずです。
設定完了したら、`sample`ユーザでインストールできているか確認してみるのがよいです。

```
$ ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]

$ itamae version
Itamae v1.9.11

$ cap -V
Capistrano Version: 3.10.2 (Rake Version: 12.3.0)
```

以上、オフライン環境にyumリポジトリを構築、Rubyを使えるようにするまでの手順でした。
応用が利くと思いますので、参考になれば幸いです。。