2
2

More than 5 years have passed since last update.

ObjectStorageのマウント設定のCHEFクックブック

Last updated at Posted at 2015-10-05

SoftLayerクッキングLABO

このクックブックの出来ること

オブジェクト・ストレージをブロックストレージとしてマウントするためのクックブックです。 ご存知のとおり、オブジェクト・ストレージは従量制課金のストレージなので、ログやデータの保管の見積もりが難しい場合、安くスタートできるストレージです。 しかし、オブジェクト・ストレージは、ブロック・ストレージと異なりHTTPでしかアクセスできません。 そこで Cloudfuse というソフトウェアを組み合わせて、ブロック・ストレージとしてマウントするものです。

クックブックの自動作業内容の要約

この objectstorage01 クックブックは、以下の設定を適用します。

  • Cloudfuse に必要なパッケージを導入
  • Cloudfuse の tar を展開して、ビルド、インストール
  • オブジェクト・ストレージの認証情報の設定
  • fstab にマウント・ポイント追加
  • マウント用ディレクトリ作成
  • オブジェクト・ストレージを /os にマウント実行

このクックブックを適用した時の実績時間は、以下の様に約1分でした。

# chef-solo -o objectStorage01
< 中略 >
Running handlers:
Running handlers complete
Chef Client finished, 13/14 resources updated in 01 minutes 15 seconds

本クックブックの置き場所

最新版のクックブックはGitHubの https://github.com/takara9/objectStorage01 においてあります。 適用方法などは、このURLのREADME.dmに記載しています。

対応するソフトレイヤー活用ガイド

このレシピを利用することで、以下の設計パターンや設定作業を自動化することができます。

テスト済みのLinuxディストリビューション

SoftLayerでサーバーオーダー時に選択できるOSの中から、確認できたもののリストです。

  • Ubuntu 14.04 64bit minimal install
  • CentOS 7 64bit minimal install
  • CentOS 6 64bit minimal install

レシピの説明

オブジェクト・ストレージのアカウントを持ち、APIキーを取得している必要があります。 このアカウント作成とAPIキー取得の方法は、コンフィグレーション・ガイド 5.1 オブジェクト・ストレージを利用するには? の 「オブジェクト・ストレージのAPIを使ったアクセス」に案内があります。

このレシピに必要なファイルは、以下のディレクトリ・ツリーに表す3本です。

root@ChefWs:~/chef-repo/site-cookbooks# tree objectStorage01/
objectStorage01/
├── README.md
├── attributes
│   └── default.rb     <-- (1)オブジェクト・ストレージの認証情報
├── files
│   └── default
│       └── cloudfuse.tgz  <-- (2) cloudfuseインストールファイル
├── recipes
│   └── default.rb <-- (3) レシピ本体
└── templates
    └── default

(1)オブジェクト・ストレージの認証情報

この認証情報は、attributes の default.rb に設定します。 以下のアスタリスクの場所を置き換えます。

default["objectstorage"]["username"]="*********:*********"
default["objectstorage"]["apikey"]="****************************************************************"
default["objectstorage"]["authurl"]="https://****.objectstorage.softlayer.net/auth/v1.0/"

(2) cloudfuseインストールファイル

この tar ファイルは、GitHUB の https://github.com/redbo/cloudfuse をクローンして tar コマンドでまとめたものです。

$ git clone https://github.com/redbo/cloudfuse.git
$ tar czvf cloudfuse.tgz cloudfuse
$ sha256sum cloudfuse.tgz 
3afb37d739ca47bad19eee28abaa73703ccda7ce5df6a2279fc70bf96eeb5f6b  cloudfuse.tgz

(3) レシピ本体の説明

レシピの説明は Ruby コード入れた注釈を参照ねがいます。 Linuxのディストリビューションによる非互換部分は、判定して対応する様に書いています。

# -*- coding: utf-8 -*-
#
# Cookbook Name:: objectStorage01
# Recipe:: default
#

#
# CloudFuseを動作させるために必要な
# パッケージのインストール
#
case node['platform']
when 'ubuntu','deb ian'
  execute 'apt-get update' do
    command 'apt-get update'
    action :run
  end

  %w{
    build-essential 
    libcurl4-openssl-dev 
    libxml2-dev 
    libssl-dev 
    libfuse-dev
  }.each do |pkgname|
    package "#{pkgname}" do
      action :install
    end
  end

