この記事の要点
• Playbookで複数サーバーの設定を宣言的に記述
• ansible-playbookでタスクを一括実行、--checkで事前確認
• inventoryでホストをグループ管理、変数で環境差分を吸収
基本コマンド
| コマンド | 説明 |
|---|---|
ansible all -m ping | すべてのホストに疎通確認 |
ansible web -m shell -a "uptime" | web グループでコマンド実行 |
ansible-playbook site.yml | Playbook 実行 |
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 | 対象ホストまたはグループ |
become | sudo で実行(yes/no) |
vars | 変数定義 |
tasks | 実行するタスクのリスト |
handlers | 変更時だけ実行されるタスク |
実践メモ: nameは必須ではありませんが、実行時にログに表示されるため必ず付けておくと後から追跡しやすくなります。
よく使うモジュール
| モジュール | 説明 |
|---|---|
apt / yum | パッケージ管理 |
copy | ファイルコピー |
template | Jinja2 テンプレートでファイル生成 |
service | サービス起動・停止・有効化 |
file | ファイル・ディレクトリ作成・削除 |
user | ユーザー管理 |
command / shell | コマンド実行 |
git | Git リポジトリのクローン |
- 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" |
| 2 | Playbook の vars セクション |
| 3 | vars_files で読み込んだファイル |
| 4 | ロールの vars/main.yml |
| 5 | inventory の [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-pass | Playbook 実行時にパスワード入力 |
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 install | install タグだけ実行 |
ansible-playbook site.yml --skip-tags start | start タグをスキップ |
ansible-playbook site.yml --list-tags | タグ一覧表示 |
実践メモ: tagsを使うと、インストールだけや設定だけを部分的に実行できます。大きな Playbook の一部だけ再実行したいときに便利です。
参考リソース
- Ansible Documentation - 公式ドキュメント
- Ansible Galaxy - ロール・コレクションのレジストリ
- Ansible Module Index - モジュール一覧
- Best Practices - 公式ベストプラクティス
関連記事
- Terraform チートシート - Infrastructure as Code のリファレンス
- Linux 基礎 - サーバー管理の基礎知識