最近AnsibleでPlaybookを書く練習をしています。自分の練習がてら、とりあえずサーバーでApacheをつかってDjangoを動かしてみたい人向けのPlaybookを書いてみました。このサンプルを使うと以下の図のような非常に小さなwebシステムが構築されます。
やっていることはほぼ「まっさらな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 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
設定
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ブラウザからアプリケーションサーバーのホストにアクセスするとサイトが表示されるはずです。
デプロイ
環境構築とともにデプロイは終わっていますが、デプロイだけのPlaybookも用意しました。gitに新しいコードが上がっているとgit pull
・python manage.py migrate
・python manage.py loaddata
などを行ってくれます。実行時にパスワードなどは必要ありません。
ansible-playbook make_centos.yml
その他の動作テスト
環境構築時にactivate_projectname.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へのリンクから管理画面に入ることができます。
試しにPhotosの"Title 1"を"A Dog"変更してみると、サンプルページのタイトルも変わっていることがわかります。