こんにちは!開発現場で「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://
初期設定を終えたら、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環境を手に入れて、毎日の開発を圧倒的に快適なものにしてくださいね!