Ansible Roles on Ubuntu — 再利用可能なロールの作成とGalaxy活用

IaC/自動化

「Ansibleで同じ設定を何度も書いている」「チームで設定を使い回したい」と感じたことはありませんか? そんなときに使うのが ロール(Role) という機能です。

ロールを使うと、タスク・変数・テンプレートをひとつのパッケージにまとめて再利用できます。 コマンド1発でロールの骨格を生成し、そのまま共有・公開まで持っていける のが Ansible ロールの強みです。

本記事では実際に Ubuntu 24.04 LTS のコンテナで ansible-galaxy role init を実行し、 ロール作成 → Playbook 呼び出し → Galaxy からコミュニティロールのインストール まで一通り検証した結果を載せます。

この記事のポイント

  • Ubuntu 24.04 の apt では ansible 9.2.0 が入る(22.04 は 2.10.7 と大幅に古い)
  • ansible-galaxy role init <名前> 1コマンドで tasks・defaults・handlers など8ファイルが自動生成される
  • Playbook に roles: - ロール名 と書くだけで、そのロール内の全タスクが実行される
  • Ansible Galaxy から geerlingguy.git などのコミュニティロールを requirements.yml で一括管理できる
  • defaults/vars/ の優先度の違いを把握するとロール設計がぐっと楽になる

目次

  1. 前提環境・Ansibleのインストール
  2. ロールとは何か
  3. ansible-galaxy role init でロールを作成する
  4. 各ディレクトリの役割を理解する
  5. タスクを書いてロールを仕上げる
  6. Playbook でロールを呼び出す
  7. Ansible Galaxy のコミュニティロールを使う
  8. requirements.yml でロールを管理する
  9. よくあるエラーと解決策
  10. まとめ

前提環境・Ansibleのインストール

本記事のコマンドはすべて以下の環境で実行・確認しています。

OSUbuntu 24.04.4 LTS(Noble Numbat)
ansible(apt)9.2.0+dfsg-0ubuntu5
ansible-core(pip)2.21.0
確認日2026-06-14
実行環境Docker公式イメージ(ubuntu:24.04)/ python:3.12-slim

①インストール前にバージョンを確認する

Ubuntu のバージョンによって apt で入る Ansible のバージョンが大きく違います。 実際に確認してみました。

Ubuntu 22.04 vs 24.04 の apt ansible バージョン比較(実測)
Ubuntu 22.04 vs 24.04 の apt ansible バージョン比較(実測)

Ubuntu 22.04(Jammy)では 2.10.7 と古いバージョンしか入りません。 Ubuntu 24.04(Noble)では 9.2.0 が利用可能です。 22.04 を使っている場合は pip 経由でインストールすることを強くおすすめします。

注意

Ubuntu 22.04 の apt ansible(2.10.7)は ansible-core 2.10 ベースです。最新機能(FQCN必須、collections サポートなど)が一部使えません。本格的に使う場合は pip でインストールしてください。

②Ansible をインストールする(Ubuntu 24.04)

Ubuntu 24.04 の場合、apt でそのままインストールできます。

ubuntu@server: ~
$ sudo apt update && sudo apt install -y ansible Reading package lists… Done Building dependency tree… Done Setting up ansible (9.2.0+dfsg-0ubuntu5) … $ ansible –version | head -2 ansible [core 2.16.3] config file = None

Ubuntu 22.04 や最新版が必要な場合は pip を使います。

ubuntu@server: ~
$ pip install ansible Collecting ansible Downloading ansible-… Successfully installed ansible-10.x.x ansible-core-2.21.x $ ansible –version | head -1 ansible [core 2.21.0]

ロールとは何か

Ansible の ロール(Role) は、Playbook を 再利用可能な単位にパッケージ化する仕組み です。

たとえば「nginx のインストールと設定」をロールとして作っておくと、 本番サーバーでも開発サーバーでも roles: - nginx_setup の1行で同じ設定が適用できます。 Playbook が長くなるほど、ロールによる整理の効果が大きくなります。

ロールには以下の用途があります。

  • チーム内の再利用:「nginx ロール」「mysql ロール」を用意してチームで共有
  • Ansible Galaxy での公開:世界中のエンジニアが公開したロールをそのまま使える
  • テストのしやすさ:ロール単位でテスト(Molecule)が書きやすい
著者アイコン
著者アイコン

「Playbook に全部書けばいいんじゃ?」と最初は思いますが、同じ nginx の設定を10台のサーバーに書くとなったとき、ロールの価値に気づきます。変更は1ヶ所だけで済みます。


ansible-galaxy role init でロールを作成する

ロールを1から手動で作る必要はありません。ansible-galaxy role init コマンドで 標準ディレクトリ構造が一発で生成されます。

ubuntu@server: ~/myproject
$ ansible-galaxy role init roles/nginx_setup – Role roles/nginx_setup was created successfully $ find roles/nginx_setup -type f | sort roles/nginx_setup/README.md roles/nginx_setup/defaults/main.yml roles/nginx_setup/handlers/main.yml roles/nginx_setup/meta/main.yml roles/nginx_setup/tasks/main.yml roles/nginx_setup/tests/inventory roles/nginx_setup/tests/test.yml roles/nginx_setup/vars/main.yml

