24
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AnsibleでRuby環境構築

Last updated at Posted at 2018-08-10

はじめに

AnsibleでRuby環境を構築するハンズオン?資料?メモ?です。

本記事は下記を経験したことがある人向けとなります。

  • Ruby環境を構築したことがある
  • Ansibleを触ったことがある

事前環境準備

  • vagrantvirtualboxをインストール
$ brew cask install vagrant
$ brew cask install virtualbox

環境

  • OS X Sierra 10.12.6
  • Vagrant 2.1.2(ansible 2.6.2)
  • VirtualBox 5.2.14

vagrant設定

作業ディレクトリを作成し移動
$ mkdir ansible-ruby; cd $_
vagrant初期設定
$ vagrant init mvbcoding/awslinux
仮想マシンの設定
Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.define :ansible_host do |node|
    node.vm.box = "mvbcoding/awslinux"
    node.vm.network :forwarded_port, guest: 22, host: 2001, id: "ssh"
    node.vm.network :private_network, ip: "192.168.33.11"
  end

  config.vm.define :server_1 do |node|
    node.vm.box = "mvbcoding/awslinux"
    node.vm.network :forwarded_port, guest: 22, host: 2002, id: "ssh"
    node.vm.network :forwarded_port, guest: 80, host: 8000, id: "http"
    node.vm.network :private_network, ip: "192.168.33.12"
  end
end
仮想マシン起動
$ vagrant up
ステータス確認
$ vagrant status
仮想マシンにssh接続
$ vagrant ssh ansible_host
$ vagrant ssh server_1
(補足)ちょくちょく使うコマンド
# 仮想マシンリロード
$ vagrant reload

# 仮想マシン停止
$ vagrant halt

# 仮想マシン削除
$ vagrant destroy
トラブルシューティング

ホストOSとファイル共有設定をしている場合、vagrant up 時にGuest Additionsバージョン違いのエラーが出ると思いますので、vagrant-vbguestプラグインをインストールし、vagrant upvagrant haltを繰り返して下さい。。。。(数回)

$ vagrant plugin install vagrant-vbguest

ansible_hostサーバにAnsibleをインストール

ansible_host
# Ansibleインストール
$ sudo yum -y --enablerepo=epel install ansible

# バージョン確認
$ ansible --version
ansible 2.6.2

AmazonLinux2にAnsibleをインストールする場合はamazon-linux-extras コマンド経由で
インストールすると色々と便利です。
$ sudo amazon-linux-extras install ansible2

Ansible実行前準備

  • Ansibleは操作したい対象サーバにSSH接続して環境を構築します。
ansible_host
# SSH鍵作成
$ ssh-keygen -t rsa
server_1
# ユーザー作成
$ sudo useradd ansible

# ansibleユーザーにホストサーバで作成した公開鍵(id_rsa.pub)を設置
$ sudo su - ansible
$ mkdir .ssh
$ chmod 700 .ssh
$ vim ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

# ansibleユーザーにsudo権限付与(rootユーザーで実行してください)
$ visudo
(下記1行を追加)
ansible   ALL=(ALL)       NOPASSWD: ALL
ansible_host
# SSH接続
$ ssh ansible@192.168.33.12

※ 今回はsudoコマンドをパスワードなしで実行させてますが、管理上好ましくないためご注意ください。 :warning:

インベントリファイルの作成

  • 対象サーバを指定するためにインベントリファイルを作成します。
ansible_host
$ vi hosts

---
[server1]
192.168.33.12
  • 対象サーバにansibleコマンドで接続確認(ユーザーを指定)
ansible_host
$ ansible server1 -i hosts -u ansible -m ping

192.168.33.12 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

Ruby環境構築時のおさらい

プレイブックに書き出す前にイメージし易いようRuby環境構築手順の流れをざっくり書いておきます。

  1. gitやgcc、openssl-develなど必要なパッケージ群をインストール
  2. rbenvインストール
  3. システムワイドに使えるよう/etc/profile.d/配下にシェルを設置
  4. ruby-buildインストール
  5. rbenvコマンドが実行出来るグループを作成
  6. 適宜ユーザーをグループに所属させる
  7. rbenvディレクトリ配下の所有グループを変更
  8. rbenvを使ってrubyをインストール
  9. bundlerインストール

