Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

pyinfraを使ってWindows環境から自動構築を実行してみた

こんにちは。トシです。
本投稿はアクロクエスアドベントカレンダー12月25日の記事です。

今年も残りわずか、このアドベントカレンダーも終盤ですね。
今回は、普段、自動構築にAnsibleを利用しているのですが、pyinfraなるものがあると聞き、試してみたので紹介します。
なお、Ansibleなどのツールを利用したことがある前提で記載しています。
pyinfra.com

構築にあたっての構成管理、構築の自動化として、私はAnsibleを利用していますが、
Windows環境で、Playbookを作成し、Ansibleを利用(実行)しようと考えると、
WSL/Dockerを利用する形になるかと思います。

仕事柄、Windows環境でPlaybookを作成するケースがあり、そのまま実行したいということがありました。
pyinfraを見つけた時に、これを使えばWindows環境からでも構築を実行できるのではと思い使ってみました。

pyinfraとは?

詳細は、ドキュメント見ていただけるとよいのですが、使ってみた感触は、Ansibleと同じ感覚で利用できました。
docs.pyinfra.com

Webサイトには、
Super fast、Idempotent operationsなどの特徴が書かれていますが、

私の試した限りでは、以下のような特徴があるかな、と思いました。

  1. 対象のノードをインベントリとして定義できる、インベントリのホストやグループとしてパラメータを定義可能。
  2. Ansibleのモジュール相当のものが、Operationsという形で用意されています。
  3. パッケージをインストールして、設定を行うなど、よくある構築であればOperationを使って実行可能。
    Operations Index — pyinfra documentationに一覧があります。気になる方はチェックしてみてください。
  4. Ansibleと同様に、アドホックコマンドが使える
  5. 拡張性として、Ansibleの場合は、Pythonを書くなら、モジュールとして作成することになりますが、pyinfraの場合は、モジュールの代わりにOperationが作成できるのと、Playbook相当の処理を記述する際にPythonのライブラリが直接使えるのは便利ですね。
  6. 他にもコネクターも種類があり、便利そう。

構築時の環境

今回、構築に利用する環境は、以下になります。
PrometheusとNode Exporterをインストールしてセットアップします。
※PrometheusとNode Exporter自体は構築しただけで、pyinfraと関係しないため説明は省略します

自分の作業PCからnode01とnode02にSSH接続できる状態になっています。
Linux環境のテストに、Amazon Linuxを使っています。
途中のネットワークは省略しています。

さて、本題

pyinfraが、Ansibleと似たような形で、構築を自動化するのに利用できそうだなと思ってもらえたところで
実際に試したことを紹介します。

前提にも記載した通り、Linuxサーバ2台に、PrometheusとNode Exporterをインストールしてみました。

作成したファイルは以下のような形です。

ファイル 概要
files\prometheus.repo Prometheus/Node Exporterをパッケージインストールするのに利用したrepoファイル
files\prometheus.yml Prometheusの設定ファイル(インストールしたNodeExporterを対象にするfile_sd_configs設定を追加)
tasks\prometheus.py Prometheusをインストールする処理を記述したファイル
tasks\target.py Node Exporterをインストールする処理を記述したファイル
templates\target.yml.j2 PrometheusがNode Exporterが入ったノードをターゲットと認識するファイルを出力するためのテンプレート
deploy.py 実行時に指定する。構築の処理を指定するファイル
inventory.py 実行時に指定する。対象ノードを指定するインベントリファイル


pyinfraのインストールは、pipxを利用して、

> pipx install pyinfra 

だけです。

pyinfraをインストール後、上記のファイルを用意して、

> pyinfra inventory.py deploy.py 

を実行すると、無事、PrometheusとNode Exporterが構築されて、
以下の画面が見られました。すばらしいですね。
作成したファイルの内容も以下に記載しますが、Ansibleで、Playbookを記述するのと同じような内容です。

インベントリや、処理内容を記述したファイルはどんなものか

作成したファイルをいくつか示します。接続情報など省いているのはご了承ください。
■インベントリ inventory.py
 Prometheusをインストールする対象と、Node Exporterをインストールする対象を分けてい書いています。

prometheus_servers = [
    ("node01", {"ssh_hostname": "<node01のホスト名>",
     "ssh_user": "<ユーザ>", "ssh_key": "<鍵ファイル>", "private_ip": "172.31.40.187"})
]

target_servers = [
    ("node01", {"ssh_hostname": "<node01のホスト名>",
     "ssh_user": "<ユーザ>", "ssh_key": "<鍵ファイル>", "private_ip": "172.31.40.187"}),
    ("node02", {"ssh_hostname": "<node02のホスト名>",
     "ssh_user": "<ユーザ>", "ssh_key": "<鍵ファイル>", "private_ip": "172.31.36.50"})
]

■処理内容を記述して実行コマンドで指定するファイル deploy.py
 インベントリにあわせて、実行する処理のPythonファイルを指定しています。

from pyinfra import host, local

if 'prometheus_servers' in host.groups:
    local.include('tasks/prometheus.py')

if 'target_servers' in host.groups:
    local.include('tasks/target.py')

■メインのPrometheusの構築内容を記述したファイル prometheus.py
 prometheusをインストールして、Node Exporterをターゲットと設定するために以下の記述になりました。

from pyinfra import inventory
from pyinfra.operations import server, files, yum, systemd

server.shell(
    name="Install prometheus",
    commands=["echo prometheus"],
)

files.put(
    name="Put prometheus repo file",
    src="files/prometheus.repo",
    dest="/etc/yum.repos.d/prometheus.repo",
    mode="644",
    _sudo=True,
)

yum.packages(
    name="Install prometheus2",
    packages=["prometheus2"],
    _sudo=True,
)

files.directory(
    name="Create directory",
    path="/etc/prometheus/targets",
    _sudo=True,
)

files.put(
    name="Put prometheus config file",
    src="files/prometheus.yml",
    dest="/etc/prometheus/prometheus.yml",
    mode="644",
    _sudo=True,
)

for target in inventory.get_group("target_servers"):
    files.template(
        name="Create target file",
        src="templates/target.yml.j2",
        dest="/etc/prometheus/targets/tg_" + target.name + ".yml",
        mode="644",
        private_ip=target.host_data.get("private_ip"),
        _sudo=True,
    )

systemd.service(
    name="Start prometheus service",
    service="prometheus.service",
    running=True,
    restarted=True,
    enabled=True,
    _sudo=True,
)

とてもシンプルな記述ですよね。これらのファイルを見れば、やっていることはだいたいわかるかと思います。

まとめ

Windows環境でも、Ansibleと同じような感覚で簡単に構築自動化が実現できました。
Pythonを書いているので、VSCodeでも補完ができたり、扱いやすかったです。

詳細にAnsibleと比較してはいないですが、十分利用できそうだという感触でした。
興味持たれた方は試してみてください。

それでは。


Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

顧客のビジネスをインフラから加速するエンジニア募集! - Acroquest Technology株式会社のインフラエンジニアの採用 - Wantedlywww.wantedly.com