読者の皆さん、こんにちは!
以下は、いわゆる「?」の問題を組織がどのように解決したかについての魅力的な(?)ストーリーです 「人のような展開。」 さまざまな(そしてそうではない)興味深いパッケージ(Django、Bottle、Flask、PIL、ZMQなど)が混在するメインのPython開発言語。
アプリケーションの1つの簡単な説明から始めましょう。
- ジャンゴ1.4
- MySQL
- 背景にクラウンの模倣と補助機能をサポートするセロリ
- Django管理コマンドに基づくデーモンプロセス
この全体は、CentOS 5.8 OS上のgUnicornとnginxの束の下で機能します。
詳細は以下で承認されています。
問題の本質
プロジェクトの最終段階の1つで、原則として「svn up && python manage.py syncdb && python manage.py migrate」が曲がっているという考えに驚きました。 「より最適な」アプローチの探求が始まりました。
オプション1-「宇宙の蛇」
サーバー管理に
Spacewalkを使用しているため、アプリケーションをRPMパッケージにパックするというアイデアが生まれました。 「ワンクリック」をインストールする機能が必要になり、オプションが開発に受け入れられました。
約8時間後、WTF / hrインジケーターがレッドゾーンで立ち往生したとき、もっとシンプルなものを探すことにしました。 主な理由:
- すべての依存関係はRPMにパッケージ化する必要があります
- すべてのパッケージ/ディストリビューションがこのようになっているわけではありません。
- パッケージングプロセスは、パッケージの分岐点につながります。 多くの場合、setup.pyを編集して.specファイルに正しく変換する必要があります。
- パッケージング環境自体には、比較的多くの経験が必要です。
オプション2-「店内の蛇」
2番目のオプションは、「他の人のパッケージをどのように配置しますか?」という言葉の後に表示され、PyPiのローカルコピーの検索が開始されました。 多くの放棄された将来性のないパッケージの中で、localshopが選ばれました。これはインストールのしやすさに満足しており、
このバージョンから奇妙なパッケージさえ要求しませんでした。
アプリケーションのフィッティングは比較的短時間で完了しました-必要なのはsetup.pyを追加し、そこに「左」のパッケージを指定することだけでしたが、まだ熊手を踏んでいました。
zip_safe = Falseおよび
include_package_data = Trueを明示的に指定する必要がありました。 一部のファイルはインストール中に解凍されませんでした。
Apache(まもなく置き換えられます)は、大きなパッケージをダウンロードするために
KeepAliveTimeout 300 、
SetEnv proxy-sendclおよび
ProxyTimeout 1800を指定する必要がありました。
さらに、localshopの設定プロセスは問題なく開始され、開始するのに十分でした(「クリーン」アカウントで):
cd && virtualenv venv && . venv/bin/activate && pip install localshop
~/venv/bin/localshop init && ~/venv/bin/localshop upgrade
その後、残されたのは〜/ .pipyrcを「ストア」に合わせるだけでした。
[distutils]
インデックスサーバー=ローカル
[ローカル]
ユーザー名:開発者
パスワード:parolcheg123
リポジトリ:http://cheese.example.com/simple/
その後、リリースプロセスは
python setup.py upload -r local
のバージョン番号を変更した後、
python setup.py upload -r local
に
要約されます。
最終的なアプローチ
初めて「戦闘」サーバーにアプリケーションをインストールしようとしたとき、残念なことにヒットしました。PILパッケージが必要で、GCCやlibpng-develなどのさまざまなものがクラスとして欠落していました。 それでも、PythonのRPMパッケージとさまざまな興味深い部分(MySQL-python、setuptools、PIL、ZMQ)を「ペンでアセンブル」し
て 、
Spacewalkにアップロードする必要がありました。
この認識操作(実際には、独自の投稿に依存します)の後、アプリケーション自体のインストールは終了し、プロセスを「終了」し始め、小さな問題を仕上げました。
- gUnicornの自動起動(ローカルショップ全般、特にアプリケーション用): 掘り上げたスクリプトをファイルで微調整するだけで十分です。
- 「バトル」サーバーでの「正しい」pip設定:index-url = cheese.example.com/simpleを(新規)〜produser / .pip / pip.confの[global]セクションに追加します
- これらすべてを監視システム(OpsView)に追加:引数「run_gunicorn」または「gunicorn」を使用してプロセスに新しいサービスチェックを追加し、サーバーにバインドします。
さらに、
Celeryと同様に「長期にわたる」プロセスを実行する必要がありました。 このアプリケーションでは、ZDaemonを使用することに決定しました。このスクリプトには、initスクリプトと構成ファイルが書き込まれています。
#!/ bin / bash
###開始情報の開始
#提供:our_app
#必須開始:$ all
#必須:$ all
#デフォルト開始:2 3 4 5
#デフォルト停止:0 1 6
#簡単な説明:zdaemonを介してour_appを制御します
#説明:zdaemonを介してour_appを制御
###終了情報の終了
。 /etc/rc.d/init.d/functions
。 / etc / sysconfig / network
。 〜produser / venv / bin / activate
#ネットワークが稼働していることを確認します。
["$ NETWORKING" = "no"] && exit 0
RETVAL = 0
APP_PATH =〜/ produser / app /
PYTHON =〜produser / venv / bin / python
USER = produser
start(){
cd $ APP_PATH
zdaemon -C our_app.zdconf start
zdaemon -C our_app_celery.zdconf start
}
stop(){
cd $ APP_PATH
zdaemon -C our_app.zdconf stop
zdaemon -C our_app_celery.zdconf stop
}
check_status(){
cd $ APP_PATH
zdaemon -C our_app.zdconf status
zdaemon -C our_app_celery.zdconf status
}
ケース「$ 1」
開始)
始める
;;
停止)
止まる
;;
ステータス)
check_status
;;
再起動)
止まる
始める
;;
*)
エサック
出口0
#our_app [_celery] .zdconf
<ランナー>
デーモン真
ディレクトリ/ opt / produser / app /
永遠に偽
バックオフ制限10
ユーザーproduser
#run_command->実際のコマンドまたはセロリ
プログラム/ opt / produser / venv / bin / python /opt/produser/app/manage.py run_command --settings = prod_settings
ソケット名/tmp/our_app.zdsock
</ runner>
最終結果
〜/ venv / bin / activate && pip install -U our_appをほとんど問題なく実行すると、アプリケーションの新しいバージョンとsetup.pyで指定されたすべての「左」パッケージがインストールされます。
syncdbおよび移行プロセスは引き続き処理されますが、次のとおりです。
- 「バトル」バージョンは常に知られています
- GCCなどを配置する必要はありません。 「バトル」サーバーへ
- ロールバックは簡単です
このプロセスの説明が読者の1人を啓発したことを願っています。