IT井戸端会議

IT井戸端会議

インフラ、ネットワーク、アプリケーション開発、IT界隈の話等々を東京都千代田区界隈から発信します。

capistranoをほんのちょっと動かしてみる②(サーバ情報外だし)

(1)ではすべての情報を./config/deploy/manage.rbに記載した。 今回は./config/servers.rbにサーバ情報を記載。 ./config/deploy/manage.rb実行時に./config/servers.rbをロードするようにする。 また、capistranoは並列処理が出来るので2サーバを定義するようにする。

変更したのは下記の2ファイルのみ。 ./config/deploy/manage.rb ./config/servers.rb

./config/deploy/manage.rbの中身

# サーバ情報を記載した./config/servers.rbをロードするように変更
load './config/servers.rb'

task :mkdir do
  dir = '/root/test'

  on roles( :client ) do
    execute "mkdir -p #{dir}"
    execute "ls -ld #{dir}"
  end
end

./config/servers.rbの中身。

SSHKit::Backend::Netssh.configure do |ssh|
  ssh.ssh_options = {
    :user => 'root',
    :password => '****',
  }
end

# roleにホスト名がchefとopenvzの複数を指定するように変更してみた。
role :client, %w{chef openvz}

実行してみる。

$ cap manage mkdir
INFO [424865a2] Running /usr/bin/env mkdir -p /root/test on openvz
INFO [cd281711] Running /usr/bin/env mkdir -p /root/test on chef
DEBUG [cd281711] Command: mkdir -p /root/test
DEBUG [424865a2] Command: mkdir -p /root/test
INFO [424865a2] Finished in 0.121 seconds with exit status 0 (successful).
INFO [874e0841] Running /usr/bin/env ls -ld /root/test on openvz
DEBUG [874e0841] Command: ls -ld /root/test
DEBUG [874e0841]        drwxr-xr-x 2 root root 4096 Jul  7 02:15 /root/test
INFO [874e0841] Finished in 0.023 seconds with exit status 0 (successful).
INFO [cd281711] Finished in 0.325 seconds with exit status 0 (successful).
INFO [025e36b7] Running /usr/bin/env ls -ld /root/test on chef
DEBUG [025e36b7] Command: ls -ld /root/test
DEBUG [025e36b7]        drwxr-xr-x. 2 root root 4096 Jul  7 01:36 /root/test
INFO [025e36b7] Finished in 0.034 seconds with exit status 0 (successful).

mkdirコマンドなどが並列実行されているのを確認したら終わり。

capistranoをほんのちょっと動かしてみる①(mkdir実行)

capistrano2.x とcapistrano3.xではかなりコマンドや動きが違うように見えるのでちょっと動かしてみる。

やることはSSH接続で対象サーバにパスワードにてログインし、ディレクトリを作成するだけ。

ワークディレクトリを作成

mkdir cap-pro

雛形を作成

$ cd cap-pro/
$ cap install
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
create Capfile
Capified

ファイルを修正

./Capfileは修正しない。

# Load DSL and set up stages
require 'capistrano/setup'

# Include default deployment tasks
require 'capistrano/deploy'

# Include tasks from other gems included in your Gemfile
#
# For documentation on these, see for example:
#
# https://github.com/capistrano/rvm
# https://github.com/capistrano/rbenv
# https://github.com/capistrano/chruby
# https://github.com/capistrano/bundler
# https://github.com/capistrano/rails
# https://github.com/capistrano/passenger
#
# require 'capistrano/rvm'
# require 'capistrano/rbenv'
# require 'capistrano/chruby'
# require 'capistrano/bundler'
# require 'capistrano/rails/assets'
# require 'capistrano/rails/migrations'
# require 'capistrano/passenger'

# Load custom tasks from `lib/capistrano/tasks` if you have any defined
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }

./libディレクトリ配下は修正しない。

./config/deploy.rbの中身を下記以外削除する。 ※不要なのでバージョン情報のみ残す。

lock '3.4.0'

./config/deploy/manage.rbに実際にやりたいタスクを記載する。

# userがroot,パスワードが****にてログインさせる
SSHKit::Backend::Netssh.configure do |ssh|
    ssh.ssh_options = {
    :user => 'root',
    :password => '****',
}
end

# chefというホスト名のサーバのロール名をclientとする
server 'chef', :roles => [ :client ]

# タスク名をmkdirにする
task :mkdir do

    # dir変数を設定する
    dir = '/root/test'

    # ロール名がclientに対し,do~endまでに記載したコマンドを実行する
    on roles( :client ) do

        # mkdirとlsコマンドを実行する
        execute "mkdir -p #{dir}"
        execute "ls -ld #{dir}"
    end
