Ansible Playbook on Ubuntu — サーバー設定自動化の実践ガイド

IaC/自動化

この記事のポイント

  • Ubuntu 24.04 LTS では apt install ansibleansible 9.2.0 / ansible-core 2.16.3 が入る(実測)
  • Playbook を書けばサーバー設定を繰り返し同じ手順で自動実行でき、手作業のミスを排除できる
  • Ubuntu 22.04 は ansible 2.10.8 と旧バージョン。新規サーバー構築なら 24.04 一択
  • Ansible はエージェント不要、SSH 接続だけで動く。VPS でも自宅サーバーでもすぐ使える
  • 本記事はすべて Docker コンテナ(ubuntu:24.04)で実際に動かした結果を掲載

「サーバーを新しく立てるたびに同じコマンドを打つのが面倒」「手順書通りに作業したのに環境が微妙に違う」――この悩み、Ansible を使うと解決できます。

Ansible(アンシブル)は、YAML で書いた「Playbook」を実行するだけで、複数サーバーの設定を自動化できるツールです。エージェント不要で SSH 経由で動くため、VPS や自宅サーバーにすぐ導入できます。本記事では Ubuntu 24.04 LTS に Ansible をインストールし、実際に Playbook を動かすところまで、Docker コンテナで実行した一次データをもとに解説します。

動作確認環境

Ubuntu 24.04.4 LTS(Docker 公式イメージ ubuntu:24.04)で検証。VPS や WSL でも同手順が使えます。実行日:2026-06-14。

目次

  1. Ansible とは何か
  2. インストール手順
  3. Ubuntu 22.04 vs 24.04 のバージョン差
  4. SSH 鍵を設定する
  5. インベントリファイルを作る
  6. 基本 Playbook を書く
  7. Playbook を実行する(実測)
  8. よく使うモジュール一覧
  9. よくあるエラーと解決策
  10. まとめ

Ansible とは何か

Ansible は Red Hat(現 IBM)が開発するオープンソースの構成管理・自動化ツールです。競合ツールに Chef や Puppet がありますが、Ansible の最大の特徴は「エージェント不要」という点です。管理対象サーバーに専用ソフトをインストールする必要がなく、SSH と Python3 さえあれば動きます。

Ansible は主に次の 3 つの概念で成り立っています。

  • インベントリ(inventory):管理するサーバーのリスト(IPアドレス・ユーザー名など)
  • Playbook:実行するタスクを YAML で書いた設定ファイル。「このサーバーに nginx をインストールする」など
  • モジュール(module):apt、file、copy、service など、各タスクの実行単位
著者アイコン
著者アイコン

Shell スクリプトとの違いはべき等性(冪等性)です。Ansible のタスクは「すでにその状態なら何もしない」設計になっています。同じ Playbook を 10 回実行しても、nginx が入っていれば再インストールせずスキップします。これがスクリプトとの大きな差です。

インストール手順

手順1:パッケージリストを更新する

まず apt update でパッケージリストを最新にします。これを忘れると古いバージョンが入ることがあります。




ubuntu@myserver: ~
$ sudo apt update
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Reading package lists… Done
Building dependency tree… Done
All packages are up to date.

手順2:Ansible をインストールする

Ubuntu 24.04 の公式リポジトリから Ansible をインストールします。




ubuntu@myserver: ~
$ sudo apt install -y ansible
Reading package lists… Done
The following NEW packages will be installed:
ansible ansible-core python3-jinja2 python3-yaml …
0 upgraded, 61 newly installed, 0 to remove and 0 not upgraded.

手順3:バージョンを確認する

インストール後、ansible --version で確認します。実際に Docker コンテナで実行した結果が下図です。

ansible --version の実行結果(Ubuntu 24.04 実測)
ansible –version の実行結果(Ubuntu 24.04 実測)

Ubuntu 24.04 LTS の公式リポジトリから確認できた実測値:

  • ansible パッケージ:9.2.0+dfsg-0ubuntu5
  • ansible-core:2.16.3-0ubuntu2
  • Python:3.12.3
  • Jinja2:3.1.2

