Ansible

初級 | 8分 で読める | 2026.04.24

公式ドキュメント

この記事の要点

Playbookで複数サーバーの設定を宣言的に記述
ansible-playbookでタスクを一括実行、--checkで事前確認
inventoryでホストをグループ管理、変数で環境差分を吸収

基本コマンド

コマンド説明
ansible all -m pingすべてのホストに疎通確認
ansible web -m shell -a "uptime"web グループでコマンド実行
ansible-playbook site.ymlPlaybook 実行
ansible-playbook site.yml --checkドライラン(変更なし)
ansible-playbook site.yml --diff変更差分を表示
ansible-playbook site.yml --limit web特定ホストだけ実行
ansible-playbook site.yml -vvv詳細ログ出力

ポイント: --check--diffを組み合わせると、実際に変更する前に何が変わるかを確認できます。本番環境では必ず事前確認してから実行します。

Playbook 基本構造

---
- name: Configure web servers
  hosts: web
  become: yes
  vars:
    http_port: 80

  tasks:
    - name: Install nginx
      apt:
        name: nginx
        state: present

    - name: Start nginx
      service:
        name: nginx
        state: started
        enabled: yes
キー説明
hosts対象ホストまたはグループ
becomesudo で実行(yes/no)
vars変数定義
tasks実行するタスクのリスト
handlers変更時だけ実行されるタスク

実践メモ: nameは必須ではありませんが、実行時にログに表示されるため必ず付けておくと後から追跡しやすくなります。

よく使うモジュール

モジュール説明
apt / yumパッケージ管理
copyファイルコピー
templateJinja2 テンプレートでファイル生成
serviceサービス起動・停止・有効化
fileファイル・ディレクトリ作成・削除
userユーザー管理
command / shellコマンド実行
gitGit リポジトリのクローン
- name: Copy nginx config
  copy:
    src: nginx.conf
    dest: /etc/nginx/nginx.conf
    owner: root
    group: root
    mode: '0644'
  notify: Restart nginx

handlers:
  - name: Restart nginx
    service:
      name: nginx
      state: restarted

ポイント: notifyでハンドラを呼び出すと、設定ファイルが変更されたときだけサービスを再起動します。無駄な再起動を防ぐことができます。

Inventory ファイル

INI 形式

[web]
web1.example.com
web2.example.com

[db]
db1.example.com

[production:children]
web
db

[production:vars]
ansible_user=deploy
ansible_port=22

YAML 形式

all:
  children:
    web:
      hosts:
        web1.example.com:
        web2.example.com:
    db:
      hosts:
        db1.example.com:
  vars:
    ansible_user: deploy

実践メモ: [group:vars]でグループ共通の変数を定義できます。環境ごとに異なる SSH ポートやユーザーを inventory で管理すると Playbook がシンプルになります。

変数の優先順位(高→低)

順位変数の場所
1コマンドライン -e "var=value"
2Playbook の vars セクション
3vars_files で読み込んだファイル
4ロールの vars/main.yml
5inventory の [group:vars]
6ロールの defaults/main.yml

注意: -eで渡した変数はすべてを上書きします。本番環境で誤った変数を渡すと想定外の動作になるため、慎重に使ってください。

条件分岐とループ

構文説明
when: ansible_os_family == "Debian"条件付き実行
loop: "{{ users }}"リストでループ
loop: "{{ range(1, 5) }}"範囲でループ
with_itemsループ(古い構文)
- name: Install packages
  apt:
    name: "{{ item }}"
    state: present
  loop:
    - nginx
    - git
    - vim

- name: Configure firewall on CentOS
  firewalld:
    service: http
    state: enabled
  when: ansible_os_family == "RedHat"

ポイント: whenで OS の種類を判定すると、Ubuntu と CentOS で異なるモジュールを使い分けられます。Playbook を複数 OS で共通化できます。

ロール構造

Ansible 2.x のロールディレクトリ標準構造(公式: https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_reuse_roles.html):

roles/
  webserver/
    tasks/
      main.yml       # タスク本体
    handlers/
      main.yml       # ハンドラ
    templates/
      nginx.conf.j2  # テンプレート
    files/
      index.html     # 静的ファイル
    vars/
      main.yml       # 変数
    defaults/
      main.yml       # デフォルト変数
    meta/
      main.yml       # 依存関係

Playbook からロールを呼び出す

- hosts: web
  roles:
    - webserver
    - firewall

実践メモ: ロールは再利用可能な設定のまとまりです。webserver や database など役割ごとにディレクトリを分けると保守性が上がります。

テンプレート(Jinja2)

# nginx.conf.j2
server {
    listen {{ http_port }};
    server_name {{ ansible_hostname }};

    {% for location in locations %}
    location {{ location.path }} {
        proxy_pass {{ location.backend }};
    }
    {% endfor %}
}
- name: Deploy nginx config
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
構文説明
{{ var }}変数展開
{% if ... %}条件分岐
{% for ... %}ループ
{{ var | default("value") }}デフォルト値

ポイント: templateモジュールは Jinja2 でファイルを動的生成します。ホストごとに異なる設定を自動で埋め込めます。

Vault(暗号化)

コマンド説明
ansible-vault create secrets.yml暗号化ファイル作成
ansible-vault edit secrets.yml暗号化ファイル編集
ansible-vault encrypt file.yml既存ファイルを暗号化
ansible-vault decrypt file.yml復号化
ansible-playbook --ask-vault-passPlaybook 実行時にパスワード入力
ansible-playbook --vault-password-fileパスワードファイル指定
# secrets.yml (暗号化)
db_password: "supersecret"
api_key: "abc123"

注意: Vaultで暗号化してもパスワードファイルを Git にコミットすると意味がありません。パスワードは環境変数や CI/CD の Secrets で管理してください。

タグ

- name: Install packages
  apt:
    name: nginx
  tags:
    - install
    - packages

- name: Start nginx
  service:
    name: nginx
    state: started
  tags:
    - start
コマンド説明
ansible-playbook site.yml --tags installinstall タグだけ実行
ansible-playbook site.yml --skip-tags startstart タグをスキップ
ansible-playbook site.yml --list-tagsタグ一覧表示

実践メモ: tagsを使うと、インストールだけ設定だけを部分的に実行できます。大きな Playbook の一部だけ再実行したいときに便利です。

参考リソース

関連記事

この技術を体系的に学びたいですか?

未来学では東証プライム上場企業のITエンジニアが24時間サポート。月額24,800円から、退会金0円のオンラインIT塾です。

メールで無料相談する
← 一覧に戻る