これが Ubuntu 24.04 で ansible-galaxy role init を実行した実際の出力です。 コマンド1行で8つのファイル・ディレクトリが自動生成されます。

ansible-galaxy role init の実行結果とロール構造(実測)
ansible-galaxy role init の実行結果とロール構造(実測)
ansible-galaxy role init と ansible-playbook の実行画面(実測)
ansible-galaxy role init と ansible-playbook の実行画面(実測)

ロールは通常、プロジェクトの roles/ ディレクトリ以下に作ります。 ロール名はわかりやすく命名しましょう(nginx_setupmysql_configuser_create など)。


各ディレクトリの役割を理解する

生成されたディレクトリには、それぞれ決まった役割があります。

Ansibleロールのディレクトリ構造と役割
Ansibleロールのディレクトリ構造と役割

①tasks/main.yml — メインのタスク定義(最重要)

tasks/main.yml がロールの核心です。ここに Ansible のタスクを書きます。

roles/nginx_setup/tasks/main.yml
# タスクファイル: nginx_setup ロール – name: Create web root directory ansible.builtin.file: path: “{{ nginx_root }}” state: directory mode: ‘0755’ – name: Deploy nginx config ansible.builtin.template: src: nginx.conf.j2 dest: /etc/nginx/sites-available/{{ server_name }}.conf mode: ‘0644’ notify: Reload nginx

②defaults/main.yml — 上書き可能なデフォルト変数

defaults/main.yml には、ロールが使う変数のデフォルト値を書きます。 Ansible の変数優先度の中で最も低い ため、Playbook やインベントリから簡単に上書きできます。

roles/nginx_setup/defaults/main.yml
nginx_port: 80 nginx_root: /var/www/html server_name: “example.com” nginx_worker_processes: auto

③handlers/main.yml — notify で呼び出す処理

サービスの再起動など「変更があったときだけ実行したい処理」をハンドラに書きます。 notify: Reload nginx を書いたタスクが changed になったときだけ実行されます。

roles/nginx_setup/handlers/main.yml
– name: Reload nginx ansible.builtin.service: name: nginx state: reloaded

defaults と vars の違い

defaults/main.yml は「外から上書き可能なデフォルト値」、vars/main.yml は「ロール内部で固定する値」です。外から変えてほしくない定数は vars/ に、カスタマイズしてほしい値は defaults/ に書きましょう。


タスクを書いてロールを仕上げる

実際にタスクが動くロールを作ってみましょう。 ここでは「テスト用ディレクトリを作成して設定ファイルを配置する」シンプルなロールです。

roles/nginx_setup/tasks/main.yml
– name: Show OS information ansible.builtin.debug: msg: “OS: {{ ansible_os_family }} {{ ansible_distribution_version }}” – name: Create a test directory ansible.builtin.file: path: /tmp/ansible_test state: directory mode: ‘0755’ – name: Write a config file ansible.builtin.copy: content: | # Managed by Ansible server_name = {{ server_name }} dest: /tmp/ansible_test/server.conf mode: ‘0644’

{{ ansible_distribution_version }} のような変数は gather_facts: true で自動取得できます。 {{ server_name }}defaults/main.yml で定義した変数です。


Playbook でロールを呼び出す

ロールを呼び出す Playbook は非常にシンプルです。

playbook.yml
– name: Configure web server hosts: webservers become: true gather_facts: true roles: – nginx_setup

roles: - nginx_setup の2行だけでロール内の全タスクが実行されます。 実際に実行してみます。

ubuntu@server: ~/myproject
$ ansible-playbook -i hosts playbook.yml PLAY [Configure web server] ************************************ TASK [Gathering Facts] ***************************************** ok: [localhost] TASK [nginx_setup : Show OS information] *********************** ok: [localhost] => { “msg”: “OS: Debian 24.04” } TASK [nginx_setup : Create a test directory] ******************* changed: [localhost] TASK [nginx_setup : Write a config file] *********************** changed: [localhost] PLAY RECAP ***************************************************** localhost : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

実際に Docker コンテナ(ubuntu:24.04 / ansible 9.2.0)で実行した結果です。 PLAY RECAPfailed=0 と出ればロールの適用成功 です。

ロールを使ったPlaybook実行結果(ok=4 changed=2 failed=0)(実測)
ロールを使ったPlaybook実行結果(ok=4 changed=2 failed=0)(実測)

タスク名が nginx_setup : Create a test directory のように「ロール名 : タスク名」形式で表示されます。 複数ロールを組み合わせたときに、どのロールのタスクかがひと目でわかります。

変数を Playbook から上書きする

ロールの defaults で定義した変数は、Playbook の varshost_vars から上書きできます。

playbook.yml(変数上書き例)
– name: Configure web server hosts: webservers become: true vars: server_name: “linuxlab.jp” nginx_port: 8080 roles: – nginx_setup

Ansible Galaxy のコミュニティロールを使う