end

Capfileがあるディレクトリでcapコマンドを実行する。

$ cap manage mkdir
INFO [f7c8ab7c] Running /usr/bin/env mkdir -p /root/test on chef
DEBUG [f7c8ab7c] Command: mkdir -p /root/test
INFO [f7c8ab7c] Finished in 0.326 seconds with exit status 0 (successful).
INFO [54178f59] Running /usr/bin/env ls -ld /root/test on chef
DEBUG [54178f59] Command: ls -ld /root/test
DEBUG [54178f59]        drwxr-xr-x. 2 root root 4096 Jul  7 01:36 /root/test
INFO [54178f59] Finished in 0.031 seconds with exit status 0 (successful).

cap  : capistranoのコマンド manage: ./config/deploy/manage.rbを指定 mkdir : ./config/deploy/manage.rbにあるmkdirというタスクを指定

CentOSにcapistrano({か,きゃ}ぴすとら~の)をインストール

開発環境

OS:CentOS 6.5 ruby:2.2.2

 

ざっくりとした説明

capistranoをインストールしたサーバからクライアント(構築対象のサーバ)に対しSSH接続をして設定を行う。

そのため、クライアントの設定はSSH接続の許可のみ。

 

 

capistranoのインストールと設定

インストール

$ gem install capistrano

capistranoの拡張系をインストール

$ gem install capistrano_colors
$ gem install capistrano-ext
$ gem install capistrano-deploy

capistranoのバージョン確認

cap -v
Capistrano Version: 3.4.0 (Rake Version: 10.4.2)

Chef-soloにてrpmをビルド

開発環境

OS:CentOS6.6(64bit) ruby:2.2.2p95 rubygems:2.4.5 chef:12.4.0 cookbook:rpm

事前作業

ソースRPMとパッチを取得のレシピを作成 getpatch.rb

src_url  = "http://vault.centos.org/6.5/os/Source/SPackages/openssl-1.0.1e-15.el6.src.rpm"
src_file = "openssl-1.0.1e-15.el6.src.rpm"
src_path = "/tmp/#{src_file}"
git_path = "/tmp/openssl"
patch_file = "openssl-1.0.1e-cve-2015-0293.patch"
patch_path = "#{git_path}/SOURCES/#{patch_file}"
rpm_path = "/root/rpmbuild/SOURCES/"

# ソースrpmをダウンロード
remote_file src_path do
        not_if { File.exists?("#{src_path}") }
        source src_url
end

# ソースの解凍
rpm_package "openssl_install" do
        action :install
        source "#{src_path}"
end

# gitコマンドを使用するためインストール
yum_package "git" do
        not_if "rpm -qa | grep ^git"
        action :install
end

# clone元ディレクトリを削除
execute "dir delete" do
        only_if "test -d #{git_path}"
        command <<-EOC
                rm -rf #{git_path}
        EOC
end

# gitでclone
git "/tmp/openssl" do
        repository "https://github.com/ptudor/centos6-openssl"
        revision "master"
        action :sync
end

# パッチを展開先ソースディレクトリへコピー
execute "patch copy" do
        not_if { File.exists?("#{rpm_path}/#{patch_file}") }
        command <<-EOC
                cp -fp #{patch_path} #{rpm_path}
        EOC
end

# rpm-buildをインストール
yum_package 'rpm-build' do
        not_if "rpm -qa | grep ^rpm-build"
        action :install
end

# gccをインストール
yum_package 'gcc' do
        not_if "rpm -qa | grep ^gcc"
        action :install
end

作成したgetpatchレシピを実行

$ chef-solo -o rpm:getpatch

SPECファイルを編集※省略

ビルド用のレシピを作成 build.rb

src_file = "openssl.spec"
src_path = "/root/rpmbuild/SPECS/#{src_file}"

execute "rpm build" do
        command <<-EOC
                rpmbuild -ba #{src_path}
        EOC
end

作成したbuildレシピを実行

$ chef-solo -o rpm:build

RPMパッケージにパッチを当てる方法

ソースRPMを取得し、バッチを追加後、RPMパッケージを作成する方法について デモを交えて説明していきます。

ソースRPMの取得

まず、元となるソースRPMを取得します。 今回は、opensslで実施したいと思います。

$ cd
$ wget http://vault.centos.org/6.6/os/Source/SPackages/openssl-1.0.1e-30.el6.src.rpm

ソースRPMのインストール

ダウンロードしたソースRPMをインストールします。

