【初心者向け】Pythonの環境構築と自動化について

今回は、Pythonの基本とインフラエンジニアにおけるPythonの扱い方について解説したいと思います。ただ、今回については自動化のお話は概要に触れるくらいにして、具体的に「どういう業務にはどういうプログラムが使えるか、または導入を検討できるか」といったことは別途解説記事を書こうと思っているので、よろしくお願いします。

Pythonの環境構築

まずPythonが実行できる環境を用意しましょう。以前、Dockerfileの書き方の記事で使ったものを流用して、コンテナ上にPython環境を構築します。Dockerfileに関する詳しい説明は、以下の記事をご覧ください。

Dockerfileを用いたSSH接続可能なコンテナの構築

まず、以下の内容のDockerfileをローカルに作成します。

Dockerfile
FROM almalinux:latest

RUN dnf -y update \
&& dnf install -y openssh-server which sudo pip

RUN ssh-keygen -A

RUN useradd test-user\
&& echo 'test-user:hogefuga' | chpasswd \
&& usermod --append -G wheel test-user

CMD ["/usr/sbin/sshd", "-D"]

次に以下のコマンドでDockerイメージを作成します。

Bash
docker build ./ -t my-alma-python

最後に、docker run でコンテナを立ち上げます。

Bash
docker run -d --name python-test -p 2222:22 my-alma-python

SSH接続できると思うので、以下のコマンドで作ったコンテナにSSH接続します。

Bash
ssh test-user@localhost -p 2222

SSH接続に成功し、以下のようなプロンプトが表示されれば成功です。

Bash
[test-user@da65b402068c ~]$

Dockerfileに書いてますが、一応pipとpython3があるかは確認しておきます。

Bash
[test-user@da65b402068c ~]$ which pip
/usr/bin/pip
[test-user@da65b402068c ~]$ pip --version
pip 21.3.1 from /usr/lib/python3.9/site-packages/pip (python 3.9)


[test-user@da65b402068c ~]$ which python3
/usr/bin/python3
[test-user@da65b402068c ~]$ python3 --version
Python 3.9.21

Pythonの基本

Pythonの説明記事は、様々なブログやサイトで紹介されているため、詳細についてはそちらにおまかせして、ここでは最低限Pythonを動かすために必要な事項をまとめておきます。

文字列の出力

まずは、プログラミング言語を学ぶときに最初にやる「Hello World」を出力してみましょう。Pythonでは、文字列の出力はprint関数を使います。

以下の内容を test.py として保存します。

Python
print("Hello World")

次のコマンドを実行することで、標準出力に「Hello World」が出力されます。

Bash
python3 test.py

Bash
[test-user@da65b402068c ~]$ python3 test.py
Hello World

数の四則演算

Pythonでは数の四則演算もでき、それに関する算術演算子は以下のとおりです。

x + yxとyの和
x – yxとyの差
x * yxとyの積
x ** yxのy乗
x / yxとyの商
x // yxとyの整数の範囲における商
x % yxをyで割った余り

if 文

プログラムを書いてると、しばしば条件分岐をさせたくなります。例えば、何かのコマンドの結果の返り値によって処理を分岐させたい場合とか、変数同士の計算をしてある数値以上、もしくは未満であれば特定の処理を実行したりとかです。

このような場合は、if 文を用いることで行いたい処理を実現できます。具体的なif文の書き方は以下のとおりです。

Python
if 条件式:
    処理

処理内容の左側は半角スペースが4つあり、これをインデントといいます。Pythonにおいては仕様上インデントをプログラム中で合わせる必要があり、基本的には半角スペース4つが推奨されています。詳しくは、公式ドキュメントをご覧ください。

以下は、if 文の具体例です。

Python
a = 10
if a == 10:
    print("a は 10 です。")

これは、変数 a の値が 10 であれば「a は 10 です。」と表示するプログラムです。

上記の書き方は、指定した条件に合致した場合処理をさせる書き方でしたが、合致しない場合別の条件に合致するか確認するという書き方もできます。それには以下のように書きます。

Python
if 条件式A:
    処理A
elif 条件式B:
    処理B
else:
    処理C

上記のプログラムは、以下のように処理されます。

  1. 条件式 A が成り立つか確認し、成り立つ場合は処理 A を実行。
  2. 条件式 A が成り立たない場合、条件式 B を確認。成り立つ場合は処理 B を実行。
  3. 条件式 A も条件式 B も成り立たない場合は、処理 C を実行。

elif, else を用いたプログラムの例は以下です。

Python
a = 20
if a == 10:
    print("a は 10 です。")
elif a == 20:
    print("a は 20 です。")
else:
    print("a は 10 でも 20 でもありません。")

このプログラムを実行すると、aには20が入っているので、「a は 20 です。」が出力されます。

一方、最初の変数をa = 30にすると、a == 10 および a == 20 が成り立たなくなるため、elseに分岐し、「a は 10 でも 20 でもありません。」が出力されます。

for 文

繰り返し処理で使う for 文について簡単に説明します。これは、特定の処理をあらかじめ決めた回数繰り返すというものです。Pythonでの for 文の書き方は以下のとおりです。

Python
for i in range(N):
    処理

このプログラムは、i を 0 から N-1 まで 1 ずつ増やしながら、その下に記載の処理を繰り返し実行するというものです。そのため、例えば