when 'centos','redhat'
  execute 'yum update' do
    command 'yum update -y'
    action :run
  end

  %w{
    gcc
    make
    fuse-devel
    curl-devel
    libxml2-devel
    openssl-devel
    fuse
  }.each do |pkgname|
    package "#{pkgname}" do
      action :install
    end
  end
end


#
# cloudfuse の tar ファイルを対象サーバーへ転送する
# この tar ファイルは、以下のURLから取得したものです
# https://github.com/redbo/cloudfuse
#
filename = "cloudfuse.tgz"
file_checksum = "aea8ec51613c6a3f7ffd8cbed76b27d4fb0d028a796952e9f582b7e9c3ab2307"
work_dir = "/root/_cloudfuse_work"
cookbook_file "/root/#{filename}" do
  source "#{filename}"
  checksum "#{file_checksum}"
end


#
# cloudfuseを展開、ビルド、インストールします
#
script "install_cloudfuse" do
  interpreter "bash"
  user        "root"
  code <<-EOL
    install -d #{work_dir}
    tar zxvf /root/#{filename} -C #{work_dir}
    cd #{work_dir}/cloudfuse
    ./configure
    make
    make install
  EOL
end


#
# アトリビュートdefailt.rb や ロールからのオバーライドの設定値を
# ローカル変数にセットして、cloudfuseの認証ファイルに書き込む
#
os_username = node["objectstorage"]["username"]
os_api_key = node["objectstorage"]["apikey"]
os_authurl = node["objectstorage"]["authurl"]

file "/root/.cloudfuse" do
  owner "root"
  group "root"
  mode 0600
  config_file = "username=#{os_username}\n" \
    "api_key=#{os_api_key}\n" \
    "authurl=#{os_authurl}\n"
  content "#{config_file}}\n"
  action :create
end

#
# /etc/fstabの修正方法には、file で修正する方法が取れるが、
# しかし、複数のレシピを適用した場合、CHEFが定義する適用ルールに違反するため
# 動作しないケースが起こる。
# この問題を回避するため、rubyブロックから/etc/fstabに追加を加える
#
# fileで設定する場合のためコメント化して残しておく
#
#file '/etc/fstab' do
#  owner "root"
#  group "root"
#  mode 0644
#  not_if 'grep "^cloudfuse" /etc/fstab'
#  new_content = File.read( path )
#  p new_content
#  content "#{new_content}\n" \
#  "cloudfuse /os fuse auto,_netdev,defaults,gid=106,umask=007,allow_other    0 0\n"
#  action :create
#end
#
# Ruby block で /etc/fstab に変更設定
ruby_block 'adding_fstab_entry' do
  block do
    file = "/etc/fstab"
    line = "cloudfuse /os fuse auto,_netdev,defaults,gid=106,umask=007,allow_other    0 0\n"
    if (`grep "^cloudfuse" #{file}`.size == 0) then
    File::open(file, "a") do |f|
        f.write "#{line}"
      end
    end
  end
  action :run
end

#
# ディレクトリ作成
#
directory '/os' do
  owner 'root'
  group 'root'
  mode '0755'
  action :create
end

#
# オブジェクト・ストレージをブロック・ストレージとしてマウント
#
execute "/os" do
  command 'mount /os'
  ignore_failure true
end

レシピの適用手順

このレシピは、物理サーバーと仮想サーバーのどちらでも対応しますが、簡単に試せる様に最小仮想サーバーでの適用例をご紹介します。次のシェルを利用して、仮想サーバーを注文します。 slcli コマンドの説明は "slcli vs create -h " で見る事ができます。

slcli vs create \
--hostname webap1 --domain softlayer.com \
--datacenter tok02 \
--cpu 1 --memory 1 \
--os UBUNTU_LATEST_64 \
--billing hourly \
--public \
--key 370981 \
--network 100

仮想サーバーの起動は、次のコマンドの action 欄が "- "になっていて、作業が無くなった状態になっていれば、完了した事になります。

chef@ChefWs:~/chef-repo/site-cookbooks$ slcli vs list
:..........:..........:.................:...............:............:........:
:    id    : hostname :    primary_ip   :   backend_ip  : datacenter : action :
:..........:..........:.................:...............:............:........:
: 13040349 :  webap1  : 161.202.142.196 :  10.132.253.7 :   tok02    :   -    :
:..........:..........:.................:...............:............:........:

本クックブックの適用方法として、スタンドアロン、knife リモート適用、Chef Server 利用の3パターンをご紹介します。