$ rpm -vih openssl-1.0.1e-30.el6.src.rpm

正常終了すると、以下のフォルダが作成されます。

  • SOURCES(ソースコード・パッチ格納ディレクトリ)
  • SPECS(SPECファイル格納ディレクトリ)

パッチの取得

githubからパッチを取得し、SOURCESディレクトリにコピーします。

$ git install yum

$ cd /tmp/
$ git clone https://github.com/ptudor/centos6-openssl

$ cp -p /tmp/centos6-openssl/SOURCES/openssl-1.0.1e-cve-2015-0293.patch ~/rpmbuild/SOURCES/

SPECファイルの修正

以下の通り、パッチ定義を追加します。

vi ~/rpmbuild/SPECS/openssl.spec
@@ -105,6 +105,7 @@
 Patch104: openssl-1.0.1e-cve-2014-3509.patch
 Patch105: openssl-1.0.1e-cve-2014-3510.patch
 Patch106: openssl-1.0.1e-cve-2014-3511.patch
+Patch107: openssl-1.0.1e-cve-2015-0293.patch
 
 License: OpenSSL
 Group: System Environment/Libraries
@@ -231,6 +232,7 @@
 %patch104 -p1 -b .tlsext-race
 %patch105 -p1 -b .adh-dos
 %patch106 -p1 -b .frag-downgrade
+%patch107 -p1 -b .hoge
 
 sed -i 's/SHLIB_VERSION_NUMBER "1.0.0"/SHLIB_VERSION_NUMBER "%{version}"/' crypto/opensslv.h

RPMの作成

RPMをビルドするために必要となるパッケージをインストールします。

$ yum install rpm-build
$ yum install gcc

ビルドの実行

SPECファイルを指定してビルドしてみます。

$ rpmbuild -ba SPECS/openssl.spec
...
エラー: ビルド依存性の失敗:
    krb5-devel は openssl-1.0.1e-30.el6.x86_64 に必要とされています
    zlib-devel は openssl-1.0.1e-30.el6.x86_64 に必要とされています

openssl をビルドするのに必要なパッケージが足りないようなので追加します。

yum install krb5-devel zlib-devel

再びビルドを実行します。

$ rpmbuild -ba SPECS/openssl.spec
...
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.4121ir
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd openssl-1.0.1e
+ '[' /root/rpmbuild/BUILDROOT/openssl-1.0.1e-30.el6.x86_64 '!=' / ']'
+ rm -rf /root/rpmbuild/BUILDROOT/openssl-1.0.1e-30.el6.x86_64
+ exit 0

無事に成功しました。

rpmbuild ディレクトリ配下を確認すると以下のディレクトリが確認できます。

  • BUILD(ビルドする際に使用される作業用ディレクトリ)
  • BUILDROOT()
  • RPMS(ビルド後に生成されるRPM格納ディレクトリ)
  • SOURCES(ソースコード・パッチ格納ディレクトリ)
  • SPECS(SPECファイル格納ディレクトリ)
  • SRPMS(ビルドにて生成されるソースRPM格納ディレクトリ)

RPMS ディレクトリ配下を確認すると、rpmが生成されていることが確認できます。

$ tree ~/rpmbuild/RPMS/
/root/rpmbuild/RPMS/
└── x86_64
    ├── openssl-1.0.1e-30.el6.x86_64.rpm
    ├── openssl-devel-1.0.1e-30.el6.x86_64.rpm
    ├── openssl-perl-1.0.1e-30.el6.x86_64.rpm
    └── openssl-static-1.0.1e-30.el6.x86_64.rpm

WordPress での Markdown の書き方

WordPress でも Markdown の書き方について こちらの公式サイトを参考にまとめました。

https://en.support.wordpress.com/markdown-quick-reference/


強調

*斜体1*
_斜体2_

斜体1 斜体2

**太字1**
__太字2__

太字1 太字2


リンク

