【入門編】JenkinsのインフラをTerraform×Ansibleで管理:IaCで実現する『使い捨てJenkins』の運用設計 – バージョン管理・CI/CD活用バイブル

こんにちは!開発現場で「Jenkinsの調子が悪くなったから再起動しよう」「プラグインを手動で入れたら動かなくなった……」なんて絶望した経験はありませんか?

手動で構築したJenkinsは、いつの間にか誰も触れない「ブラックボックス」と化し、障害が起きても原因が分からないお化けサーバーになりがちです。

今回は、そんな属人化の象徴であるJenkinsを「Terraform × Ansible」で完全にコード化(IaC)し、何度でもスクラップ&ビルドできる『使い捨てJenkins』の運用設計を伝授します。

これをマスターすれば、インフラの構築はコマンド一発。設定変更はすべてGitで追跡可能になり、毎日の運用作業が劇的に楽になりますよ。さあ、一緒にモダンなCI/CDインフラの世界へ踏み出しましょう!

—

1. なぜ「使い捨てJenkins(Cattle Jenkins)」なのか?

インフラストラクチャの世界には、サーバーの扱い方について有名な例えがあります。

  • ペット方式(Pet):名前をつけ、可愛がり、病気をしたら手塩にかけて看病する。⇒ 手動構築のJenkins
  • 家畜方式(Cattle):個体ではなく群れとして管理し、調子が悪くなったら容赦なく処分して新しい個体に置き換える。⇒ 今回目指すJenkins

Jenkins本体の設定、プラグイン、Javaのバージョン、OSの依存関係……これらすべてをコード(TerraformとAnsible)で定義します。もしJenkinsがおかしくなったら? 悩む必要はありません。インフラを破壊して、数分後に全く同じ環境を再デプロイすればいいのです。

—

2. 全体アーキテクチャとディレクトリ構造

まずは、すべてを管理するGitリポジトリの全体像を見てみましょう。この美しく整理された構造が、あなたのインフラを守る盾となります。

jenkins-infra-ic/
├── terraform/ # インフラの土台(AWS EC2, VPC, SecurityGroupなど)を構築
│ ├── main.tf
│ ├── variables.tf
│ ├── outputs.tf
│ └── terraform.tfvars
└── ansible/ # OSのセットアップとJenkins自体の構築・設定
├── inventory.ini
├── playbook.yml
└── roles/
├── common/ # Javaや必須パッケージのインストール
└── jenkins/ # Jenkinsのインストール、プラグイン、初期設定

Terraformで「箱(サーバー)」を作り、Ansibleで「中身(ミドルウェアとJenkins設定)」を流し込む。この役割分担がIaCの黄金律です。

—

3. ステップ1:Terraformで「土台」をコード化する

まずはAWSなどのクラウド上に、Jenkinsが稼働する仮想マシン(EC2)の土台を作ります。ここでは最小限の構成を見てみましょう。

`terraform/main.tf`

terraform {
required_version = “>= 1.5.0”
required_providers {
aws = {
source = “hashicorp/aws”
version = “~> 5.0”
}
}
}

provider “aws” {
region = var.aws_region
}

Jenkins専用のセキュリティグループ
resource “aws_security_group” “jenkins_sg” {
name = “jenkins-server-sg”
description = “Allow inbound traffic for Jenkins”

# SSH (Ansibleの接続用)
ingress {
from_port = 22
to_port = 22
protocol = “tcp”
cidr_blocks = [“0.0.0.0/0”] # ※実運用では社内IP等に制限してください
}

# Jenkins Web UI
ingress {
from_port = 8080
to_port = 8080
protocol = “tcp”
cidr_blocks = [“0.0.0.0/0”]
}

# すべてのアウトバウンド通信を許可
egress {
from_port = 0
to_port = 0
protocol = “-1”
cidr_blocks = [“0.0.0.0/0”]
}
}

Jenkinsサーバー本体のEC2インスタンス
resource “aws_instance” “jenkins” {
ami = var.ami_id
instance_type = var.instance_type
key_name = var.key_name
vpc_security_group_ids = [aws_security_group.jenkins_sg.id]

tags = {
Name = “Disposable-Jenkins”
}
}