Python
for i in range(10):
    print(i)

と書けば、これは i を 0 から 9 まで 1 ずつ増やしながら、繰り返しprint(i)を実行するというプログラムです。そのため、これを実行すると以下のような結果を得ることができます。

Python
[test-user@da65b402068c ~]$ python3 test.py
0
1
2
3
4
5
6
7
8
9

while 文

while 文も繰り返し処理をする際に使えます。使い方は以下です。

Python
while 条件式:
    処理

上記の意味は、条件式が真である限り処理を繰り返し実行するというものです。例えば

Python
a = 0
while a < 3:
    print(a)
    a = a + 1

を考えると、これは a が3未満なら print(a) を実行し、さらに a に 1 を足したものを再度 a に代入するという処理です。時系列で追っていくと次のようになります。

  1. a に 0を代入
  2. a = 0 < 3 だから print(a) を実行し、0 + 1 = 1 を a に代入
  3. a = 1 < 3 だから print(a) を実行し、1 + 1 = 2 を a に代入
  4. a = 2 < 3 だから print(a) を実行し、2 + 1 = 3 を a に代入
  5. a = 3 < 3 ではないから、何もしないで処理を終わる。

そのため、上記プログラムを実行すると次の出力を得られます。

Python
[test-user@da65b402068c ~]$ python3 test.py
0
1
2

while 文を使う上で大事なのが、必ず処理を終わるような条件式を指定することです。上記の例で言うと、while 文の中の a = a + 1 がない場合、a=0 のままになるので必ず a < 3 という条件式が成り立ち続け、無限に 0 を出力することになってしまいます。このような状態を無限ループといいますが、while 文を使う上ではこのような無限ループは回避する必要があります。

Pythonを使った運用の自動化・効率化

ここではインフラエンジニアがどのような場面でPythonを使うかを説明します。

ログの解析

まず挙げられるのが、各種ミドルウェアのログ解析です。例えば、Apache の access_log を解析して、アクセスが多いIPアドレスの TOP 5 を知りたいとします。このような場合は、以下のプログラムを用いると実現することができます。

Python
import pandas as pd

columns=["IP","Datetime","method","status","URL"]
df = pd.read_csv('access_log',delimiter=' ',names=columns)

ip_count=df['IP'].value_counts()
print(ip_count.head(5))

詳細は割愛しますが、上記プログラムは pandas というライブラリを使用して、カレントディレクトリにある access_log 内のIPアドレスを集計しています。

上記プログラムを実行すると、以下の結果を得ます。

Bash
$ python3 pandas_test.py
IP
172.17.0.x    275
172.17.2.x      4
172.17.0.x      4
172.17.0.x      3
172.17.3.x      3
Name: count, dtype: int64

右端の数字が、IPアドレスが出現した回数になります。このような解析を行うことで、例えばWebページの応答が遅い場合の原因究明につながったりします。実際、access_logを見る場合だと、普段アクセスがないような海外のIPアドレス帯からのログが大量にあった場合、DDos攻撃されている可能性があるため、該当のIPアドレスからの通信を一時的に遮断することができます。

障害対応の自動化

特定の条件で自動的にPythonプログラムを実行するように設定しておけば、障害対応の自動化が実現できます。例えば、特定のプロセスが停止した場合、自動でプロセスを起動したり、動作が不安定な場合自動でサーバ再起動をかけたりと言うことが可能です。

監視しているサーバが少数の場合は、障害が発生したら手動で対応するというのも一つの手ではありますが、数百台、数千台のマシンを監視している場合は手動で対応するのには現実的に不可能になります。

インフラの構成管理

サーバの設定やネットワーク機器の設定を手動でやると、どうしても誤りが発生してしまいます。そのような場合、Pythonを用いることで数百台のサーバを同じ設定で構築したり、設定を変更する必要がある場合も一気に実行できたりというメリットがあります。

特に、Pythonを用いたAnsibleというツールを用いることで、比較的容易に構築や設定変更用のコードを書くことができ、インフラのコード化を実現できます。

Ansibleについては今度このブログでも導入方法や書き方などをまとめようと思いますが、気になる方は以下の公式ドキュメントを参照ください。

Ansible ドキュメント — Ansible Documentation

まとめ

今回はPythonの基本的な書き方をまとめ、最後にインフラエンジニアとしてはどういう部分でPythonを用いるかということを書きました。

自動化はかなり奥が深く、特に目的を実現するだけではなく

  • 何をもって想定通りの設定ができたことを保証するか
  • 自動化システムの途中でエラーが起きたときどうするか
  • あとから調査ができるように、ログをどうやって残しておくか

なども考える必要があります。

もちろん、Pythonを使わずに実装できる場合もありますが、複雑な処理や大規模なシステムの管理をする上ではPythonの知識は必要不可欠になってきます。そのため、学んでおいて損はない技術の一つになります。

学習におすすめのサービス(テックアカデミー)
Pythonコース

マンツーマンのミーティングや、チャットサポート、課題のレビューなど手厚いサポートを受けながらPythonを学ぶことができます。また、独学ではなかなか難しい機械学習について学ぶことができ、データサイエンティスト、AIエンジニアの基礎が身につきます。

それではここまで読んでいただきありがとうございました!