Ansible Galaxy は、コミュニティが公開しているロールを検索・インストールできる公式リポジトリです。 nginx・MySQL・Docker などの主要ソフトウェアのロールがすでに公開されています。

geerlingguy 氏(Jeff Geerling)のロールが特に有名です。 実際にインストールしてみます。

ubuntu@server: ~
$ ansible-galaxy role install geerlingguy.git Starting galaxy role install process – downloading role ‘git’, owned by geerlingguy – downloading role from https://github.com/geerlingguy/ansible-role-git/archive/3.0.1.tar.gz – extracting geerlingguy.git to ~/.ansible/roles/geerlingguy.git – geerlingguy.git (3.0.1) was installed successfully $ ansible-galaxy list # /root/.ansible/roles – geerlingguy.git, 3.0.1

実際に Docker コンテナ(ansible-core 2.21.0)で実行しました。 geerlingguy.git 3.0.1 が GitHub から自動ダウンロードされ、インストールされました。

ansible-galaxy によるコミュニティロール geerlingguy.git のインストール(実測)
ansible-galaxy によるコミュニティロール geerlingguy.git のインストール(実測)

インストールしたロールはすぐに Playbook で使えます。

playbook.yml(Galaxy ロール使用例)
– name: Install git via Galaxy role hosts: all become: true roles: – geerlingguy.git

requirements.yml でロールを管理する

複数のロールをチームで管理するなら requirements.yml を使うのがベストプラクティスです。 どのロールのどのバージョンを使うかをファイルで管理できます。

requirements.yml
roles: – name: geerlingguy.git version: “3.0.0” – name: geerlingguy.apache version: “3.2.0” collections: – name: community.general version: “>=8.0.0”

requirements.yml を作ったら、以下のコマンドで一括インストールできます。

ubuntu@server: ~/myproject
$ ansible-galaxy role install -r requirements.yml Starting galaxy role install process – geerlingguy.git (3.0.1) was installed successfully – geerlingguy.apache (3.2.0) was installed successfully $ ansible-galaxy collection install -r requirements.yml Starting galaxy collection install process community.general:8.x.x was installed successfully

requirements.yml を Git で管理することで、チーム全員が同じバージョンのロールを使えます。 新しいメンバーも ansible-galaxy install -r requirements.yml を実行するだけで環境が整います。

プロジェクト構成のベストプラクティス

  • roles/ — 自作ロール(プロジェクト固有の設定)
  • requirements.yml — Galaxy からインストールするロール・コレクション
  • playbook.yml — エントリポイントとなる Playbook
  • inventory/ — 環境別のインベントリ(prod・staging・dev)
  • group_vars/ — グループ単位の変数
  • host_vars/ — ホスト単位の変数

よくあるエラーと解決策

エラー①:「could not find role in…」

ubuntu@server: ~
ERROR! the role ‘nginx_setup’ was not found in: /root/.ansible/roles /etc/ansible/roles

原因:Playbook からロールへのパスが通っていない。

解決:Playbook と roles/ ディレクトリが同じ場所にあるか確認する。 または ansible.cfgroles_path を設定する。

ansible.cfg
[defaults] roles_path = ./roles:~/.ansible/roles

エラー②:「An exception occurred during task execution」(テンプレート変数未定義)

ubuntu@server: ~
fatal: [hostname]: FAILED! => {“msg”: “AnsibleUndefinedVariable: ‘nginx_port’ is undefined”}

原因:変数が defaults/main.ymlvars/main.yml に定義されていない。

解決defaults/main.yml にデフォルト値を追加する。

エラー③:Ubuntu 22.04 で「FQCN を使え」という警告

ubuntu@server: ~
[WARNING]: While constructing a mapping from roles/tasks/main.yml… [WARNING]: ‘file’ is not a valid attribute for a Play

原因:古い ansible(2.10 系)では copy と書くと曖昧。

解決ansible.builtin.copy のように FQCN(完全修飾コレクション名)で書く。 Ubuntu 24.04(ansible 9.2.0)では FQCN が標準です。


まとめ

Ubuntu 24.04 で Ansible ロールを作成・実行する手順を実際に検証しました。

  • Ubuntu 24.04(Noble)の apt では ansible 9.2.0 が入る。22.04(Jammy)は 2.10.7 と古いため pip 推奨
  • ansible-galaxy role init <名前> で tasks・defaults・handlers など8ファイルが一発生成される
  • Playbook に roles: - ロール名 を書くだけで呼び出せる。実測で ok=4 changed=2 failed=0 を確認
  • defaults(上書き可)と vars(固定)の使い分けでロールの柔軟性が大きく変わる
  • Ansible Galaxy から geerlingguy.git 3.0.1 をインストール確認。requirements.yml でバージョン固定管理が可能

ロールに慣れたら、次は Molecule(ロールのテストフレームワーク)や、 Ansible Collections(ロールをさらに大きくパッケージングする仕組み)に挑戦してみてください。

VPS でサーバーを本格的に自動化したい場合は、Ansible と相性のいい Vultr の使い方もあわせてどうぞ。

コメント

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