以下は、いわゆる「?」の問題を組織がどのように解決したかについての魅力的な(?)ストーリーです 「人のような展開。」 さまざまな(そしてそうではない)興味深いパッケージ(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人を啓発したことを願っています。