まっさらなVPS（CentOS6）からApacheを使ってDjangoを動かすまでのPlaybook


最近AnsibleでPlaybookを書く練習をしています。自分の練習がてら、とりあえずサーバーでApacheをつかってDjangoを動かしてみたい人向けのPlaybookを書いてみました。このサンプルを使うと以下の図のような非常に小さなwebシステムが構築されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/14918/9c7f1645-33be-7a13-ec4a-a824ad0954f3.png "image.png")

やっていることはほぼ「[まっさらなVPS（CentOS6）からApacheを使ってDjangoを動かすまでのメモ](http://qiita.com/itkr/items/fef0978f808f36449f1f)」ですが、多少改良しています。

## 動作確認

- CentOS 6.8 (さくらのVPS)
- CentOS 6.7 (vagrant: bento/centos-6.7)

## クイックスタート

```
git clone https://github.com/itkr/simpledjango.git
cd simpledjango/ansible

vi hosts
# (編集)

vi vars/global.yml
# (編集)

ansible-playbook create_user.yml -u root --ask-pass
ansible-playbook make_centos.yml --ask-become-pass
```

## このサンプルの注意

このサンプルはMySQLをとても弱いパスワードでどんなホストからもアクセスできるようになっているなど、セキュリティ的にはあまり良くないです。あくまでサンプルということでご理解ください。

## サンプルを動かすために事前に必要なもの

### Ansible

このPlaybookはAnsibleのために書かれたので、Ansibleが必要です。バージョンはあまりに古いものでなければ大丈夫だと思います。

インストール例

```
pip install ansible
```

### SSHでアクセスするための鍵

AnsibleはSSHを使うため事前に鍵ファイルが必要です。また、playbook内で`git pull`や`git clone`する際にもサーバー内でこの鍵を使います。

生成例

```
ssh-keygen -t rsa
```

### passlib

AnsibleでOSユーザーのパスワードを扱う際、ハッシュ化したパスワードを指定しなければなりませんが、今回はそのハッシュ化をPlaybook内で実行しています。その際に`passlib`というライブラリが必要です。

インストール例

```
pip install passlib
```

### サーバーのrootユーザーのパスワード

このPlaybookではOSのユーザーも作成しますが、一番初めはrootでパスワードログインできることを前提としています。（すでに作業用ユーザーが作成されている場合を除く）

Vagrantを使う場合は"vagrant"、VPSなどを使う場合は契約時やOSインストール時に設定したパスワードや業者に貰ったパスワードです。

```
ssh root@(host name)
```

でパスワードログインできていれば大丈夫です。

## サンプルの場所と準備

サンプルはgithubに上げました。
https://github.com/itkr/simpledjango

### ソースの取得

設定ファイルなどがあるためフォークした方がいいと思いますが、そのままでも使えます。プロジェクトディレクトリ直下にサンプルのVagrantfileも置きました。

```
git clone https://github.com/itkr/simpledjango.git
```

### 設定

２箇所設定する必要があります。

１つ目はインベントリファイルであるansible/hosts内のホストです。webとdbという２つのグループがあります。webはアプリケーションサーバーなどと言われるものでApacheを使ってアプリケーションのロジックを動かします。dbはデータベースサーバーで、今回はここでMySQLを動かしています。両者は同じホストでも可能です。

２つ目はansible/vars/global.ymlのそれぞれの変数です。一応`db.host`以外はそのままでも動くようになっています。

## 実行

設定が終わっていれば幾つかのコマンドで環境構築からデプロイまでが完了します。

### ユーザー作成

```
ansible-playbook create_user.yml -u root --ask-pass
```

これはOSのユーザーを作成するためのPlaybookの実行です。これを実行するとwebappというユーザーが作成されます。なお、このユーザーは`sudo`することでほぼrootと同じことができるユーザーなので、あくまでサンプルだと考えてください。

ここでは２つのパスワード入力を促されます。１つ目はrootのパスワードです。もう１つは自分で設定するwebappのパスワードです。

これを実行すればwebappユーザーが作成され、以下のようにSSHでログインできるようになっているはずです。

```
ssh webapp@(host name)
```

### 環境構築とデプロイ

```
ansible-playbook make_centos.yml --ask-become-pass
```

これは環境構築からデプロイまでを実行するPlaybookです。実行時に聞かれるパスワードは、ユーザー作成時に設定したwebappのパスワードです。

基本的にはPlaybookを見れば何をやっているかはわかると思いますが、少し特殊なことをやっているのはDjangoのsettingsファイル(production.py)をgitの管理下から外し、デプロイ時に動的に生成しているところです。こうした理由は、パスワードなどをgit管理するのはあまり好ましくないので、ローカルに置いてあるパスワードをデプロイ時に指定できるようにしたかったためです。（このサンプルではansible/vars/global.ymlがgit管理されていますが、これをgitから外すイメージです）

これを実行すれば一通りの設定が完了します。webブラウザからアプリケーションサーバーのホストにアクセスするとサイトが表示されるはずです。

![s_1.png](https://qiita-image-store.s3.amazonaws.com/0/14918/d76be351-6ce9-de9d-12a9-09342c4941d0.png "s_1.png")



### デプロイ

環境構築とともにデプロイは終わっていますが、デプロイだけのPlaybookも用意しました。gitに新しいコードが上がっていると`git pull`・`python manage.py migrate`・`python manage.py loaddata`などを行ってくれます。実行時にパスワードなどは必要ありません。

```
ansible-playbook make_centos.yml
```

## その他の動作テスト

環境構築時にactivate_projectname.shといったファイルをサーバーのホームディレクトリに設置しました。

```activate.sh
#!/bin/sh

export DJANGO_SETTINGS_MODULE='settings.production'
source /home/webapp/.virtualenvs/simpledjango/bin/activate
cd /home/webapp/simpledjango
```

これはサーバーに入っての作業をやりやすくするためのスクリプトです。サーバーに入ってこのスクリプトを経由してDjangoの管理ユーザーを作ってみます。

```
ssh webapp@(host name)
source activate_simpledjango.sh
./manage.py createsuperuser
```

あとは対話的に入力するとDjangoの管理ユーザーが作成されます。サンプルページのPHOTOSの下のdatabaseへのリンクから管理画面に入ることができます。

![s_2.png](https://qiita-image-store.s3.amazonaws.com/0/14918/8f0b19ee-743e-d2ba-3730-47dae9abbd57.png "s_2.png")

試しにPhotosの"Title 1"を"A Dog"変更してみると、サンプルページのタイトルも変わっていることがわかります。

![s_3.png](https://qiita-image-store.s3.amazonaws.com/0/14918/a2cbd12f-cd26-22de-f77d-45fbb7c2439c.png "s_3.png")
![s_4.png](https://qiita-image-store.s3.amazonaws.com/0/14918/0fe5f47b-8611-d0cb-2a79-c1238b4b08c8.png "s_4.png")