requireとrequire_relativeの違いとは?

先日、require_relativeっていうのを見かけて、これなんだろうと思って調べました!どうもRuby1.9.2から導入されたモジュールみたいですね。

そもそも、Ruby1.9.2以降とそれより前のバージョンとでは、$LOAD_PATHの扱いに違いがあります。例えば、Ruby1.8.7では$LOAD_PATHにはカレントディレクトリも含まれます。

$ rbenv shell 1.8.7-p375
$ ruby -e 'puts $LOAD_PATH'
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/site_ruby/1.8
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/site_ruby/1.8/i686-darwin13.4.0
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/site_ruby
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/vendor_ruby/1.8
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/vendor_ruby/1.8/i686-darwin13.4.0
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/vendor_ruby
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/1.8
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/1.8/i686-darwin13.4.0
.

一方、Ruby2.1.2では、カレントディレクトリが含まれません。

$ rbenv shell 2.1.2
$ ruby -e 'puts $LOAD_PATH'
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/site_ruby/2.1.0
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/site_ruby/2.1.0/x86_64-darwin13.0
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/site_ruby
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/vendor_ruby/2.1.0
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/vendor_ruby/2.1.0/x86_64-darwin13.0
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/vendor_ruby
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/2.1.0
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/2.1.0/x86_64-darwin13.0

そのため、Ruby2.1.2で、カレントディレクトリにあるファイルを単純にはrequireすることが出来なくなっています。カレントディレクトリにあるファイルをrequireするためには、$LOAD_PATHにカレントディレクトリ (.) を追加するか、もしくは以下のように相対パスで指定します。

require "./foobar"

ただこれも万能というわけでは無いので注意です。違うディレクトリから実行しようとすると当たり前ですがうまく動作しません。。

これに対する解決策が、require_relativeです。require_relativeを使うことで、そのファイルからの相対パスで指定することが出来ます。違うディレクトリから実行しても動作します。

require_relative "foobar"

ということで、Ruby1.9.2以上で$LOAD_PATHに含まれないファイルを読み込む必要があるときにはrequire_relativeを使いましょう :)

ヒトメディアに入社しています

だいぶ今更感はあるのですが、、

7月から「教育で世界をよくする」をビジョンに掲げているヒトメディアという会社に入社して、とある新規事業に関わっています。頑張っています。

ささたつの欲しいもの

BASE技術勉強会で話してきました

こんにちは。ささたつです。

先日、BASEさんの第1回?社内勉強会にお呼びいただいてお話してきました。そのときの資料です。前半はVagrantやDockerなどの仮想化周りの話を、後半は最近思っていることについてつらつらと話してきました〜。



このときのことについてはBASEのCTOであるえふしんさんがブログにまとめてくださったんですが、おにぎりやからあげ(!)も大量に用意してあり、ビールもプレモルで素晴らしい環境でした :D

BASE技術勉強会〜ささたつさん勉強会を開催しました | F's Garage@fshin2000

最近は社内勉強会のようなクローズドな集まりに呼んでいただけることもちょくちょく出てきました。えふしんさんも書かれていますが、なんで僕だったのか聞いてみたら「直感」だったということで大変嬉しく思っておりますw

社内勉強会に呼んでいただけるのはとても嬉しいです。これからも、「この人なら…!」と声を掛けていただけるように頑張っていかねば。。

ありがとうございました!

最後にえふしんさんのブログ記事より引用です。そう思います。

勉強会の意義って、新しいことを学んだり、検索キーワードを仕入れる場ってのもあるんだけど、自分たちが普段思っていることや、少し当たり前になりつつある部分とかが被るとすごくラッキーな話で、そこで得た共感を元に、自説を強化したり、間違ってないんだ!と自信を持ったり、そうか!みんな同じことを考えてるんだ!と改めて考えなおす機会になることって、すごく大切なんですよね。

Ansibleを使って誰でも簡単安全にサーバ構築できる仕組みを作る

 
Ansible って何なの?


サーバに対してミドルウェアのインストールや設定等の環境構築を行うことをプロビジョニングと言いますが、その作業を自動化させるためのツールです。プロビジョニングを手動で行うと、手間も掛かるし、どうしてもミスが起こりえます。

その点、Ansible のようなツールを使えば、コマンド一発でプロビジョニングが走り、さらに冪等性(何度実行しても同じ結果になる)も確保されるため、誰でも簡単安全にサーバ構築が出来るのです。


ansible


同様のことを行うツールとして、Chef や Puppet がありますが、Ansible はそれらの中でもシンプルなことが特徴です。Chef は以前使ってみようと思い触ってみたのですが、覚えることが多かったりして挫折してしまった。。Ansible はそういう点で、使い始めるまでの敷居が低い のがとても魅力です。大規模な環境であれば Chef や Puppet の方が良いのかもしれませんが、少数のサーバを管理する程度だったら Ansible は気軽で良いのではないでしょうか。

例として、Vagrant で起動した仮想マシン (CentOS) に対して、MySQL をインストールして起動するという簡単なプロビジョニングをやってみましょう。


仮想マシンに ssh ログイン出来るように


前回の Vagrantの使い方 〜仮想マシンを簡単に作成しよう。 で Vagrantfile というのがあったと思いますが、これを以下のように修正してください。

- # config.vm.box = "centos65"

+ config.vm.define :node1 do |node|
+   node.vm.box = "centos65"
+   node.vm.network :private_network, ip: "192.168.33.11"
+ end
+
+ config.vm.define :node2 do |node|
+   node.vm.box = "centos65"
+   node.vm.network :private_network, ip: "192.168.33.12"
+ end

この状態で vagrant up することで、node1 と node2 という2つの仮想マシンが起動します。まずはこれらの仮想マシンに ssh でログインできるように設定します。

# ~/.ssh/config
# vagrant ssh-config node[12] の結果を利用

Host node*
    HostName 127.0.0.1
    User vagrant
    UserKnownHostsFile /dev/null
    StrictHostKeyChecking no
    PasswordAuthentication no
    IdentityFile /Users/sasata299/.vagrant.d/insecure_private_key
    IdentitiesOnly yes
    LogLevel FATAL
Host node1
    Port 2222
Host node2
    Port 2200

これで、ssh node[12] でログイン出来るようになりました。ここまではさくっと。


Ansible を使ってみる


では、Ansible をインストールしてみましょう。Mac の場合、インストールは homebrew で一発です。

$ brew install ansible

さて、なにはさておき、まずはインベントリ (inventory) ファイルというものを準備します。Ansible を使い始めるのに最低限必要なのはこのファイルのみ!これはプロビジョニング先のサーバを登録しておくファイルなのですが、Ansible ではこのファイルに書かれたサーバに対してしか処理を実行してくれないのです。

今回、hosts という名前でインベントリファイルを作りました。node1, node2 両方含むグループを servers、node1 だけを含むグループを test-servers と命名しています(適当です)。

# hosts
[servers]
node1
node2

[test-servers]
node1

では、早速 Ansible を使ってみましょう。まずは、node1 に対して ping を実行してみます。

$ ansible -i hosts node1 -m ping                                                                                  [~/work/vagrant/audit]

node1 | success >> {
    "changed": false,
    "ping": "pong"
}

ping の結果が返ってきました!node1 だけじゃなく node2 に向けても ping を実行するには、インベントリファイルに指定した servers か、もしくは all というキーワードを指定します。

$ ansible -i hosts servers -m ping

node2 | success >> {
    "changed": false,
    "ping": "pong"
}

node1 | success >> {
    "changed": false,
    "ping": "pong"
}

単純なコマンドを実行するだけであればとても簡単ですね。


playbook を使って複雑な処理を実行する


ただ、実際にはこんな単純なコマンドを各サーバで実行したい場合ばかりでは無いでしょう。もっと複雑なことを実行するためには、ansible-playbook というコマンドが便利です。

以下のような MySQL をインストールして起動する設定ファイルを用意してみます(このようなファイルを playbook と呼びます)。hosts のところに対象のサーバを指定し、tasks のところに実行したいタスクを記述します。以下の例だと、node1, node2 両方に対して MySQL をインストールして、その後 MySQL を起動させるという指定になります。