プレイブックファイルの作成

それでは上述した環境構築手順を参考にプレイブックファイルを作成していきます。
※今回ansibleの書き方に慣れてもらうためフォルダ構成はシンプルにしています。

  • 初期定義
ansible_host
$ vi site.yml

---
- hosts: server1 # インベントリファイルの対象サーバを指定
  become: yes # rootユーザーでの実行
site.yml
  tasks:
    - name: 'yum update'
      yum:
        name: '*'
        state: latest
  • 必要なパッケージ群をインストール(yum-module
site.yml
...
    - name: 'Install packages'
      yum:
        name: "{{ item }}"
      with_items:
        - git
        - gcc
        - openssl-devel
        - libyaml-devel
        - readline-devel
        - zlib-devel
        - libffi-devel
site.yml
    - name: 'Install rbenv'
      git:
        repo: https://github.com/sstephenson/rbenv.git
        dest: /usr/local/rbenv

システムワイドに利用出来るように/etc/profile.d/配下にこのようなshファイルを配置します。

rbenv.sh
export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"

site.ymlと同じディレクトリ内に「templates」フォルダを作成し、テンプレートファイルを.j2拡張子ファイルで格納しておきます。(j2とはpython用のテンプレートエンジンライブラリ jinja2

templates/rbenv_system.sh.j2
export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
site.yml
    - name: 'rbenvのshファイルを配置'
      template:
        src: rbenv_system.sh.j2
        dest: /etc/profile.d/rbenv.sh
        owner: root
        group: root
        mode: 0755

(補足)shellコマンドを使って下記のようにも書けますが・・・なんかイマイチ。。。

shell: echo 'export PATH="export RBENV_ROOT=/usr/local/rbenv"' >> /etc/profile.d/rbenv.sh
shell: echo 'export PATH="export PATH="${RBENV_ROOT}/bin:${PATH}""' >> /etc/profile.d/rbenv.sh
shell: echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh
site.yml
    - name: 'ruby-buildインストール'
      git:
        repo: https://github.com/sstephenson/ruby-build.git
        dest: /usr/local/rbenv/plugins/ruby-build
  • rbenvコマンドが実行出来るグループを作成(group-module
site.yml
    - name: 'deploy用のグループを作成'
      group:
        name: deploy
  • ansibleユーザーをdeploy用グループに所属させる(user-module
site.yml
    - name: 'ansibleユーザーをdeployグループに所属'
      user:
        name: ansible
        groups: deploy
  • rbenvディレクトリの所有グループをdeployグループに変更(file-module
site.yml
    - name: 'rbenvディレクトリの所有グループをdeployに変更'
      file:
        path: /usr/local/rbenv
        owner: root
        group: deploy
        recurse: yes
        state: directory
site.yml
    - name: 'rubyインストール'
      shell: bash -lc "rbenv install --skip-existing 2.5.0"
  • インストールしたRubyバージョンをglobalセット(shell-module
site.yml
    - name: 'globalセット'
      shell: bash -lc "rbenv global 2.5.0"
site.yml
    - name: 'bundlerインストール'
      gem:
        name: bundler
        user_install: no
        executable: /usr/local/rbenv/shims/gem

確認〜実行

Syntax Check

$ ansible-playbook site.yml -i hosts --syntax-check

Dry Run

$ ansible-playbook site.yml -i hosts -u ansible --check

Run ♪

$ ansible-playbook site.yml -i hosts -u ansible

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

:tada:

Dry Run実行時の注意点

dry-run実行時はリモートシステム上での変更は行われないため実行したコマンド結果に依存する処理の場合、何かしらエラーになってしまいます。
ansible 2.2以降からcheck_modeオプションが追加され、
下記のように記述することで--checkオプション実行時にtaskをスキップしてくれます。

site.yml
  tasks:
    - name: 'yum update'
      yum:
        name: '*'
        state: latest
      check_mode: yes

まとめ

Ansibleでは様々な書き方ができ、模範となる回答が探し難いのですがとりあえず動けばいいやのノリで作成してみました。(色々とツッコミあればください :bow:
次回はディレクトリ構成や冪等性などに触れてみたいと思います :writing_hand:
今回のソース置き場

参考

Ansible role for installing rbenv.

24
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?