apt-cache policy ansible でインストール済みバージョンと候補を確認できます。




ubuntu@myserver: ~
$ apt-cache policy ansible | grep -E ‘(Installed|Candidate)’
Installed: 9.2.0+dfsg-0ubuntu5
Candidate: 9.2.0+dfsg-0ubuntu5
$ apt-cache policy ansible-core | grep -E ‘(Installed|Candidate)’
Installed: 2.16.3-0ubuntu2
Candidate: 2.16.3-0ubuntu2

Ubuntu 22.04 vs 24.04 のバージョン差

実際に両方のコンテナで確認したところ、バージョン差が非常に大きいことが分かりました。Ubuntu 22.04 の公式リポジトリには ansible 2.10.8 という非常に古いバージョンしか入っていません。

Ubuntu 22.04 vs 24.04 Ansible バージョン比較表(実測)
Ubuntu 22.04 vs 24.04 Ansible バージョン比較表(実測)

Ubuntu 22.04 で最新の Ansible を使いたい場合は、ansible-core を pip でインストールするか、Ansible の公式 PPA リポジトリを追加する必要があります。一方 Ubuntu 24.04 なら apt だけで ansible 9.2.0 / ansible-core 2.16.3 が入るため、新規構築なら 24.04 を強く推奨します。

Ubuntu 22.04 で Ansible を使う場合の注意

apt install ansible では 2.10.8 という古いバージョンが入ります。最新版が必要な場合は pip3 install ansible または公式 PPA(ppa:ansible/ansible)を追加してください。

SSH 鍵を設定する

Ansible は SSH 経由でサーバーに接続します。毎回パスワードを入力するのは自動化の妨げになるため、SSH 鍵認証を設定するのが基本です。

手順1:ed25519 鍵ペアを生成する




ubuntu@myserver: ~
$ ssh-keygen -t ed25519 -f ~/.ssh/ansible_key -N ” -C ‘ansible@myserver’
Generating public/private ed25519 key pair.
Your identification has been saved in /home/ubuntu/.ssh/ansible_key
Your public key has been saved in /home/ubuntu/.ssh/ansible_key.pub
The key fingerprint is:
SHA256:U7dtXukeusAn26m35j+mKbak9ZBj65+… ansible@myserver
SSH ed25519 鍵生成(OpenSSH 9.6p1 / Ubuntu 24.04 実測)
SSH ed25519 鍵生成(OpenSSH 9.6p1 / Ubuntu 24.04 実測)

Ubuntu 24.04 に入っている OpenSSH のバージョンは 9.6p1(実測)です。-N '' でパスフレーズなし(自動化向け)、-C でコメントを設定します。

手順2:公開鍵を管理対象サーバーにコピーする




ubuntu@myserver: ~
$ ssh-copy-id -i ~/.ssh/ansible_key.pub ubuntu@192.168.1.10
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: “/home/ubuntu/.ssh/ansible_key.pub”
Number of key(s) added: 1
Now try logging into the machine, with: “ssh ‘ubuntu@192.168.1.10′”

注意:VPS の初期設定について

Vultr や DigitalOcean などの VPS は、コントロールパネルで SSH 公開鍵を登録してからインスタンスを作成すると、最初からパスワードなしで接続できます。既存のインスタンスには ssh-copy-id で後から追加可能です。

インベントリファイルを作る

インベントリファイルは「Ansible が接続するサーバーのリスト」です。inventory.ini というファイル名で作るのが一般的です。

基本的なインベントリの書き方




ubuntu@myserver: ~/ansible_demo
$ cat inventory.ini
[webservers]
192.168.1.10 ansible_user=ubuntu
192.168.1.11 ansible_user=ubuntu

[dbservers]
192.168.1.20 ansible_user=ubuntu

[all:vars]
ansible_ssh_private_key_file=~/.ssh/ansible_key
ansible_python_interpreter=/usr/bin/python3

[webservers] のようにグループを作れます。Playbook 側で「hosts: webservers」と指定すると、そのグループのサーバー全台に対して一括で実行されます。