# mysql-playbook.yml
---
- hosts: servers # 対象のサーバを指定
  sudo: yes
  tasks:
    - name: install mysql
      yum: name=mysql-server state=installed # インストール
    - name: start mysql
      service: name=mysqld state=running enabled=yes # 起動の指定

さぁ、あとは実行するだけ!すると、、

$ ansible-playbook -i hosts mysql-playbook.yml

PLAY [servers] ****************************************************************

GATHERING FACTS ***************************************************************
ok: [node1]
ok: [node2]

TASK: [install mysql] *********************************************************
changed: [node1]
changed: [node2]

TASK: [start mysql] ***********************************************************
changed: [node2]
changed: [node1]

PLAY RECAP ********************************************************************
node1                      : ok=1    changed=2    unreachable=0    failed=0
node2                      : ok=1    changed=2    unreachable=0    failed=0

いかがでしょうか。changed となっており、実行されたことがわかります。ちなみに、再度実行しても既にインストールと設定は行われているため、何も起こりません(冪等性の確保)。

ということで、playbook の準備等で少し面倒かもしれないですが、一度作ってしまえば誰でも簡単安全にサーバ構築出来るようになるのはすばらしいと思います。便利ですぞ。

[参考URL]
構成管理ツール Ansible について - apatheia.info
Ansible チュートリアル | Ansible Tutorial in Japanese

Vagrantの使い方 〜仮想マシンを簡単に作成しよう。

vagrant


Vagrant とは?

Vagrant は、VirtualBoxなどの仮想環境上に仮想マシンを簡単に作成したり破棄したりできるツールです。操作出来る仮想環境は VirtualBox が基本ですが、VMware や Amazon EC2 なども(ちょっと設定すれば)操作可能です。

プロビジョニング(ミドルウェアの設定やインストール等の環境構築)には、Chef や Puppet や Ansible などが利用されます。


Vagrant と VirtualBox のインストール

今回は VirtualBox 上に仮想マシンを作成して使ってみましょう。まずインストールですが、以前紹介した homebrew-caskさえあればご飯大盛り三杯はイケる を利用していればこの設定を追加するだけです。

cask install virtualbox
cask install vagrant

あとは brew bundle するだけです。それ以外の方はなんとかしてインスt(ry


仮想マシンを起動しよう

まずは、仮想マシンのベースとなるイメージファイルを追加します。centos65 というのは任意の名前なので、好きな名前を付けちゃってください。これ以外のイメージファイルは A list of base boxes for Vagrant - Vagrantbox.es にあります。

$ vagrant box add centos65 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box

これでイメージファイルが追加されました。以下のコマンドで確認できます。

$ vagrant box list
centos65 (virtualbox, 0)

先ほど作成した centos65 があることがわかりますね。次に、vagrant init します。引数の centos65 というのは、先ほど付けたイメージファイルの名前です。

$ mkdir foobar # 任意のディレクトリを作成
$ cd foobar
$ vagrant init centos65

vagrant init すると、Vagrantfile というファイルが生成されます。このファイルには、ベースとしたイメージファイルや、作成された仮想マシンのIPなどが記録されています。

Vagrantfile が出来たらあとは vagrant up するだけ。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos65'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: blog_default_1406514521318_25412
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Remote connection disconnect. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
    default: /vagrant => /Users/sasata299/work/foobar

これで仮想マシンの作成が起動しました!プログラマブルに扱えるのが嬉しいですね。


仮想マシンに ssh ログイン

作成した仮想マシンには ssh でログイン可能なので、あとはゴニョゴニョしましょう。
$ vagrant ssh

vagrant コマンドを使わずに普通に ssh したい場合には、

vagrant ssh-config >> ~/.ssh/config

して、ssh 用の設定を ~/.ssh/config に書き出しておきましょう。ssh <任意のnode名> でログイン可能になります。 :D

karaage299 at gmail.com




寄稿した記事

Ruby Freaks Lounge (28,30)
NoSQLを試してみる

作ったもの

カープ戦速報ボット
まとめったー
YouTube Oricon Ranking
NicoNicoブックマーク
ねたばれ見る?


ブックマーク数



購読者数



 
RSS登録
Subscribe with livedoor Reader