レガシー環境にTestinfra/Ansibleを導入してみた話

2025年10月20日掲載

キービジュアル

この記事では、10年以上運用を続けるシェアードホスティング環境に、TestinfraとAnsibleを導入して、インフラのコード化を進めた実践事例を紹介します。

レガシーな環境であっても、改善は小さな一歩から始められます。すべてを一気に変えるのは難しくても、今できる範囲で手を動かすことが未来の大きな変化につながります。本記事では、そんな現実的な「小さなコード化」をどう踏み出したかを、具体的な事例とともに紹介します。

目次

  • レガシーなシステムに向き合っているエンジニアが、小さなコード化で業務の改善をしていく話です。
  • 同じようにレガシーなシステムに向き合っているエンジニに読んでもらって、一緒に改善を進めていけたらと思っています。

1.サービスの背景と課題

シェアードホスティングは、お客さまのドメイン名で利用できるメール、Web、DNSをワンパッケージで提供する、リーズナブルなホスティングサービスです。10年以上にわたり、1台のサーバーを複数のお客さまで共有する形で安定運用されてきた、長寿命なサービスでもあります。

このサービスでは、サーバーの設定値などを「パラメータシート」と呼ばれるExcelファイルで管理してきました。当時はTestinfraやAnsibleのような構成管理・検証ツールは一般的ではなく、運用も手作業が中心でした。また、サービスの安定性から設定変更の頻度が低く、その結果、実際のサーバー設定とパラメータシートとの間に徐々に乖離が生まれていました。

2.コード化を始めた理由

とある事情で、シェアードホスティング環境に対して定期的なテストの実施が求められるようになりました。これは、サービス品質を継続的に担保するための運用ルール見直しや、監査対応の一環として決まったものでした。

テストの対象は、サーバーの設定状況の確認や、各種提供機能(Web・メール・DNSなど)の疎通や動作検証といったもので、合計でおよそ500項目にのぼります。チェック項目の多くは手順が定まっており、担当者としては慣れていたものの、すべてを手動で実施すると1日〜2日を要する大仕事です。しかも、それを定期的に繰り返す必要があるとなると、人的リソースへの負担は無視できないレベルでした。

そこで、「この作業、コード化すればもっと楽になるのでは?」というアイデアが浮かびました。これが、レガシーな環境の中でもインフラのコード化を始めるきっかけとなりました。完璧を目指すのではなく、まずはできるところから始めてみる。そういった小さな一歩が、後の改善につながっていきます。

3.TestinfraとAnsibleの導入と効果

インフラのコード化にあたって導入したのが、AnsibleTestinfraという2つのツールです。

まず、Ansibleは、サーバーの構成や設定作業をコードとして定義し、自動的に実行できる構成管理ツールです。従来、管理者が手動で行っていたパッケージのインストールや設定ファイルの配置、サービスの起動・停止といった作業を、スクリプト化して再現性のある形で実行できます。これにより、作業の属人化を防ぎつつ、ミスを減らすことができます。

一方、Testinfraは、Pythonで記述するテストフレームワークで、サーバー上の状態(インストール済みのパッケージや、起動中のサービスなど)をコードで検証することができます。アプリケーション開発におけるユニットテストのように、インフラの設定状態に対してテストを記述し、自動でチェックを行うことができます。

この2つを組み合わせることで、設定の適用(Ansible)と、その検証(Testinfra)を一連のプロセスとして自動化できるようになります。これにより、設定の変更漏れや確認漏れといった人的ミスを大きく減らすことが可能になりました。

とはいえ、いきなりすべてのサーバー構築やテストをコード化するのは現実的ではありません。そこで、まずは比較的シンプルで、すぐに自動化の効果が見える項目から着手しました。今回対象としたのは、以下のような基本的なチェックです:

  • 必要なパッケージがインストールされているか
  • 必要なサービスが起動しており、自動起動設定がされているか
  • 不要なサービスが停止されているか

これら、約100項目に対してコード化を行いました。その結果、これまで手動で1時間ほどかかっていた確認作業が、わずか2分程度で自動的に完了するようになりました。

たとえば、Ansibleでは dnf install コマンドをコードとして記述することで、パッケージのインストールを安定して再現できます。手入力で起こりがちなタイプミスやコピペミスの心配もありません。Testinfraでは、対象のパッケージやサービスの状態をチェックするコードを書いておけば、誰が実行しても同じ基準で結果を得られます。

このような基本的な部分だけでもコード化して自動化することで、「定期作業を1コマンドで実行できる」安心感と、心理的な負担の軽減が得られました。少しずつ着実に自動化を進めていくことで、レガシーな環境でも運用の質を高められると実感しています。

4.Testinfraのコード例

実際に使用しているものとは違いますが、Testinfraのテストコード例と、その実行結果を一部紹介します。


# test_example.py
import testinfra

def test_package_installed(host):
    pkg = host.package("httpd")
    assert pkg.is_installed

def test_service_running(host):
    svc = host.service("httpd")
    assert svc.is_running
    assert svc.is_enabled

このコードは、Apache HTTP Serverがインストールされ、起動かつ自動起動設定されていることを検証します。

実行コマンド:


pytest -v test_example.py

実行結果(抜粋):


test_example.py::test_package_installed PASSED
test_example.py::test_service_running PASSED

このように、テストコードを整備することで、誰が実行しても同じ基準で確認できるようになります。

今後の展望

次のステップとして、OSの設定やアプリケーションの設定など、範囲を細かく分けてコード化していく予定です。今後も進捗をブログで発信していきますので、「レガシー環境でも取り組める」と感じてもらえたら幸いです。

おすすめの記事

条件に該当するページがございません