ichigeki-mt 2015/03/14

Post on 19-Jul-2015

1.127 Views

Category:

Internet

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

第5回 一撃サーバー構築シェルスクリプト勉強会

USP友の会@nullpopopo

2015/03/14

[自己紹介]名前: 濱田康貴 ( @nullpopopo )

Bloghttp://nullpopopo.blogcube.info/Facebookhttps://www.facebook.com/nullpopopo

第5回 一撃サーバー構築シェルスクリプト勉強会

[自己紹介]執筆: シェルスクリプトマガジン (旧USP Magazine)

教えて先輩♡サーバー運用お助けTIPS隔月(偶数月号)連載中

Vol.22 では石狩DCまで取材に行ってきました→

第5回 一撃サーバー構築シェルスクリプト勉強会

[自己紹介]執筆: CodeZine ( http://codezine.jp/ ) で

ツールがなくてもサーバー構築でたじろがない!一撃シェルスクリプト道場連載はじめました。

第5回 一撃サーバー構築シェルスクリプト勉強会

[USP友の会とは]

USP(ユニバーサル・シェル・プログラミング)友の会は、日本唯一の、シェルプログラミングファンのコミュニティです。2009年5月にスタートした本会は、シェルプログラミングに限らず、簡潔明瞭さ、創意工夫を尊ぶエンジニアが集まり、技術の話題に花を咲かせています。公式サイト https://www.usptomo.com/Twitter https://twitter.com/usptomoFB https://www.facebook.com/usptomoFB (グループ) https://www.facebook.com/groups/141271259271220/

第5回 一撃サーバー構築シェルスクリプト勉強会

一撃シェルスクリプトとは

第5回 一撃サーバー構築シェルスクリプト勉強会

「シェルスクリプト(と設定ファイルのひな形)を用意すれば、コマンドを1回実行するだけで環境構築ができてしまうというスグレモノ」を目指しています。(「一撃シェルスクリプト」は @nullpopopo の造語です)

現在のところ、線引きとして以下のように詳細なルールを作っています。

● OSインストール直後に一撃シェルスクリプトを配置して動かすものとする● 実行回数は1回のみで、人が張り付く必要のない設計とする● 対話式の入力は可能な限り回避する

第5回 一撃サーバー構築シェルスクリプト勉強会

一撃シェルスクリプトで重視していないこと例)● 何がなんでも1枚のスクリプトファイルのみで完結することを目的としなくて

よい● (インターネットに繋がっていることが前提ですが)設定ファイルが複数または多岐にわたる

場合は、GitHubなどから雛形ファイルをダウンロードし、各々のホストで整形加工することもよしとする

(これはベテラン勢によくありがちなのですが)いわゆる○○準拠というものに対しては、あまり重視するつもりはありません。最終的に望むものが出来上がるのであれば、人様に迷惑をかけない限り何をやってもよいと考えます。同一条件でインストールされたOSで同じ結果が得られるのであれば、どんな言語やシェルを使っても構いません。

第5回 一撃サーバー構築シェルスクリプト勉強会

なぜシェルスクリプトでやるのか?

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

● インストール対象のOSに初めからあるコマンドだけで完結できる(基本的にyumで何かをインストールしたり、config書き換えたり)

● 環境構築のための環境構築が不要● エージェントレスですよ奥さん!● まさに一撃!

● シェルスクリプトの文法を知ってしまえば運用ツールを書くのにも応用が効く

● case、ヒアドキュメントあたりは使います。● 原則として綺麗な環境を前提としているのでifは余り使わない● 一度きりの実行なので、forも余り使わない

一撃でMovable Typeをインストール

今回のテーマは...

第5回 一撃サーバー構築シェルスクリプト勉強会

Movable Typeとは

シックス・アパートが開発するブログソフト/CMS。

