Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save ieee0824/6f232451e0ad38390780 to your computer and use it in GitHub Desktop.
Save ieee0824/6f232451e0ad38390780 to your computer and use it in GitHub Desktop.

ansibleを使ってうまるーんしながらサーバーを構築する

こんにちは高知工科大Advent Calendar 2015の4日目担当です.
今日はエンジニアの三大美徳である怠惰に関した内容で行こうと思います.
そもそもエンジニアの三大美徳をご存知ですか?

エンジニアの三大美徳とは?

よく言われるのがこの3つです.

  1. 怠惰
  2. 短期
  3. 傲慢

三大美徳を兼ね備えたエンジニアを絵に表すとこんな感じです.

この人何が素晴らしいかというと三大美徳の他にエンジニアの栄養源であるコーラとジャンクフードまで兼ね備えて居ます.
まぁそれは置いといてなぜこの3つが三大美徳かというとという話をしだすとそれてくるので今回は割愛します.
気になる人はここらへんを参考にしてみてください.
プログラマになること#9 三大美徳

さてさて本題に移りましょう.
今回はansibleを使ってwebサーバを立てていきたいと思います.

構成

用意するもの

  • ansible
  • 適当なサーバー1台
  • 適当なOS(今回はUbuntu使います.)
  • nginx
  • nghttp2
  • 適当なエディタ(vimでもemacsでもなんでも良いです. 自分はAtomです.)
  • めげない心(これ大事)

やること

ansibleでnginxとnghttp2をインストールしてweb serverを構築する.

ansibleのinstall

OSXは

$ brew install ansible

Ubuntuは

$ sudo apt-get install python-pip
$ sudo pip install ansible

とかで入ります.

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

nginxをインストールする設定を書く

以下の構成でディレクトリを作って下さい.

.
├── 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をインストールする設定を書く

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.keyserver.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の時があります.
頑張って仕事した後は思う存分うまるーんとして下さい.

あと, 同じことを何回もやりたくないのが怠惰という気持ちです.

そういう気持ちを大切にしてうまるなエンジニアを目指しましょう.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment