ichigeki-mt 2015/03/14

161
第5回 一撃サーバー構築シェルスクリプト勉強会 USP友の会 @nullpopopo 2015/03/14

Upload: yasutaka-hamada

Post on 19-Jul-2015

1.127 views

Category:

Internet


1 download

TRANSCRIPT

Page 1: ICHIGEKI-MT 2015/03/14

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

USP友の会@nullpopopo

2015/03/14

Page 2: ICHIGEKI-MT 2015/03/14

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

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

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

Page 3: ICHIGEKI-MT 2015/03/14

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

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

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

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

Page 4: ICHIGEKI-MT 2015/03/14

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

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

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

Page 5: ICHIGEKI-MT 2015/03/14

[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回 一撃サーバー構築シェルスクリプト勉強会

Page 6: ICHIGEKI-MT 2015/03/14

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

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

Page 7: ICHIGEKI-MT 2015/03/14

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

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

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

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

Page 8: ICHIGEKI-MT 2015/03/14

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

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

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

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

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

Page 9: ICHIGEKI-MT 2015/03/14

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

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

Page 10: ICHIGEKI-MT 2015/03/14

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

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

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

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

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

Page 11: ICHIGEKI-MT 2015/03/14

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

今回のテーマは...

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

Page 12: ICHIGEKI-MT 2015/03/14

Movable Typeとは

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

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

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

Page 13: ICHIGEKI-MT 2015/03/14

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

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

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

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

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

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

Page 14: ICHIGEKI-MT 2015/03/14

使用しているコマンド

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

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

Page 15: ICHIGEKI-MT 2015/03/14

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

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

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

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

Page 16: ICHIGEKI-MT 2015/03/14

設定ファイルの生成

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

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

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

Page 17: ICHIGEKI-MT 2015/03/14

本日やること

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

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

Page 18: ICHIGEKI-MT 2015/03/14

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

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

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

Page 19: ICHIGEKI-MT 2015/03/14

下へスクロール

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

Page 20: ICHIGEKI-MT 2015/03/14

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

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

Page 21: ICHIGEKI-MT 2015/03/14

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

Page 22: ICHIGEKI-MT 2015/03/14

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

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

Page 23: ICHIGEKI-MT 2015/03/14

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

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

Page 24: ICHIGEKI-MT 2015/03/14

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

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

Page 25: ICHIGEKI-MT 2015/03/14

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回 一撃サーバー構築シェルスクリプト勉強会

Page 26: ICHIGEKI-MT 2015/03/14

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

Demo

Page 27: ICHIGEKI-MT 2015/03/14

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

Page 28: ICHIGEKI-MT 2015/03/14

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

Page 29: ICHIGEKI-MT 2015/03/14

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

Page 30: ICHIGEKI-MT 2015/03/14

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

Page 31: ICHIGEKI-MT 2015/03/14

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

Page 32: ICHIGEKI-MT 2015/03/14

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

Page 33: ICHIGEKI-MT 2015/03/14

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

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

Page 34: ICHIGEKI-MT 2015/03/14

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

Page 35: ICHIGEKI-MT 2015/03/14

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

を入力する

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

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

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

Page 36: ICHIGEKI-MT 2015/03/14

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

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

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

Page 37: ICHIGEKI-MT 2015/03/14

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

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

Page 38: ICHIGEKI-MT 2015/03/14

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

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

Page 39: ICHIGEKI-MT 2015/03/14

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

Page 40: ICHIGEKI-MT 2015/03/14

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

Page 41: ICHIGEKI-MT 2015/03/14

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

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

Page 42: ICHIGEKI-MT 2015/03/14

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

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

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

Page 43: ICHIGEKI-MT 2015/03/14

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

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

Page 44: ICHIGEKI-MT 2015/03/14

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

Page 45: ICHIGEKI-MT 2015/03/14

休憩

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

Page 46: ICHIGEKI-MT 2015/03/14

コードの簡単な解説

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

Page 47: ICHIGEKI-MT 2015/03/14

コードの構成

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

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

Page 48: ICHIGEKI-MT 2015/03/14

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

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

Page 49: ICHIGEKI-MT 2015/03/14

# @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回 一撃サーバー構築シェルスクリプト勉強会

Page 50: ICHIGEKI-MT 2015/03/14

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

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

Page 51: ICHIGEKI-MT 2015/03/14

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

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

Page 52: ICHIGEKI-MT 2015/03/14

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

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

Page 53: ICHIGEKI-MT 2015/03/14

2. 自身のhosts登録

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

Page 54: ICHIGEKI-MT 2015/03/14

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回 一撃サーバー構築シェルスクリプト勉強会

Page 55: ICHIGEKI-MT 2015/03/14

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

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

Page 56: ICHIGEKI-MT 2015/03/14

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回 一撃サーバー構築シェルスクリプト勉強会

Page 57: ICHIGEKI-MT 2015/03/14

[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回 一撃サーバー構築シェルスクリプト勉強会

Page 58: ICHIGEKI-MT 2015/03/14

[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回 一撃サーバー構築シェルスクリプト勉強会

Page 59: ICHIGEKI-MT 2015/03/14

4. iptables設定

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

Page 60: ICHIGEKI-MT 2015/03/14

第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 をスタートアップ登録する

Page 61: ICHIGEKI-MT 2015/03/14

第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

Page 62: ICHIGEKI-MT 2015/03/14

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

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

Page 63: ICHIGEKI-MT 2015/03/14

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回 一撃サーバー構築シェルスクリプト勉強会

Page 64: ICHIGEKI-MT 2015/03/14

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

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

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

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

Page 65: ICHIGEKI-MT 2015/03/14

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

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

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

Page 66: ICHIGEKI-MT 2015/03/14

mysql -u root -p${ROOTPW} -e "SET PASSWORD FOR [email protected]=PASSWORD('${ROOTPW}');"

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

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

Page 67: ICHIGEKI-MT 2015/03/14

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

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

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

Page 68: ICHIGEKI-MT 2015/03/14

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

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

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

Page 69: ICHIGEKI-MT 2015/03/14

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

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

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

Page 70: ICHIGEKI-MT 2015/03/14

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

データベース「mt」作成

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

Page 71: ICHIGEKI-MT 2015/03/14

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

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

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

Page 72: ICHIGEKI-MT 2015/03/14

[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回 一撃サーバー構築シェルスクリプト勉強会

Page 73: ICHIGEKI-MT 2015/03/14

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

6. nginx+FCGIインストール

Page 74: ICHIGEKI-MT 2015/03/14

第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に変更

Page 75: ICHIGEKI-MT 2015/03/14

第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インストール

Page 76: ICHIGEKI-MT 2015/03/14

第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のコア数に合わせる

Page 77: ICHIGEKI-MT 2015/03/14

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

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

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

Page 78: ICHIGEKI-MT 2015/03/14

第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設定ファイルをヒアドキュメントで生成

Page 79: ICHIGEKI-MT 2015/03/14

第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が優先されてしまう

Page 80: ICHIGEKI-MT 2015/03/14

第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; }

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

Page 81: ICHIGEKI-MT 2015/03/14

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

7. initスクリプト作成

Page 82: ICHIGEKI-MT 2015/03/14

第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 を起動

Page 83: ICHIGEKI-MT 2015/03/14

第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

Page 84: ICHIGEKI-MT 2015/03/14

第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スクリプトの修正)」の部分は休憩後に解説します

Page 85: ICHIGEKI-MT 2015/03/14

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

き ゅ う け

Page 86: ICHIGEKI-MT 2015/03/14

第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

Page 87: ICHIGEKI-MT 2015/03/14

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

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

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

Page 88: ICHIGEKI-MT 2015/03/14

第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

Page 89: ICHIGEKI-MT 2015/03/14

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

[After]

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

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

何も表示されない

Page 90: ICHIGEKI-MT 2015/03/14

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

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

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

Page 91: ICHIGEKI-MT 2015/03/14

第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

Page 92: ICHIGEKI-MT 2015/03/14

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

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

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

Page 93: ICHIGEKI-MT 2015/03/14

第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

Page 94: ICHIGEKI-MT 2015/03/14

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

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

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

Page 95: ICHIGEKI-MT 2015/03/14

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

[Before]

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

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

Page 96: ICHIGEKI-MT 2015/03/14

第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 に変わった

Page 97: ICHIGEKI-MT 2015/03/14

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

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

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

Page 98: ICHIGEKI-MT 2015/03/14

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

[Before]

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

prog=$(basename $nginx)

Page 99: ICHIGEKI-MT 2015/03/14

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

[After]

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

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

prog=$(basename perl)

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

Page 100: ICHIGEKI-MT 2015/03/14

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

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

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

Page 101: ICHIGEKI-MT 2015/03/14

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

[Before]

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

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

Page 102: ICHIGEKI-MT 2015/03/14

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

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

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

何も表示されない

Page 103: ICHIGEKI-MT 2015/03/14

第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」に直す

Page 104: ICHIGEKI-MT 2015/03/14

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

[Before]

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

lockfile=/var/lock/subsys/nginx

Page 105: ICHIGEKI-MT 2015/03/14

第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に変わった

Page 106: ICHIGEKI-MT 2015/03/14

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

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

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

Page 107: ICHIGEKI-MT 2015/03/14

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

[Before]

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

[ -x $nginx ] || exit 5

Page 108: ICHIGEKI-MT 2015/03/14

第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 のほうがシックリくる。。。ほんとどうでもいいんですが。

Page 109: ICHIGEKI-MT 2015/03/14

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

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

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

Page 110: ICHIGEKI-MT 2015/03/14

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

[Before]

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

[ -f $NGINX_CONF_FILE ] || exit 6

Page 111: ICHIGEKI-MT 2015/03/14

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

[After]

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

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

何も表示されない

Page 112: ICHIGEKI-MT 2015/03/14

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

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

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

Page 113: ICHIGEKI-MT 2015/03/14

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

[Before]

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

daemon $nginx -c $NGINX_CONF_FILE

Page 114: ICHIGEKI-MT 2015/03/14

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

[After]

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

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

daemon $perlfastcgi

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

Page 115: ICHIGEKI-MT 2015/03/14

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

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

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

Page 116: ICHIGEKI-MT 2015/03/14

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

[Before]

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

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

Page 117: ICHIGEKI-MT 2015/03/14

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

[After]

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

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

何も表示されない

Page 118: ICHIGEKI-MT 2015/03/14

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

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

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

Page 119: ICHIGEKI-MT 2015/03/14

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

[Before]

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

killproc $nginx -HUP

Page 120: ICHIGEKI-MT 2015/03/14

第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 に変わった

Page 121: ICHIGEKI-MT 2015/03/14

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

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

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

Page 122: ICHIGEKI-MT 2015/03/14

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

[Before]

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

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

Page 123: ICHIGEKI-MT 2015/03/14

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

[After]

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

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

何も表示されない

Page 124: ICHIGEKI-MT 2015/03/14

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

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

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

Page 125: ICHIGEKI-MT 2015/03/14

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

[Before]

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

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

Page 126: ICHIGEKI-MT 2015/03/14

第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のみに変更された

Page 127: ICHIGEKI-MT 2015/03/14

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

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

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

Page 128: ICHIGEKI-MT 2015/03/14

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

[Before]

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

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

Page 129: ICHIGEKI-MT 2015/03/14

第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}"

何も表示されない

Page 130: ICHIGEKI-MT 2015/03/14

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

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

Page 131: ICHIGEKI-MT 2015/03/14

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

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

Page 132: ICHIGEKI-MT 2015/03/14

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

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

Page 133: ICHIGEKI-MT 2015/03/14

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

Movable Type 設定

Page 134: ICHIGEKI-MT 2015/03/14

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

Page 135: ICHIGEKI-MT 2015/03/14

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

Page 136: ICHIGEKI-MT 2015/03/14

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

Page 137: ICHIGEKI-MT 2015/03/14

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

Page 138: ICHIGEKI-MT 2015/03/14

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

Page 139: ICHIGEKI-MT 2015/03/14

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

Page 140: ICHIGEKI-MT 2015/03/14

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

Page 141: ICHIGEKI-MT 2015/03/14

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

Page 142: ICHIGEKI-MT 2015/03/14

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

Page 143: ICHIGEKI-MT 2015/03/14

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

Page 144: ICHIGEKI-MT 2015/03/14

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

Page 145: ICHIGEKI-MT 2015/03/14

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

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

Page 146: ICHIGEKI-MT 2015/03/14

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

Page 147: ICHIGEKI-MT 2015/03/14

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

Page 148: ICHIGEKI-MT 2015/03/14

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

Page 149: ICHIGEKI-MT 2015/03/14

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

Page 150: ICHIGEKI-MT 2015/03/14

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

Page 151: ICHIGEKI-MT 2015/03/14

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

Page 152: ICHIGEKI-MT 2015/03/14

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

Page 153: ICHIGEKI-MT 2015/03/14

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

Page 154: ICHIGEKI-MT 2015/03/14

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

Page 155: ICHIGEKI-MT 2015/03/14

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

Page 156: ICHIGEKI-MT 2015/03/14

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

Page 157: ICHIGEKI-MT 2015/03/14

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

Page 158: ICHIGEKI-MT 2015/03/14

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

Page 159: ICHIGEKI-MT 2015/03/14

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

お疲れ様でした

Page 160: ICHIGEKI-MT 2015/03/14

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

質疑応答

Page 161: ICHIGEKI-MT 2015/03/14

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

#!/beer/bash