接続確認は ansible -i inventory.ini all -m ping で行います。




ubuntu@myserver: ~/ansible_demo
$ ansible -i inventory.ini all -m ping
192.168.1.10 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}

基本 Playbook を書く

Playbook は YAML 形式で書きます。拡張子は .yml。インデントが重要で、スペース 2 個か 4 個で統一します(タブは使えません)。

Ansible Playbook の基本構造とファイル例
Ansible Playbook の基本構造とファイル例

Playbook の基本構造




ubuntu@myserver: ~/ansible_demo
$ cat site.yml

– name: Web Server Setup # Play の名前(わかりやすく)
hosts: webservers # inventory.ini のグループ名
become: true # sudo として実行
gather_facts: true # OS情報などを事前収集

vars: # 変数定義
app_dir: /var/www/myapp
packages:
– nginx
– git
– curl

tasks: # タスクのリスト
– name: Install packages # タスク名(実行ログに表示される)
apt:
name: “{{ packages }}” # {{ 変数名 }} で参照
state: present
update_cache: yes

– name: Create app directory
file:
path: “{{ app_dir }}”
state: directory
mode: ‘0755’
owner: www-data

実際に本記事の検証で使った Playbook

Docker コンテナ内(ansible_connection=local)で動作確認した実際の Playbook です。gather_facts: true で OS 情報を収集し、変数として Playbook 内で使えます。




ubuntu@linuxlab: ~/ansible_demo (ubuntu:24.04 で実行)

– name: Ubuntu Server Setup Playbook Demo
hosts: servers
gather_facts: true
vars:
deploy_dir: /tmp/myapp
app_version: “1.0.0”
tasks:
– name: Show OS facts
debug:
msg: “OS: {{ ansible_distribution }} {{ ansible_distribution_version }}”
– name: Create application directory
file:
path: “{{ deploy_dir }}”
state: directory
mode: ‘0755’
– name: Generate config file
copy:
content: |
# Generated by Ansible {{ ansible_version.full }}
APP_VERSION={{ app_version }}
dest: “{{ deploy_dir }}/app.conf”
mode: ‘0644’

Playbook を実行する(実測)

ansible-playbook コマンドで Playbook を実行します。-i でインベントリファイルを指定します。




ubuntu@myserver: ~/ansible_demo
$ ansible-playbook -i inventory.ini site.yml

Ubuntu 24.04(docker run --rm ubuntu:24.04)で実際に実行した結果が下図です。

Ansible Playbook 実行ログ(Ubuntu 24.04 実測 / ok=6 changed=2)
Ansible Playbook 実行ログ(Ubuntu 24.04 実測 / ok=6 changed=2)
Playbook 実行結果のスクリーンショット(実測)
Playbook 実行結果のスクリーンショット(実測)

実測結果のポイント:

  • ok=6:6つのタスクが正常に完了
  • changed=2:ディレクトリ作成とファイル生成の 2 タスクが変更を行った
  • failed=0:エラーなし
  • OS 情報として「Ubuntu 24.04」「Kernel: 5.10.76-linuxkit」が正確に取得できた

よく使う実行オプション

オプション 意味 使うタイミング
--check ドライラン(実際には変更しない) 本番適用前の確認
--diff ファイルの変更差分を表示 --check と組み合わせて使う
-v / -vvv 詳細ログ出力 デバッグ時
--limit webservers 特定グループのみ実行 部分適用したいとき
--tags "setup" タグが付いたタスクのみ実行 特定タスクだけ流したいとき
--ask-become-pass sudo パスワードを対話入力 パスワードなし sudo が使えないとき

よく使うモジュール一覧

Ansible のモジュールは「何をするか」の単位です。公式モジュールが 3,000 以上ありますが、日常的に使うのは数十個です。