スタンドアロンで実行する方法

knife や chef-server を使わず、chef-solo コマンドを利用するだけの方法です。
プロビジョニング完了後に、設定対象サーバーにログインして、以下のコマンドを順次実行してきます。
ここでknifeを実行する理由は、/var/chef/cookbooks のディレクトを作成するためです。

# curl -L https://www.opscode.com/chef/install.sh | bash
# knife cookbook create dummy -o /var/chef/cookbooks
# cd /var/chef/cookbooks
# git clone https://github.com/takara9/objectStorage01

git のバージョンが1.9以降であれば、次の様に一回で落とせます。

# git -C /var/chef/cookbooks clone https://github.com/takara9/objectStorage01

適応前に、オブジェクト・ストレージの認証情報をattributesのファイルに設定します。

# vi objectStorage01/attributes/default.rb 

準備が完了したら objectStorage01 クックブックを適用します。

# chef-solo -o objectStorage01
< 中略 >
Running handlers complete
Chef Client finished, 13/14 resources updated in 01 minutes 15 seconds

Knife Solo で利用する方法

レポジトリ用のディレクトリを作成して初期化します。

$ mkdir chef-solo-repo
$ cd chef-solo-repo
$ knife solo init .

site-cookbooksの下にクックブックをクローンします。

$ cd site-cookbooks/
$ git clone https://github.com/takara9/objectStorage01 

一応、GitHubから落ちてきているか確認しておきます。

$ pwd
/home/chef/chef-solo-repo/site-cookbooks
$ ls
objectStorage01

attributes/default.rb を編集して認証情報をセットした後、
hostnameのインスタンスに、クックブックを適用します。

$ cd /home/chef/chef-solo-repo
$ knife solo bootstrap root@hostname -i sshkey -r 'recipe[objectStorage01]'

CHEF Server から適用する方法

Chef WorkStaion のリポジトリに移動して、クックブックをクローンします。

$ pwd
/home/chef/chef-repo/cookbooks
$ git clone https://github.com/takara9/objectStorage01

クックブックをCHEFサーバーへアップロードする

$ knife cookbook upload objectStorage01 
Uploading objectStorage01 [0.1.0]
Uploaded 1 cookbook.

ロールを作成して、オブジェクトストレージの認証情報のAttributeを上書きする様にします。

$ knife role create webserver

先に作成したロールを指定して、CHEFクライアントをインストールします。

$ knife bootstrap hostname -i sshkey -N web01 -r 'role[webserver]'

適用後のサーバーの状態

クックブックの適用結果を確認します。次の様に'/os'がマウントされていれば成功です。

# df
ファイルシス   1K-ブロック    使用     使用可 使用% マウント位置
/dev/xvda2        25412940 1763356   22352024    8% /
devtmpfs            497688       0     497688    0% /dev
tmpfs               505924       0     505924    0% /dev/shm
tmpfs               505924    6620     499304    2% /run
tmpfs               505924       0     505924    0% /sys/fs/cgroup
/dev/xvda1          245679  133940      98632   58% /boot
cloudfuse       8589934588       0 8589934588    0% /os

lsコマンドを実行するとオブジェクト・ストレージのコンテナのリストが表示されます。
/os直下は、コンテナに対応していないので、ファイルを保存できない点が注意です。

# ls -al /os
合計 4
drwxrwx---   2 root  106    0  1月  1  1970 .
drwxr-xr-x. 19 root root 4096 11月  9 10:01 ..
drwxrwx---   2 root  106    0 11月  9 10:02 archive
drwxrwx---   2 root  106    0 11月  9 10:02 backup_contents
drwxrwx---   2 root  106    0 11月  9 10:02 backup_dbdata
drwxrwx---   2 root  106    0 11月  9 10:02 log

Chef 関連マニュアル

このレシピを作るにあたって参照したCHEFマニュアルのリンクです。
- script (https://docs.chef.io/resource_script.html )
- execute (https://docs.chef.io/resource_execute.html )
- package (https://docs.chef.io/resource_package.html )
- About the Recipe DSL (https://docs.chef.io/dsl_recipe.html#about-the-recipe-dsl )
- About Ohai (https://docs.chef.io/ohai.html )
- ruby_block (https://docs.chef.io/resource_ruby_block.html)
- directory (https://docs.chef.io/resource_directory.html)
- mount (https://docs.chef.io/resource_mount.html)

2
2
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
2
2