[リンク](http://example.com "タイトル")です。

リンクです。


注釈

Wordpress[^1] の Markdown に関する説明です。

[^1]: MySQL使用のphpで作成したプログラム。パッケージの配布やサポートも行う。

Wordpress^1 の Markdown に関する説明です。


リスト

* アイテム1
* アイテム2
- アイテム3
- アイテム4
  • アイテム1
  • アイテム2
  • アイテム3
  • アイテム4

番号リスト

1. アイテム1
2. アイテム2
  1. アイテム1
  2. アイテム2

引用

> テキスト

テキスト


ハイライト

`テキスト`

テキスト


シンタックスハイライト

~~~~
public class HelloWorld {   public static void main (String args) {     System.out.println("Hello World !!");   } } ~~~~

~~~~ public class HelloWorld { public static void main (String args) { System.out.println("Hello World !!"); } } ~~~~

```
public class HelloWorld {
  public static void main (String[] args) {
    System.out.println("Hello World !!");
  }
}
```
public class HelloWorld {
  public static void main (String[] args) {
    System.out.println("Hello World !!");
  }
}
```bash
public class HelloWorld {
  public static void main (String[] args) {
    System.out.println("Hello World !!");
  }
}
```
public class HelloWorld {
  public static void main (String[] args) {
    System.out.println("Hello World !!");
  }
}

見出し

# 見出し1
## 見出し2
### 見出し3
#### 見出し4 ####
##### 見出し5 #####
###### 見出し6 ######

見出し1

見出し2

見出し3

見出し4

見出し5
見出し6

Mondo Rescue でバックアップ

サーバのフルバックアップを取っておこうと思い、Mondo Rescue を導入してみましたので手順を残します。

Mondo Rescue とは

Mondo Rescue は、GPLライセンスディザスタリカバリするためのソフトウェアです。

Linux (i386, x86_64, ia64)、およびFreeBSD (i386)がサポートされています。

使用環境

CentOS 6.6 (64bit)

バックアップ手順

Mondo Rescue のインストール

OS丸ごとバックアップする為、MondoRescueを導入する。

まずは、Mondo Rescue 本体をインストールします。

$ su - root
$ mv mondorescue.repo /etc/yum.repos.d/
$ wget ftp://ftp.mondorescue.org/rhel/6/x86_64/mondorescue.repo
$ yum -y install mondo

Mondo Rescue でのバックアップで必要となるため、高速圧縮パッケージ(lzo)をインストールする。

$ vi /etc/yum.repos.d/dag.repo
[dag]
name=Dag RPM Repository for Red Hat Enterprise Linux
baseurl=http://ftp.riken.jp/Linux/dag/redhat/el$releasever/en/$basearch/dag
gpgcheck=1
gpgkey=http://dag.wieers.com/packages/RPM-GPG-KEY.dag.txt
enabled=0

$ yum -y install lzop lzo --enablerepo=dag

バックアップ

バックアップ先ディレクトリとして /backup を作成する。

$ mkdir /backup

調査のため、バックアップ前のファイルサイズを調べます。

$ du -sh /
3.8G    /

いよいよバックアップです。 以下の通り実行し、ISO形式でのバックアップとしました。

$ mondoarchive -Oi -d /backup -E /backup -p `hostname`-`date +%Y%m%d`
オプション説明
-Oバックアップの実行
-Vバックアップファイルの検証
-c speedCD-R にバックアップします。
-w speedCD-RW にバックアップします。
-rDVD にバックアップします。
-p prefixISOイメージ名を指定します。
設定しない場合、"mondorescue-n.iso"というファイル名で保存されます。
-iISO 形式でバックアップします。
-n NFSを使用してバックアップします。
-tテープストリーマにバックアップします。
-UUSBデバイスにバックアップします。
-D
-E "dir|..."バックアップ対象から除外したいディレクトリを指定します。
-I "dir|..."バックアップ対象に含めたいディレクトリを指定します。
-J fileバックアップ対象に含めたいディレクトリの一覧ファイルを指定します。
-NマウントされているNFSを除外します。
-d dev|dirバックアップ先のデバイス(CD/tape/USB)、またはディレクトリ(NFS/ISO)を指定します。
-gGUI モードで実行します。
-k pathカーネルのフルパスを指定
-s sizeバックアップする際の分割サイズを姉弟します。
-x 'dev ..'バックアップしたい non-Linux パーティション(NTFS、BeOS 等)を指定します。

今回の場合、10分弱で完了しました。

バックアップファイルを確認しました。 ISO形式の場合、約1/2程度のサイズとなるようです。

$ ls -lh /backup
合計 1.8G
-rw-r--r-- 1 root root 639M  7月  5 05:16 2015 sakura-vps-20150705-1.iso
-rw-r--r-- 1 root root 642M  7月  5 05:19 2015 sakura-vps-20150705-2.iso
-rw-r--r-- 1 root root 507M  7月  5 05:21 2015 sakura-vps-20150705-3.iso

バックアップを定期実行したいので、以下の通り、crontab に追記します。

$ vi /etc/crontab
...
0 5 * * * root mondoarchive -Oi -d /backup -E /backup -p `hostname`-`date +\%Y\%m\%d` && rm -f /backup/`hostname`-`date -d '1 day ago' +\%Y\%m\%d`*