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

  • 2
    Like
  • 0
    Comment

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

image.png

やっていることはほぼ「まっさらなVPS(CentOS6)からApacheを使ってDjangoを動かすまでのメモ」ですが、多少改良しています。

動作確認

  • 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 pullgit 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

設定

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

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

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

実行

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

ユーザー作成

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

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

ここでは2つのパスワード入力を促されます。1つ目はrootのパスワードです。もう1つは自分で設定する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

デプロイ

環境構築とともにデプロイは終わっていますが、デプロイだけのPlaybookも用意しました。gitに新しいコードが上がっているとgit pullpython manage.py migratepython 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

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

s_3.png
s_4.png