ブログだけでなく、ウェブサイト単位でのウェブページや、ファイルの管理、更新履歴の保存などCMSとしての基盤を進化させたパブリッシングプラットフォーム。 (公式サイト: http://www.sixapart.jp/movabletype/support/fundamental/about-mt.html より)

第5回 一撃サーバー構築シェルスクリプト勉強会

今回の一撃シェルスクリプトでやっていること

● ドキュメントルートのディレクトリを作成し、ここにMovable Typeのファイル一式を配置する

● iptables設定● MySQLインストールとdatabase「mt」作成● nginx+FCGIインストール

● nginx設定ファイルはヒアドキュメントで作成● fastcgi-wrapper.pl 作成● perl-fastcgi initスクリプト作成

● perl-fastcgi initスクリプト 修正● パッケージ、OSのアップデート● 再起動

第5回 一撃サーバー構築シェルスクリプト勉強会

使用しているコマンド

awk basename cat cd chkconfig chmod cp curl echo egrep grep ip iptables ls mkdir mv mysql reboot sed service tee unzip yum

第5回 一撃サーバー構築シェルスクリプト勉強会

パッケージのインストール

●基本的にはyumでインストール●ほとんどのパッケージは標準リポジトリ● perlモジュールでMovable Typeが求める一部のパッケージはepelやrpmforgeリポジトリ

● MySQLは公式のコミュニティリポジトリ

第5回 一撃サーバー構築シェルスクリプト勉強会

設定ファイルの生成

● nginxのバーチャルホスト設定ファイルは、一撃シェルスクリプトの中でヒアドキュメントで生成

● perl-fastcgiと、perl-fastcgiから呼び出されるfastcgi-wrapper.plはWEBに公開されているものを流用

第5回 一撃サーバー構築シェルスクリプト勉強会

本日やること

1.Movable Typeダウンロードサイトへの登録2.githubから一撃シェルスクリプトのダウンロード3.さくらのクラウド コントロールパネルでスタートアップスクリプト登録4.一撃サーバー構築5.Movable Type設定

第5回 一撃サーバー構築シェルスクリプト勉強会

1. Movable Typeダウンロードサイトへの登録

http://www.movabletype.jp/ へアクセス

第5回 一撃サーバー構築シェルスクリプト勉強会

下へスクロール

第5回 一撃サーバー構築シェルスクリプト勉強会

ご自身のメールアドレスを入力し、利用目的に「初めて利用する」を選び、「上記に同意して申し込む」をクリック

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

この画面が表示されたら、メール受信を確認します。

第5回 一撃サーバー構築シェルスクリプト勉強会

メールで通知されたログインキーを入力し、ログインする

第5回 一撃サーバー構築シェルスクリプト勉強会

MT-6_1.zip へのリンクを右クリックメニューからコピーする※ リンクはメモ帳などに保存しておいてください

第5回 一撃サーバー構築シェルスクリプト勉強会

2. githubから一撃シェルスクリプトのダウンロード

以下のURLから作業用PCへ、一撃シェルスクリプトをダウンロードします。

https://raw.githubusercontent.com/nullpopopo/sakura-cloud/master/ICHIGEKI-MT-CentOS6

※ 文字コードはUTF-8、改行コードはLFで保存します※ Windows環境の方は以下のエディタをおすすめします

TeraPad http://www.forest.impress.co.jp/library/software/terapad/サクラエディタ http://sakura-editor.sourceforge.net/index.html.ja

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

Demo

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

CentOS 6.6を選択ディスクサイズは20GB

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

複雑な覚えやすいパスワード(by横田さん)

を入力する

任意のホスト名を入力する

先ほど登録したスタートアップスクリプトを選択する

第5回 一撃サーバー構築シェルスクリプト勉強会

任意のパスワードを入力する

Movable Type ダウンロードサイトでコピーしたURLを貼り付ける

第5回 一撃サーバー構築シェルスクリプト勉強会

これらの項目は、後でわかりやすいように任意の値を入れてください。

第5回 一撃サーバー構築シェルスクリプト勉強会

「作成後すぐに起動」にチェックを入れ、右下にある「作成」ボタンをクリック

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

サーバーが出来上がると、このように情報を見ることができます

第5回 一撃サーバー構築シェルスクリプト勉強会

コンソールからプロンプトが見えたらログイン可能

※ コンソールから作業するとコピペしにくいので、ssh接続推奨

第5回 一撃サーバー構築シェルスクリプト勉強会

サーバーのIPアドレスは「NIC」をクリックした後、↑の赤い枠に囲われた箇所に表示されます。

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

休憩

第5回 一撃サーバー構築シェルスクリプト勉強会

コードの簡単な解説

第5回 一撃サーバー構築シェルスクリプト勉強会

コードの構成

1.さくらのクラウド スタートアップスクリプトの特殊タグ設定2.自身のhosts登録3.Movable Typeダウンロードとドキュメントルート作成4.iptables設定5.MySQLインストール+データベース作成6.nginx+FCGIインストール7.initスクリプト作成8.nginx、FCGI起動 〜 yum update+再起動

第5回 一撃サーバー構築シェルスクリプト勉強会

1. さくらのクラウド スタートアップスクリプトの特殊タグ設定

第5回 一撃サーバー構築シェルスクリプト勉強会

# @sacloud-once

スタートアップスクリプトの動作

サーバ作成画面でスタートアップスクリプトを選択すると、起動後のサーバ内で以下の動作が行われます。

1.起動時、/etc/rc.localが/root/.sacloud-api/startup.shを実行2.startup.shが、「スタートアップスクリプト」で指定したスクリプト(“/root/.sacloud-

api/notes/スタートアップスクリプトID“に配置)を実行3.スクリプトが実行され、ログが”/root/.sacloud-api/notes/スタートアップスクリプ

トID.log”に出力される4.各スクリプトが正しく(終了コードが”0″)終了すると、”/root/.sacloud-

api/notes/スタートアップスクリプトID.done”という名前の空ファイルを作成(このファイルが存在すると@sacloud-once を指定したスクリプトは実行されない)

http://cloud-news.sakura.ad.jp/startup-script/ より

第5回 一撃サーバー構築シェルスクリプト勉強会

# @sacloud-desc サーバ作成後、サーバのIPアドレスをhostsに登録してブラウザでアクセスしてください。# @sacloud-desc (このスクリプトは、CentOS6.XもしくはScientific Linux6.Xでのみ動作します)# @sacloud-desc Movable TypeダウンロードURL 入力例: https://xxxxxxxxxxxxxxxxxx/

第5回 一撃サーバー構築シェルスクリプト勉強会

# @sacloud-text required shellarg maxlen=200 durl "Movable TypeダウンロードURL"# @sacloud-password required shellarg maxlen=100 rootpw "MySQLのパスワード"DURL=@@@durl@@@ROOTPW=@@@rootpw@@@

第5回 一撃サーバー構築シェルスクリプト勉強会

スタートアップスクリプトの特殊タグを理解するにはhttp://cloud-news.sakura.ad.jp/startup-script/

第5回 一撃サーバー構築シェルスクリプト勉強会

2. 自身のhosts登録

第5回 一撃サーバー構築シェルスクリプト勉強会

eth0のIPアドレスをhostsに登録● IPアドレスを抜き出す# ip a show dev eth0 | egrep '(inet )' | awk '{print $2}' | sed -e 's/\/[0-9]*//g'133.242.xxx.xxx

● IPアドレスとホスト名を2タブ区切りで表示# echo $(ip a show dev eth0 | egrep '(inet )' | awk '{print $2}' | sed -e 's/\/[0-9]*//g') ${HOSTNAME} | awk '{print $1"\t""\t"$2}'133.242.xxx.xxx mt001

● あとはteeコマンドでhostsファイルに追記# cp -p /etc/hosts{,.orig}# echo $(ip a show dev eth0 | egrep '(inet )' | awk '{print $2}' | sed -e 's/\/[0-9]*//g') ${HOSTNAME} | awk '{print $1"\t""\t"$2}' | tee -a /etc/hosts

第5回 一撃サーバー構築シェルスクリプト勉強会

3. Movable Typeダウンロードとドキュメントルート作成

第5回 一撃サーバー構築シェルスクリプト勉強会

HOME=/rootexport HOMEmkdir -p /var/wwwmkdir -p ${HOME}/srccd ${HOME}/srcFILENAME=$(basename ${DURL} | awk 'BEGIN {FS="?"} {print $1}')curl -o ${FILENAME} ${DURL}unzip ${FILENAME}mv $(ls | grep -v zip$) /var/www/htmlcd ${HOME}

これを1つ1つコマンド叩いてみるとどうなるか?(変数のところは省略します)

第5回 一撃サーバー構築シェルスクリプト勉強会

[root@mt001 ~]# mkdir -p /var/www

[root@mt001 ~]# mkdir src

[root@mt001 ~]# cd src

[root@mt001 src]# DURL="https://〜〜〜/file_download.php/MT-6_1.zip?id=9&type=MT6"

[root@mt001 src]# FILENAME=$(basename ${DURL} | awk 'BEGIN {FS="?"} {print $1}')

[root@mt001 src]# echo $FILENAMEMT-6_1.zip

(続きます)

第5回 一撃サーバー構築シェルスクリプト勉強会

[root@mt001 src]# curl -o ${FILENAME} ${DURL}

# ll合計 17928-rw-r--r-- 1 root root 18354703 3月 4 13:27 2015 MT-6_1.zip

[root@mt001 src]# unzip ${FILENAME}

[root@mt001 src]# lsMT-6.1 MT-6_1.zip

[root@mt001 src]# ls | grep -v zip$MT-6.1

[root@mt001 src]# mv $(ls | grep -v zip$) /var/www/html

第5回 一撃サーバー構築シェルスクリプト勉強会

4. iptables設定

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

コマンド 内容ser vi ce i pt abl es s t op

i pt abl es - P I NPUT DROP 外部からのパケットはすべて拒否する

i pt abl es - P OUTPUT ACCEPT

i pt abl es - P FORWARD DROP パケット転送はすべて拒否する

i pt abl es - A I NPUT - i l o - j ACCEPT

i pt abl es - A I NPUT - p t cp - - dpor t 22 - j ACCEPT

i pt abl es - A I NPUT - p t cp - - dpor t 80 - j ACCEPT

ser vi ce i pt abl es save 設定を保存

ser vi ce i pt abl es s t ar t

chkconf i g i pt abl es on

i pt abl es 停止

自ホストから外部へのパケットはすべて許可する

l ocal hos t からのアクセスをすべて許可

i pt abl es - A I NPUT - m s t at e - - s t at e ESTABLI SHED, RELATED - j ACCEPT

内部から行ったアクセスに対する外部からの返答アクセスを許可外部からのTCP22番ポート(SSH)へのアクセスを許可外部からのTCP80番ポート(HTTP)へのアクセスを許可

i pt abl es を起動

i pt abl es をスタートアップ登録する

第5回 一撃サーバー構築シェルスクリプト勉強会

[root@mt001 ~]# iptables -L -n

Chain INPUT (policy DROP)target prot opt source destination fail2ban-SSH tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80

Chain FORWARD (policy DROP)target prot opt source destination

Chain OUTPUT (policy ACCEPT)target prot opt source destination

Chain fail2ban-SSH (1 references)target prot opt source destination RETURN all -- 0.0.0.0/0 0.0.0.0/0

5. MySQLインストール+データベース作成

第5回 一撃サーバー構築シェルスクリプト勉強会

yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm

yum -y install mysql-community-server

service mysqld startchkconfig mysqld on

MySQLコミュニティのYUMリポジトリをインストール

MySQLサーバーをインストール

MySQLサーバーを起動および自動起動設定

第5回 一撃サーバー構築シェルスクリプト勉強会

mysql -u root -e "SET PASSWORD FOR root@localhost=PASSWORD('${ROOTPW}');"

MySQLのrootパスワードを設定。 (localhost)変数「ROOTPW」はサーバー作成時に指定したもの

-eオプションをつけることでシェルを奪われない!

第5回 一撃サーバー構築シェルスクリプト勉強会

mysql -u root -p${ROOTPW} -e "SET PASSWORD FOR root@\"${HOSTNAME}\"=PASSWORD('${ROOTPW}');"

MySQLのrootパスワードを設定。 (ホスト名)

第5回 一撃サーバー構築シェルスクリプト勉強会

mysql -u root -p${ROOTPW} -e "SET PASSWORD FOR root@127.0.0.1=PASSWORD('${ROOTPW}');"

MySQLのrootパスワードを設定。 (127.0.0.1)

第5回 一撃サーバー構築シェルスクリプト勉強会

mysql -u root -p${ROOTPW} -e "SET PASSWORD FOR root@\"::1\"=PASSWORD('${ROOTPW}');"

MySQLのrootパスワードを設定。 (::1)

第5回 一撃サーバー構築シェルスクリプト勉強会

mysql -u root -p${ROOTPW} -e "delete from mysql.user where password='';"

パスワードのカラムが空のユーザーを削除する(すなわち匿名ユーザーも削除される)

第5回 一撃サーバー構築シェルスクリプト勉強会

mysql -u root -p${ROOTPW} -e 'FLUSH PRIVILEGES;'

権限テーブルを再読み込みする

第5回 一撃サーバー構築シェルスクリプト勉強会

mysql -u root -p${ROOTPW} -e "create database mt;"

データベース「mt」作成

第5回 一撃サーバー構築シェルスクリプト勉強会

[root@mt001 ~]# grep ^ROOTPW .sacloud-api/notes/〜〜〜ROOTPW='********'

変数に格納したMySQLのrootパスワードは後で確認可能

第5回 一撃サーバー構築シェルスクリプト勉強会

[root@mt001 ~]# mysql -u root -p${ROOTPW} -e "select user,password,host from mysql.user;"Warning: Using a password on the command line interface can be insecure.+------+-------------------------------------------+-----------+| user | password | host |+------+-------------------------------------------+-----------+| root | *C4AAE40CA5DC4AB9F085432AD4EB43955369AB7A | localhost || root | *C4AAE40CA5DC4AB9F085432AD4EB43955369AB7A | mt001 || root | *C4AAE40CA5DC4AB9F085432AD4EB43955369AB7A | 127.0.0.1 || root | *C4AAE40CA5DC4AB9F085432AD4EB43955369AB7A | ::1 |+------+-------------------------------------------+-----------+

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

6. nginx+FCGIインストール

第5回 一撃サーバー構築シェルスクリプト勉強会

yum -y install http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

cp -p /etc/yum.repos.d/nginx.repo /etc/yum.repos.d/nginx.repo.origsed -i 's/centos/mainline\/centos/' /etc/yum.repos.d/nginx.repo

nginxのリポジトリをインストール

nginxのリポジトリをmainlineに変更

第5回 一撃サーバー構築シェルスクリプト勉強会

yum -y install perl-DBI perl-DBD-MySQL perl-Archive-Zip perl-XML-SAX perl-XML-LibXML perl-XML-NamespaceSupport perl-Digest-SHA perl-GD gd libXpm perl-Crypt-SSLeay perl-Archive-Tar perl-IO-Zlib perl-Package-Constants ImageMagick-perl perl-Time-HiResyum -y --enablerepo=epel install perl-FCGI perl-Crypt-DSAyum -y --enablerepo=rpmforge install perl-XML-SAX-Expat perl-Imager

yum -y install nginx

perlのモジュールたちをインストール

nginxインストール

第5回 一撃サーバー構築シェルスクリプト勉強会

cp -p /etc/nginx/nginx.conf{,.orig}

sed -i "s/worker_processes[[:space:]]\+[0-9]\+/worker_processes $(cat /proc/cpuinfo | grep processor | wc -l)/g" /etc/nginx/nginx.conf

デフォルトのnginx設定ファイルをバックアップ

nginxのworker_processesをCPUのコア数に合わせる

第5回 一撃サーバー構築シェルスクリプト勉強会

# cat /proc/cpuinfo | grep ^processorprocessor : 0processor : 1processor : 2processor : 3

# diff /etc/nginx/nginx.conf{,.orig}3c3< worker_processes 4;---> worker_processes 1;

第5回 一撃サーバー構築シェルスクリプト勉強会

mkdir -p /etc/nginx/conf.d/BACKUPmv /etc/nginx/conf.d/*.conf /etc/nginx/conf.d/BACKUP/

cat << _EOL_ | tee /etc/nginx/conf.d/000_MT.confserver {... (略)}_EOL_

デフォルトのnginx設定ファイルをバックアップ

nginx設定ファイルをヒアドキュメントで生成

第5回 一撃サーバー構築シェルスクリプト勉強会

nginx設定 (抜粋)

server { listen 80;

server_name ${HOSTNAME};

location / { root /var/www/html; index index.html index.htm index.cgi index.pl; }

error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; }...}

ヒアドキュメントの中でHOSTNAME変数が展開される

indexの順序に注意

※ .cgiと.plを後ろにしないとmt.cgiが優先されてしまう

第5回 一撃サーバー構築シェルスクリプト勉強会

nginx設定 (抜粋)

location ~ .pl$ { gzip off; root /var/www/html; include /etc/nginx/fastcgi_params; fastcgi_pass 127.0.0.1:8999; fastcgi_index index.pl; fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; } location ~ .cgi$ { gzip off; root /var/www/html; include /etc/nginx/fastcgi_params; fastcgi_pass 127.0.0.1:8999; fastcgi_index index.cgi; fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; }

ヒアドキュメントの中で変数を展開しないようエスケープしている

第5回 一撃サーバー構築シェルスクリプト勉強会

7. initスクリプト作成

第5回 一撃サーバー構築シェルスクリプト勉強会

nginx+perl-fastcgi 起動の仕組み

● fastcgi-wrapper.pl と perl-fastcgi は www.linode.com からダウンロードする

● perl-fastcgi はダウンロード後、数カ所の修正を行う参考: https://www.linode.com/docs/websites/nginx/nginx-and-perlfastcgi-on-centos-5

nginxperl-fastcgi

/etc/rc.d/init.d/nginx から起動/etc/rc.d/init.d/perl-fastcgi から fastcgi-wrapper.pl を起動

第5回 一撃サーバー構築シェルスクリプト勉強会

fastcgi-wrapper.pl 入手

curl -L -o /usr/bin/fastcgi-wrapper.pl http://www.linode.com/docs/assets/642-fastcgi-wrapper.sh

chmod 700 /usr/bin/fastcgi-wrapper.pl

第5回 一撃サーバー構築シェルスクリプト勉強会

perl-fastcgi 入手

PERLFCGIDAEMON=/etc/rc.d/init.d/perl-fastcgicurl -L -o ${PERLFCGIDAEMON} http://www.linode.com/docs/assets/641-init-rpm.sh

(中略)

chmod 700 ${PERLFCGIDAEMON}

※ 「中略 (sedでinitスクリプトの修正)」の部分は休憩後に解説します

第5回 一撃サーバー構築シェルスクリプト勉強会

き ゅ う け

第5回 一撃サーバー構築シェルスクリプト勉強会

サーバーにログインしてtmpディレクトリを作り、実際にsedでどう置換されるのかを見てみましょう。

# mkdir -p ${HOME}/tmp# cd $_

# PERLFCGIDAEMON=./perl-fastcgi# curl -L -o ${PERLFCGIDAEMON} http://www.linode.com/docs/assets/641-init-rpm.sh# cp -p ${PERLFCGIDAEMON} ${PERLFCGIDAEMON}.orig

第5回 一撃サーバー構築シェルスクリプト勉強会

sed -i '/^#[[:space:]][ndpc][gerio]*/d' ${PERLFCGIDAEMON}

行頭のdescriptionを修正するために一旦削除する

第5回 一撃サーバー構築シェルスクリプト勉強会

[Before]

# cat ${PERLFCGIDAEMON} | egrep '(^#[[:space:]][ndpc][gerio]*)'# nginx – this script starts and stops the nginx daemon# chkconfig: - 85 15# description: Nginx is an HTTP(S) server, HTTP(S) reverse \# proxy and IMAP/POP3 proxy server# processname: nginx# config: /opt/nginx/conf/nginx.conf# pidfile: /opt/nginx/logs/nginx.pid

第5回 一撃サーバー構築シェルスクリプト勉強会

[After]

# sed -i '/^#[[:space:]][ndpc][gerio]*/d' ${PERLFCGIDAEMON}

# cat ${PERLFCGIDAEMON} | egrep '(^#[[:space:]][ndpc][gerio]*)'

何も表示されない

第5回 一撃サーバー構築シェルスクリプト勉強会

とは言えdescriptionがないのも不都合なので追加する(たまたま2行目と3行目に空のコメントが残ったのでこれを利用する)

sed -i '2s/^#$/# perl-fastcgi/' ${PERLFCGIDAEMON}sed -i '3s/^#$/# description: this script starts and stops the perl-fastcgi daemon/' ${PERLFCGIDAEMON}

第5回 一撃サーバー構築シェルスクリプト勉強会

[After]

# sed -i '2s/^#$/# perl-fastcgi/' ${PERLFCGIDAEMON}# sed -i '3s/^#$/# description: this script starts and stops the perl-fastcgi daemon/' ${PERLFCGIDAEMON}

# cat ${PERLFCGIDAEMON} | egrep '(^#[[:space:]][ndpc][gerio]*)'# perl-fastcgi# description: this script starts and stops the perl-fastcgi daemon

第5回 一撃サーバー構築シェルスクリプト勉強会

3行目 descriptionの直下に「# chkconfig: - 85 15」を追加する

sed -i "3a # chkconfig: - 85 15" ${PERLFCGIDAEMON}

第5回 一撃サーバー構築シェルスクリプト勉強会

[After]

# sed -i "3a # chkconfig: - 85 15" ${PERLFCGIDAEMON}

# cat ${PERLFCGIDAEMON} | egrep '(^#[[:space:]][ndpc][gerio]*)'# perl-fastcgi# description: this script starts and stops the perl-fastcgi daemon# chkconfig: - 85 15

第5回 一撃サーバー構築シェルスクリプト勉強会

「nginx="/opt/nginx/sbin/nginx"」を「perlfastcgi="/usr/bin/fastcgi-wrapper.pl"」に直す

sed -i s/^nginx=[\"\/[:alnum:]]*/perlfastcgi='"\/usr\/bin\/fastcgi-wrapper.pl"'/ ${PERLFCGIDAEMON}

第5回 一撃サーバー構築シェルスクリプト勉強会

[Before]

# cat ${PERLFCGIDAEMON} | egrep '^(nginx=|perlfastcgi)'

nginx="/opt/nginx/sbin/nginx"

第5回 一撃サーバー構築シェルスクリプト勉強会

[After]

# sed -i s/^nginx=[\"\/[:alnum:]]*/perlfastcgi='"\/usr\/bin\/fastcgi-wrapper.pl"'/ ${PERLFCGIDAEMON}

# cat ${PERLFCGIDAEMON} | egrep '^(nginx=|perlfastcgi)'

perlfastcgi="/usr/bin/fastcgi-wrapper.pl"

変数名がnginxからperlfastcgiに、変数の中身も /opt/nginx/sbin/nginx から /usr/bin/fastcgi-wrapper.pl に変わった

第5回 一撃サーバー構築シェルスクリプト勉強会

「prog=$(basename $nginx)」を「prog=$(basename perl)」に直す

sed -i 's/prog=\$(basename \$nginx)/prog=\$\(basename perl\)/' ${PERLFCGIDAEMON}

第5回 一撃サーバー構築シェルスクリプト勉強会

[Before]

# cat ${PERLFCGIDAEMON} | egrep '^(prog=)'

prog=$(basename $nginx)

第5回 一撃サーバー構築シェルスクリプト勉強会

[After]

# sed -i 's/prog=\$(basename \$nginx)/prog=\$\(basename perl\)/' ${PERLFCGIDAEMON}

# cat ${PERLFCGIDAEMON} | egrep '^(prog=)'

prog=$(basename perl)

prog変数の中身がnginxからperlに変わった

第5回 一撃サーバー構築シェルスクリプト勉強会

「NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"」で始まる行を削除する

sed -i s/^NGINX_[[:alnum:]_=\"\\./]*// ${PERLFCGIDAEMON}

第5回 一撃サーバー構築シェルスクリプト勉強会

[Before]

# cat ${PERLFCGIDAEMON} | egrep '(^NGINX_[[:alnum:]_=\"\\./]*)'

NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"

第5回 一撃サーバー構築シェルスクリプト勉強会

[After]# sed -i s/^NGINX_[[:alnum:]_=\"\\./]*// ${PERLFCGIDAEMON}

# cat ${PERLFCGIDAEMON} | egrep '(^NGINX_[[:alnum:]_=\"\\./]*)'

何も表示されない

第5回 一撃サーバー構築シェルスクリプト勉強会

sed -i 's/lockfile=\/var\/lock\/subsys\/nginx/lockfile\=\/var\/lock\/subsys\/perl-fastcgi/' ${PERLFCGIDAEMON}

「lockfile=/var/lock/subsys/nginx」を「lockfile=/var/lock/subsys/perl-fastcgi」に直す

第5回 一撃サーバー構築シェルスクリプト勉強会

[Before]

# cat ${PERLFCGIDAEMON} | egrep '^(lockfile=)'

lockfile=/var/lock/subsys/nginx

第5回 一撃サーバー構築シェルスクリプト勉強会

[After]

# sed -i 's/lockfile=\/var\/lock\/subsys\/nginx/lockfile\=\/var\/lock\/subsys\/perl-fastcgi/' ${PERLFCGIDAEMON}

# cat ${PERLFCGIDAEMON} | egrep '^(lockfile=)'

lockfile=/var/lock/subsys/perl-fastcgi

lockfile変数の中身がnginxからperl-fastcgiに変わった

第5回 一撃サーバー構築シェルスクリプト勉強会

start関数の中の「 [ -x $nginx ] || exit 5 」 を 「 [ -x $perlfastcgi ] || exit 5 」に直す

sed -i 's/\[ -x $nginx ] || exit [0-9]/[ -x $perlfastcgi ] || exit 5/' ${PERLFCGIDAEMON}

第5回 一撃サーバー構築シェルスクリプト勉強会

[Before]

# cat ${PERLFCGIDAEMON} | egrep "^(\[ -x \\\$[np][[:alpha:]]* \] \|\| exit [0-9])"

[ -x $nginx ] || exit 5

第5回 一撃サーバー構築シェルスクリプト勉強会

[After]

# sed -i 's/\[ -x $nginx ] || exit [0-9]/[ -x $perlfastcgi ] || exit 5/' ${PERLFCGIDAEMON}

# cat ${PERLFCGIDAEMON} | egrep "^(\[ -x \\\$[np][[:alpha:]]* \] \|\| exit [0-9])"

[ -x $perlfastcgi ] || exit 5

testコマンドの条件式が、「もしnginxが実行可でなければ」から「もしperl-fcgiが実行可でなければ」に書き換わった※ どうでもいいですが、この条件式を日本語にすると不自然ですよね? [ ! -x $perlfastcgi ] && exit 5 のほうがシックリくる。。。ほんとどうでもいいんですが。

第5回 一撃サーバー構築シェルスクリプト勉強会

start関数の中の 「 [ -f $NGINX_CONF_FILE ] || exit 6 」 を削除する

sed -i 's/\[ -f $NGINX_CONF_FILE ] || exit [0-9]//' ${PERLFCGIDAEMON}

第5回 一撃サーバー構築シェルスクリプト勉強会

[Before]

# cat ${PERLFCGIDAEMON} | egrep "^(\[ -f \\\$NGINX_CONF_FILE \] \|\| exit [0-9])"

[ -f $NGINX_CONF_FILE ] || exit 6

第5回 一撃サーバー構築シェルスクリプト勉強会

[After]

# sed -i 's/\[ -f $NGINX_CONF_FILE ] || exit [0-9]//' ${PERLFCGIDAEMON}

# cat ${PERLFCGIDAEMON} | egrep "^(\[ -f \\\$NGINX_CONF_FILE \] \|\| exit [0-9])"

何も表示されない

第5回 一撃サーバー構築シェルスクリプト勉強会

start関数の中の「daemon $nginx -c $NGINX_CONF_FILE」を「daemon $perlfastcgi」に直す

sed -i 's/daemon $nginx -c $NGINX_CONF_FILE/daemon $perlfastcgi/' ${PERLFCGIDAEMON}

第5回 一撃サーバー構築シェルスクリプト勉強会

[Before]

# cat ${PERLFCGIDAEMON} | egrep "^(daemon)"

daemon $nginx -c $NGINX_CONF_FILE

第5回 一撃サーバー構築シェルスクリプト勉強会

[After]

# sed -i 's/daemon $nginx -c $NGINX_CONF_FILE/daemon $perlfastcgi/' ${PERLFCGIDAEMON}

# cat ${PERLFCGIDAEMON} | egrep "^(daemon)"

daemon $perlfastcgi

fastcgi-wrapper.pl を daemonとして動かすようにした

第5回 一撃サーバー構築シェルスクリプト勉強会

restart関数とreload関数の中から「configtest || return $?」を削除する

sed -i 's/configtest || return $?//g' ${PERLFCGIDAEMON}

第5回 一撃サーバー構築シェルスクリプト勉強会

[Before]

# cat ${PERLFCGIDAEMON} | egrep "(configtest \|\| return \\\$\?$)"

configtest || return $?configtest || return $?

第5回 一撃サーバー構築シェルスクリプト勉強会

[After]

# sed -i 's/configtest || return $?//g' ${PERLFCGIDAEMON}

# cat ${PERLFCGIDAEMON} | egrep "(configtest \|\| return \\\$\?$)"

何も表示されない

第5回 一撃サーバー構築シェルスクリプト勉強会

reload関数内の「killproc $nginx -HUP」を「killproc $prog -HUP」に直す -> HUPすると死んでしまうので「stop ; start」に直す

sed -i 's/killproc $nginx -HUP/stop ; start/' ${PERLFCGIDAEMON}

第5回 一撃サーバー構築シェルスクリプト勉強会

[Before]

# cat ${PERLFCGIDAEMON} | egrep "^(killproc \\\$nginx -HUP|stop ; start)"

killproc $nginx -HUP

第5回 一撃サーバー構築シェルスクリプト勉強会

[After]

# sed -i 's/killproc $nginx -HUP/stop ; start/' ${PERLFCGIDAEMON}

# cat ${PERLFCGIDAEMON} | egrep "^(killproc \\\$nginx -HUP|stop ; start)"

stop ; start

reload関数が実行されたときの動作が killproc $nginx -HUP から stop -> start に変わった

第5回 一撃サーバー構築シェルスクリプト勉強会

60〜62行目、「configtest」を関数ごと削除する

sed -i '60,62d' ${PERLFCGIDAEMON}

第5回 一撃サーバー構築シェルスクリプト勉強会

[Before]

# cat -n ${PERLFCGIDAEMON} | grep -A 2 configtest\(\)

60 configtest() { 61 $nginx -t -c $NGINX_CONF_FILE 62 }

第5回 一撃サーバー構築シェルスクリプト勉強会

[After]

# sed -i '60,62d' ${PERLFCGIDAEMON}

# cat -n ${PERLFCGIDAEMON} | grep -A 2 configtest\(\)

何も表示されない

第5回 一撃サーバー構築シェルスクリプト勉強会

case文の中で引数にrestartとconfigtestを与えたときの条件を、restartのみに変更する(configtest関数を削除したため)

sed -i 's/restart|configtest/restart/' ${PERLFCGIDAEMON}

第5回 一撃サーバー構築シェルスクリプト勉強会

[Before]

# cat ${PERLFCGIDAEMON} | egrep -A 2 '(^restart[[:alnum:]|)]*$)' | tail -n 3

restart|configtest)$1;; これを削除したい

第5回 一撃サーバー構築シェルスクリプト勉強会

[After]

# sed -i 's/restart|configtest/restart/' ${PERLFCGIDAEMON}

# cat ${PERLFCGIDAEMON} | egrep -A 2 '(^restart[[:alnum:]|)]*$)' | tail -n 3

restart)$1;; case文の引数判定がrestartと

configtestの両方だったのがrestartのみに変更された

第5回 一撃サーバー構築シェルスクリプト勉強会

95行目、Usageの行からconfigtestを削除する

sed -i "95s/|configtest//" ${PERLFCGIDAEMON}

第5回 一撃サーバー構築シェルスクリプト勉強会

[Before]

# cat -n ${PERLFCGIDAEMON} | grep Usage | grep \|configtest\}\"

95 echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"

第5回 一撃サーバー構築シェルスクリプト勉強会

[After]

# sed -i "95s/|configtest//" ${PERLFCGIDAEMON}

# cat -n ${PERLFCGIDAEMON} | grep Usage | grep \|configtest\}\"

# cat -n ${PERLFCGIDAEMON} | grep Usage

95 echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"

何も表示されない

第5回 一撃サーバー構築シェルスクリプト勉強会

8. nginx、FCGI起動 〜 yum update+再起動

第5回 一撃サーバー構築シェルスクリプト勉強会

chmod 700 ${PERLFCGIDAEMON}chkconfig --add perl-fastcgichkconfig perl-fastcgi onservice perl-fastcgi startservice nginx startchkconfig nginx onyum -y updatereboot

第5回 一撃サーバー構築シェルスクリプト勉強会

$ echo $ echo 求刑 求刑 | \| \sed -e 's/sed -e 's/求求//休休/;s//;s/刑刑//憩憩/'/'

第5回 一撃サーバー構築シェルスクリプト勉強会

Movable Type 設定

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

ウェブサイトパス は /var/www/html のまま!

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

第5回 一撃サーバー構築シェルスクリプト勉強会

お疲れ様でした

第5回 一撃サーバー構築シェルスクリプト勉強会

質疑応答

第5回 一撃サーバー構築シェルスクリプト勉強会

#!/beer/bash

top related