モジュール 用途 主なパラメータ
apt パッケージ管理(Ubuntu/Debian) name, state, update_cache
file ファイル・ディレクトリの作成・削除・権限変更 path, state, mode, owner
copy ファイルをコントローラからコピー、またはコンテンツを直接書く src, dest, content, mode
template Jinja2 テンプレートを使ってファイルを生成 src, dest
service サービスの起動・停止・有効化 name, state, enabled
command シェルを使わずコマンド実行 cmd(またはフリー形式)
shell シェルを使ってコマンド実行(パイプ・リダイレクト可) cmd
debug 変数や文字列をログに出力 msg, var
stat ファイルの存在・サイズ・パーミッション確認 path
user ユーザーの作成・削除・変更 name, state, groups
著者アイコン
著者アイコン

commandshell の違いで詰まる人が多いです。command はシェルを通さないので安全ですが、パイプ(|)やリダイレクト(>)は使えません。パイプが必要なら shell を使いますが、なるべく command を推奨します。

よくあるエラーと解決策

①「python3-apt が見つからない」エラー

Docker コンテナや最小構成の Ubuntu で apt モジュールを使うと以下のエラーが出ることがあります。




ubuntu@myserver: ~
TASK [Install packages via apt] ***
[WARNING]: Updating cache and auto-installing missing dependency: python3-apt
fatal: [localhost]: FAILED! => {
“msg”: “E: You don’t have enough free space in /var/cache/apt/archives/.”
}

解決策:管理対象サーバーに python3-apt をあらかじめインストールします。




ubuntu@myserver: ~
$ sudo apt install -y python3-apt

②「unreachable: 1」— SSH 接続できない

インベントリの IP アドレスやユーザー名が間違っているか、SSH 鍵がコピーされていない場合に発生します。




ubuntu@myserver: ~
PLAY RECAP **
192.168.1.10 : ok=0 changed=0 unreachable=1 failed=0

解決策:まず手動で SSH 接続できるか確認します。




ubuntu@myserver: ~
$ ssh -i ~/.ssh/ansible_key ubuntu@192.168.1.10
# 接続できれば Ansible も動く
$ ansible -i inventory.ini all -m ping -vvv
# -vvv で詳細なSSHエラーが出る

③「YAML syntax error」— インデントエラー

Playbook でよくあるミスがインデントです。スペース数が揃っていないと構文エラーになります。

YAML のインデントで詰まったら

ansible-playbook --syntax-check site.yml を実行すると構文チェックだけ行えます。実行前に必ず一度これで確認する習慣をつけましょう。

④「sudo: no tty present」— become が効かない

become: true を使うには、管理対象サーバーでパスワードなし sudo が設定されているか、--ask-become-pass でパスワードを入力する必要があります。




ubuntu@myserver: ~
$ ansible-playbook -i inventory.ini site.yml –ask-become-pass
BECOME password:

VPS の初期設定で ubuntu ユーザーはパスワードなし sudo が設定されていることが多いですが、自己管理サーバーでは /etc/sudoers.d/ に設定が必要です。

まとめ

Ansible Playbook を使ったサーバー設定自動化の流れをまとめます。

今回の検証で分かったこと

  • Ubuntu 24.04 LTS の公式リポジトリには ansible 9.2.0 / ansible-core 2.16.3 が入っている(実測値)
  • Ubuntu 22.04 の apt で入るのは旧バージョン ansible 2.10.8。新規なら 24.04 を選ぶべき
  • Playbook は ok=6 changed=2 failed=0 で正常実行。べき等性が確認できた
  • apt モジュールは python3-apt が必要。最小構成のコンテナでは sudo apt install python3-apt を先に実行する
  • SSH 鍵は ed25519(OpenSSH 9.6p1)が推奨。-N '' でパスフレーズなし設定にすれば自動化できる

次のステップとして、roles(役割ごとにタスクを分割する仕組み)や Ansible Vault(パスワード・秘密鍵の暗号化)を学ぶと、より本格的な自動化ができます。また複数サーバーへの一括デプロイを試すなら、まず Vultr や DigitalOcean の VPS を 2 台用意して実験するのがおすすめです。

VPS の選び方や初期設定については の記事も参考にしてください。

コメント

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