こんにちは高知工科大Advent Calendar 2015の4日目担当です.
今日はエンジニアの三大美徳である怠惰に関した内容で行こうと思います.
そもそもエンジニアの三大美徳をご存知ですか?
よく言われるのがこの3つです.
- 怠惰
- 短期
- 傲慢
三大美徳を兼ね備えたエンジニアを絵に表すとこんな感じです.
この人何が素晴らしいかというと三大美徳の他にエンジニアの栄養源であるコーラとジャンクフードまで兼ね備えて居ます.
まぁそれは置いといてなぜこの3つが三大美徳かというとという話をしだすとそれてくるので今回は割愛します.
気になる人はここらへんを参考にしてみてください.
プログラマになること#9 三大美徳
さてさて本題に移りましょう.
今回はansibleを使ってwebサーバを立てていきたいと思います.
- ansible
- 適当なサーバー1台
- 適当なOS(今回はUbuntu使います.)
- nginx
- nghttp2
- 適当なエディタ(vimでもemacsでもなんでも良いです. 自分はAtomです.)
- めげない心(これ大事)
ansibleでnginxとnghttp2をインストールしてweb serverを構築する.
OSXは
$ brew install ansible
Ubuntuは
$ sudo apt-get install python-pip
$ sudo pip install ansible
とかで入ります.
まず適当な作業ディレクトリに移動した後以下の様な構成でディレクトリを作ります.
$ tree
.
├── inventories
└── roles
inventoriesの中にターゲットとなるサーバーの情報とかを設置してrolesの中に今からサーバーに設定する仕事内容を書いていきます.
今回の対象となるサーバーはtargetでipは192.168.101.2
なのでinventoriesの中にtarget
というテキストファイルを作って中に192.168.101.2
と書いたものを作ります.
こんな感じです.
.
├── inventories
│ └── target
└── roles
中身はこうです.
$ cat inventories/target
192.168.101.2
次に一番はじめに呼び出すためのyamlを用意します.
$ tree
.
├── inventories
│ └── target
└── roles
以下の構成でディレクトリを作って下さい.
.
├── inventories
│ └── target
└── roles
└── nginx
├── files
└── tasks
作業内容を記述するためのファイルを作ります.
$ touch ./roles/nginx/tasks/main.yml
ほぼaptでインストールできるので特に各内容は無いですがこうなります.
---
- name: nginxをインストールする
apt: pkg=nginx-extras
- name: nginx-docをインストールする
apt: pkg=nginx-doc
- name: nginxをスタートする
command: /etc/init.d/nginx start
次に作ったmain.ymlを呼び出す設定を書きます.
site.ymlという名前で作ります.
作業ディレクトリ直下に作ります.
.
├── inventories
│ └── target
├── roles
│ └── nginx
│ ├── files
│ └── tasks
│ └── main.yml
└── site.yml
site.ymlの中身の設定です.
---
- name: Advent calendar
hosts: all
sudo: yes
roles:
- nginx
sudo: yes
はsudoを使う設定をonする設定です.
roles
はどの設定ファイルを呼び出すかです.
今はnginxだけですがroleが増えると増えていきます.
例を挙げるとこんな感じです.
roles:
- nginx
- hoge
- huga
site.ymlが出来上がったら実行してみましょう.
$ ansible-playbook site.yml -i inventories/target -u userName -k -K
-u
はユーザ名をしてするオプション, -k -K
はsshパスワードとsudoのパスワードを使うためのオプションです.
実行が終わったらブラウザでサーバにアクセスしてみましょう.
apacheで言うところのIt works!
に相当する画面です.
これが出てれば成功です.
簡単でしょ?
nghttp2はソースコードからビルドします.
ビルドを走らせる時結構沢山コマンドを打つことになりますがansibleでやろうとするとディレクトリが切り替わったりして大変です.
なので一度シェルスクリプトを書いて実行することにします.
以前書いたものがあるので流用することにします.
apt-get install -y \
autoconf \
automake \
autotools-dev \
libtool \
pkg-config \
zlib1g-dev \
libcunit1-dev \
libssl-dev \
libxml2-dev \
libevent-dev
apt-get install -y make
apt-get install -y g++
apt-get install -y python-dev
git clone https://github.com/tatsuhiro-t/spdylay.git
cd spdylay
apt-get install autoconf automake autotools-dev libtool pkg-config zlib1g-dev libcunit1-dev libssl-dev libxml2-dev libevent-dev
autoreconf -i
automake
autoconf
./configure
make
make install
git clone https://github.com/tatsuhiro-t/nghttp2.git
autoreconf -i
automake
autoconf
./configure
make
make install
ldconfig
nghttpx -s -f'*,443' -b127.0.0.1,80 /var/keys/server.key /var/keys/server.crt
これをinstall.sh
として保存します.
場所は, ./roles/nghttp2/tasks/install.sh
です.
さてhttp2を使うために証明書が必要です.
ここではオレオレ証明書を作って使用します.
server.key
とserver.csr
で作り./roles/nghttp2/files
に配置します.
.
├── inventories
│ └── target
├── roles
│ ├── nghttp2
│ │ ├── files
│ │ │ ├── server.crt
│ │ │ └── server.key
│ │ └── tasks
│ │ └── install.sh
│ └── nginx
│ ├── files
│ └── tasks
│ └── main.yml
└── site.yml
ここまでできたら後はnghttp2をインストールするためのtaskを書くだけです.
nghttp2のtasksにmain.ymlを作成します.
こんな感じです.
---
- name: 証明書と鍵ファイルを証明を配置するディレクトリ設置する
file: path=/var/keys state=directory owner=root group=root mode=0600
- name: 証明書を配置する
copy: src=server.crt dest=/var/keys/server.crt owner=root group=root mode=0600
- name: 証明書を配置する
copy: src=server.key dest=/var/keys/server.key owner=root group=root mode=0600
- name: install.shを実行する
script: ./roles/nghttp2/tasks/install.sh
ansibleでディレクトリを作るときはcommad
を使います.
またローカルからの転送はcopy
で行えます.
scriptの実行はscript
を使います.
script
を使うとリモートに転送せずローカルから実行することができます.
今回apt関係もshell scriptで書いていますが実際はapt
で実現したほうが良いです.
書き終わったらsite.yml
に追記します.
---
- name: Advent calendar
hosts: all
sudo: yes
roles:
- nginx
- nghttp2
さぁ先ほどと同じように実行してみましょう.
さて実行が終わったらhttpsでサーバにアクセスして下さい.
確認はHTTP/2 and SPDY indicator
などでやるといいです.
さてどうでしょうansibleでうまるーんしながらサーバーを作るというタイトルの割に手順が多かったと思います.
しかし, ansibleで一度書いておけば同じ作業を繰り返さずとも同じ構成のサーバが構築できちゃうわけです.
なので次からうまるーんと出来るようになります.
うまるちゃんもonの時があるように, エンジニアにもonの時があります.
頑張って仕事した後は思う存分うまるーんとして下さい.
あと, 同じことを何回もやりたくないのが怠惰という気持ちです.
そういう気持ちを大切にしてうまるなエンジニアを目指しましょう.