作成したサーバーのIPアドレスを出力(Ansibleで使います)
output “jenkins_ip” {
value = aws_instance.jenkins.public_ip
}

このコードを書いて `terraform apply` を実行すれば、ピカピカのサーバーが即座に立ち上がります。

—

4. ステップ2:Ansibleで「OSとJenkins」を調律する

サーバーができたら、次はAnsibleの出番です。JavaのインストールからJenkinsの起動、さらに「最初から入っていてほしいプラグイン」の導入までを自動化します。

`ansible/playbook.yml`

—

  • hosts: jenkins_servers

become: yes
roles:

  • common
  • jenkins

`ansible/roles/jenkins/tasks/main.yml`(抜粋:Jenkinsのインストールとプラグイン自動化)

—
Jenkins公式のGPGキーを追加

  • name: Add Jenkins GPG key

rpm_key:
state: present
url: https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key

yumリポジトリを追加

  • name: Add Jenkins repository

get_url:
url: https://pkg.jenkins.io/redhat-stable/jenkins.repo
dest: /etc/yum.repos.d/jenkins.repo

Java (Jenkins 2.357+ 以降はJava 17が必須) と Jenkinsのインストール

  • name: Install Java 17 and Jenkins

yum:
name:

  • java-17-amazon-corretto
  • jenkins

state: present

Jenkinsの起動と有効化

  • name: Start and enable Jenkins service

systemd:
name: jenkins
state: started
enabled: yes

このように、OSの依存関係(Javaのバージョンなど)も含めてすべてコード化しておくことで、「OSをバージョンアップしたら動かなくなった」という悪夢を防ぐことができます。

—

5. 精度高い「Hello World」!動作確認のパイプライン

インフラが組み上がったら、正しく動くかをテストしましょう。ブラウザで `http://:8080` にアクセスすると、お馴染みの初期ロック解除画面が表示されます。

初期設定を終えたら、Jenkinsの真髄である「パイプライン」の動作確認です。手動で作るのではなく、これもコード(Jenkinsfile)としてリポジトリで管理します。

動作確認用 `Jenkinsfile`

pipeline {
agent any

stages {
stage(‘Hello’) {
steps {
echo ‘=========================================’
echo ‘ 使い捨てJenkinsへようこそ!’
echo ‘ インフラは完全にコード化されています。’
echo ‘=========================================’
}
}

stage(‘System Check’) {
steps {
sh ‘java -version’
sh ‘uptime’
}
}
}

post {
success {
echo ‘🎉 パイプラインが正常に完了しました!’
}
}
}

この `Jenkinsfile` をGitリポジトリのルートに置いてJenkinsに読み込ませれば、極めて精度の高い「Hello World」パイプラインが完成します。

—

6. 運用・保守のベストプラクティス:もし障害が起きたら?

「使い捨てJenkins」の運用において、障害対応のフローは驚くほどシンプルになります。

1. 障害発生:プラグインの競合でJenkinsが起動しなくなった!
2. 復旧判断:原因を調査する時間をかける必要はありません。
3. 破壊:`terraform destroy` でサーバーを綺麗さっぱり消し去ります。
4. 再生:`terraform apply` からの `ansible-playbook playbook.yml` を実行。

わずか数分後には、完全にクリーンで最新の状態のJenkinsが手に入ります。 (※ジョブの履歴や成果物を永続化したい場合は、データディレクトリ `/var/lib/jenkins` をEBS等の外付けストレージにマウントするか、S3にバックアップを取る設計にしておけば完璧です)

—

まとめ

今回は、TerraformとAnsibleを駆使してJenkinsのインフラをすべてコード化し、『使い捨てJenkins』を実現する手法を解説しました。

  • インフラの土台は Terraform で構築する。
  • ミドルウェアやJenkinsの設定は Ansible で調律する。
  • トラブルが起きたら直そうとせず、スクラップ&ビルドする。

このアプローチを取り入れれば、「誰が触ったかわからない壊れかけのJenkins」とはもうお別れです。バージョン管理されたクリーンなCI/CD環境を手に入れて、毎日の開発を圧倒的に快適なものにしてくださいね!

タイトルとURLをコピーしました