Posted at

インフラ系エンジニアが唯一覚えるべきPythonの使い方

ごめんなさい、タイトル盛りました。

他のインタプリタ系言語も大体同じようにコマンドをアドホックに実行できるけれど、Pythonも標準ライブラリを組み合わせることでかなり便利に使うことができます。


TL;DR

Pythonを使ってコマンド1発でwebサーバを動作させます。


Python3

$ python3 -m http.server 12345


あるいは


Python2

$ python2 -m SimpleHTTPServer 12345



任意のポートでwebサーバを起動


何がうれしいのか?

VMやネットワークを構築して、まだDBやアプリケーションサーバなどが用意されていない状態で、iptablesやネットワーク機器の各種ルーティングやポート毎のフィルタリング・ロードバランサ設定が正しく動作しているかの確認、どうしていますか?

Pythonがあれば単体(標準ライブラリ)でwebサーバを任意のポートで起動できるので、疑似サーバとして「リモートからのTCP疎通」を簡単に確認できます。(リモートからは使用するポートでcurlすれば疎通確認できる)

Pythonと言っても、プログラミングする必要はありません。


  • コーディング不要

  • 設定ファイル不要

  • 基本的に追加のパッケージインストール等は不要


    • Pythonインタプリタ(pythonコマンド)が有ればOK



  • 現在主流の3.xか、少し古い2.x(2.xは2020年1月1日でサポート終了)のどちらでもOK


    • オプションが若干異なる



  • 実行すると、カレントディレクトリをルートドキュメントとしてファイルリスト・ファイル内容をクライアントに応答


    • 簡易的にファイル配布サーバにも使える



デフォルトでリモートホストからの接続も受け付ける動作(0.0.0.0でLISTEN)するので、「ローカルからはcurlが反応あるけど、リモートからだと接続できない」のであれば、ファイヤーウォールやロードバランサの設定が怪しいはずなので確認してみましょう。


Python 3.x

zaki@chaource:~$ python3 -m http.server 12345

Serving HTTP on 0.0.0.0 port 12345 (http://0.0.0.0:12345/) ...

停止はCtrl-c


Python 2.x

zaki@chaource:~$ python2 -m SimpleHTTPServer 12345

Serving HTTP on 0.0.0.0 port 12345 ...

停止はCtrl-c


Pythonのバージョン確認方法

zaki@chaource:~$ python --version

Python 2.7.15+

--versionを付けて実行すればOK


JSONの整形

一つと言いつつもう1件

何かのAPIサーバにcurlしたりすると、JSON形式のレスポンスが改行無しでドカンと振ってきて見づらいチクショウというとき、これもPythonで簡単に整形できます。

| python -m json.tool

これを付けるだけ。

制限(?)として、正しい書式になっていないナンチャッテJSONだとあっさりエラーになるので注意。

jq使えたらそれでもいいけど。

zaki@mascarpone% curl -s -H "Authorization: Bearer $(oc whoami -t)" "http://docker-registry-default.192.168.99.103.nip.io/v2/_catalog"

{"repositories":["openshift/dotnet","openshift/httpd","openshift/jenkins","openshift/mariadb","openshift/mongodb","openshift/mysql","openshift/nginx","openshift/nodejs","openshift/perl","openshift/php","openshift/postgresql","openshift/python","openshift/redis","openshift/ruby","openshift/wildfly"]}

このような、1行に出力されて見づらいJSONレスポンスも…

zaki@mascarpone% curl -s -H "Authorization: Bearer $(oc whoami -t)" "http://docker-registry-default.192.168.99.103.nip.io/v2/_catalog" | python -m json.tool

{
"repositories": [
"openshift/dotnet",
"openshift/httpd",
"openshift/jenkins",
"openshift/mariadb",
"openshift/mongodb",
"openshift/mysql",
"openshift/nginx",
"openshift/nodejs",
"openshift/perl",
"openshift/php",
"openshift/postgresql",
"openshift/python",
"openshift/redis",
"openshift/ruby",
"openshift/wildfly"
]
}

python -m json.toolへパイプしてあげるとこのように整形される。

(ちなみに実行環境はminishift付属のdockre-registreyへDocker Registry APIを実行)