DjangoアプリケーションをFabric3を使ってデプロイする(pipでアップデート)

Twitterでシェア FaceBookでシェア はてなブックマークでシェア

Python - Django
2018年11月22日21:32に更新(約21日前)
2018年10月15日19:54に作成(約59日前)

旧ブログ移行記事です。

概要

CentOS7でDjangoを動かすシリーズシリーズの一つです。 Djangoアプリケーションを、CentOS7 Nginx+Gunicorn にデプロイする例です。 デプロイの実行(Fabricスクリプトを動かすマシン)は、MacもしくはLinuxを想定しています。

今回は既にサーバー上にDjangoプロジェクトがあり、このブログアプリケーションを、pipでインストールして使っているとしましょう。

ブログアプリケーションが更新されれば、それをpipでアップデートしなければなりません。 つまり、以下の作業を自動でやりたいのです。

  1. サーバーへログイン
  2. sudo pip3.6 install -U https://github.com/naritotakizawa/naritoblog/archive/master.tar.gz
  3. sudo python3.6 manage.py migrate
  4. sudo python3.6 manage.py collectstatic
  5. sudo systemctl restart naritoblog

という流れです。(naritoblogというサービス名です)

Fabric3のインストール

つい最近、Python3系(3.4以降)にもFabricが対応し、PyPIからインストールできるようになりました。しかしながらPython3対応したFabricは以前のAPIとは大幅に違います。

最新のFabricについてはまた今度書くとして、今回は旧FabricをPython3対応したフォーク版を利用することにします。

sudo pip install fabric3

~/.ssh/config ファイルの作成

~/.ssh に、configという名前でファイルを作成します。 これは、sshでの接続をする際に利用されます。

元々は、こんな長ったらしいコマンドだったとして...

ssh -p 11111 -i 公開鍵 ユーザー名@サーバ0

configファイルに記述することで、以下のようにシンプルに書けるのです。

ssh blog

configファイルは、例えばこんな感じに書けます。ポート変更、公開鍵認証を使う例です。

Host blog
    HostName 153.126.216.172
    User narito
    Port 11111
    IdentitiesOnly yes
    IdentityFile ~/.ssh/blog/id_rsa

これで ssh blogでログインできるかを試しましょう。できれば大丈夫です。鍵のパスフレーズは、sshコマンド後に尋ねられます。

簡単なサンプル

では、Fabricを試します。 場所はどこでもいいのですが、今回は~/.ssh/blog内にfabfile.pyを作ります。この名前のファイルが自動で探されます。 中身をとりあえず以下のようにしましょう。

from fabric.api import *

env.hosts = ['blog']
env.use_ssh_config = True

def test():
    sudo("python3.6 -c 'import sys;print(sys.version)'")

env.hostsですが、これはconfigファイルに書いたHost名の部分で、ssh blog とした部分です。他のサーバーに同様のことをするならば、リストに追加していきましょう。use_ssh_configは、この~/.ssh/config を読むための指定です。デフォルトはFalseなので、Trueにしないと読み込んでくれません。

env.hosts = ['blog']
env.use_ssh_config = True

sudo関数は、sudoコマンドで引数の中身を実行します。sudoしなくていいなら、run関数で良いです。

def test():
    sudo("python3.6 -c 'import sys;print(sys.version)'")

~/.ssh/blog に移動し(fabfile.pyと同じ階層ということです)、fab test とすることで実行されます。fab 関数名という書式ですね。 実行結果を見ると、よく動いているように見えます。

[blog] Executing task 'test'
[blog] sudo: python3.6 -c 'import sys;print(sys.version)'
[blog] Login password for 'you': 
[blog] out: sudo password:
[blog] out: 3.6.3 (default, Jan  4 2018, 16:40:53) 
[blog] out: [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]
[blog] out: 


Done.
Disconnecting from ホスト名.ポート... done.

configファイルを使わないバージョン

以下のように、簡単に設定できます。

from fabric.api import *

env.hosts = ['153.126.216.172']
env.user = 'narito'
env.port = 11111
env.key_filename = 'id_rsa'

def test():
    sudo("python3.6 -c 'import sys;print(sys.version)'")

実際にpipでアップデートする

実際のデプロイも簡単です! pipして、cdで移動して、migrateとcollectstatic、そしてrestartです。 with cd(パス) とすることで、移動ができます。

def update_blog():
    sudo("python3.6 -m pip install -U https://github.com/naritotakizawa/naritoblog/archive/master.tar.gz")
    with cd('/home/narito/naritoblog'):
        sudo('python3.6 manage.py migrate')
        sudo('python3.6 manage.py collectstatic')
    sudo("systemctl restart naritoblog")

collectstaticはyesかnoかを求められますが、これは実行側のコンソールに表示がされます。

[blog] sudo: python3.6 manage.py collectstatic
[blog] out: sudo password:
[blog] out: 
[blog] out: You have requested to collect static files at the destination
[blog] out: location as specified in your settings.
[blog] out: 
[blog] out: This will overwrite existing files!
[blog] out: Are you sure you want to do this?
[blog] out: 
[blog] out: Type 'yes' to continue, or 'no' to cancel: yes←これは私が入力した
[blog] out: 
[blog] out: 0 static files copied, 122 unmodified.
[blog] out: 

[blog] sudo: systemctl restart gunicorn
[blog] out: sudo password:
[blog] out: 

Done.
Disconnecting from ホスト名.ポート... done.
Twitterでシェア FaceBookでシェア はてなブックマークでシェア

記事にコメントする