Python学習【365日チャレンジ!】259日目のマスターU(@Udemy11)です。
人は自分が見たいものしか見ない
というカエサルの有名な言葉がありますが、最近のアメリカ大統領選を見ていると、ほんとそのとおりだなと思います。
ある種の宗教的な様相を表している感じがしないこともないですが、大半のアメリカ人が自分が見たいと思うものをそれぞれの候補に見いだしているのかもしれません。
とはいっても、トランプ大統領以外だったらだれでもいいと思っている人がかなり多いのは間違いないでしょう。
どうなるんでしょうね。
それでは今日もPython学習を始めましょう。
昨日の復習
昨日は、Ansibleの自動化で共通の処理を行うcommonサーバーを設定する際にハマったポイントを整理しました。
学習しているPython講座の中でバージョンが最新ではなく、うまく動かなかったりするため、Q&Aやネットで調べて解決する必要がありました。
詳しくは昨日の記事をごらんください。
今日は、昨日の続きでserver2のwebserverの初期設定を行うコードを書いていきます。
ファイル構造
webserver
の設定ファイルはcommon
より少し多くなります。
ansible_project
> roles
> webserver
の中に上記のようなフォルダ階層にして、ファイルを作成します。
設定するファイルを順番にみていきましょう
hello.py
files
フォルダの中に作成するhello.py
はFlaskのアプリケーションとなるので、Fabricのときに作成したファイルをそのまま使います。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello world'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
tasks/main.yml
task
フォルダの中に作るのは、main.yml
とinstall-app.yml
です。
install-app.yml
は、main.yml
から読み込まれるファイルになりますので、まずはmain.yml
の中身をみていきましょう
---
- include_tasks: install-app.yml
...
install_app.yml
を読み込むだけの内容ですね。
順番では、次にinstall_app.yml
ですが、先にvars
フォルダの中のmain.yml
を書いていきます。
vars/main.yml
このmain.yml
は、次に書くapp.conf.j2
とinstall-app.yml
から読み込まれる変数を指定します。
---
server_ip: 0.0.0.0
server_port: 5000
app_name: hello
app_dir: /root/work
...
サーバーIPとポート、アプリケーションの名前と保存先のディレクトリを定義しています。
次に、templates/app.conf.j2
を作成します。
app.conf.j2
j2
は、jinja2のファイルで、jinja2はpythonのweb開発使われているテンプレートエンジンライブラリです。
設定ファイル(vars/main.yml
)に記述した変数を、{{}}
で囲んで読み込んで活用することができます。
[program:{{ app_name }}]
command = gunicorn --bind {{ server_ip}}:{{ server_port }} {{ app_name }}:app
directory = {{ app_dir }}
program
の名前にapp_name
、実行するコマンドにserver_ip
、server_port
、app_dir
をそれぞれ読み込んでいます。
install-app.yml
実際にインストールの作業を実行するのがinstall-app.yml
になります。
---
- name: Install WSGI HTTP server
apt:
name: gunicorn
- name: Python Framework
pip:
name: flask
- name: Create new directory
file:
path: "{{ app_dir }}"
state: directory
mode: 0755
- name: Drop app src
copy:
src: hello.py
dest: "{{ app_dir }}/hello.py"
- name: Install supervisor
apt:
name: supervisor
- name: Drop supervisord conf
template:
src: app.conf.j2
dest: /etc/supervisor/conf.d/app.conf
- name: Start supervisor
service:
name: supervisor
enabled: yes
state: restarted
...
7つの実行コードを記述しています。
3行目から5行目がgunicorn
のインストール、7行目から9行目がflask
のインストールです。
11行目から15行目でvars/main.yml
で指定したapp_dir
を指定してディレクトリを作成し、誰でも読込みと実行ができて、書込みは自分だけができるパーミッション(755)に指定しています。
17行目から20行目でhello.py
を/root/work/
にコピーします。
22行目から24行目でsupervisor
をインストールして、26行目から29行目で、jinja2ファイルを指定したディレクトリ(/etc/supervisor/conf.d/app.conf
)にコピーしています。
最後に31行目から35行目でsupervisor
をリスタートして使用できるようにしています。
次に最後のsite.yml
です。
site.yml
こちらのファイルには、common
で書いたコードに1行付け加えるだけです。
---
- hosts: webservers
roles:
- common
- webserver
...
7行目の- webserver
を付け加えて完成です。
実行結果
ここまでできれば、commonで実行したときと同じように、ansible-playbook -i inventories site.yml
を実行します。
問題なくプログラムが終了して、failed
が0になっています。
本来なら、これでブラウザーからlocalhost:8002
にアクセスすれば、hello.py
で定義されたHello world
と表示されるはずなのですが、どうにも後にもうまくいきませんでした。
同じような状況の方が質問されていたので、同じように対処して見るのですが、どうにも後にもうまくいかず、最終的にインストールしているOSのubuntu
のバグで表示されないような感じでした。
まとめ
今回も問題を解決しようと、あれをやったりこれをやったりしたのですが、最終的に解決には至りませんでした。
ただ、前回easy_install
でpip
のインストールに失敗していたので、今回はすでにインストールしているpipを使って、flask
をインストールしてみたらうまくいったので、少しは成長したな〜と勝手に自己満足してしまいました。
とはいっても、自動化で立ち上げたサーバーに表示されないという問題が残っているので、解決方法を探りたいと思いますが、今日はすでにオーバーヒート状態なので、ここまでにしておきます。
ということで、明日もGood Python!