Ansible
概要
Ansible は Red Hat が開発するオープンソースの IT 自動化・構成管理ツール。サーバーのプロビジョニング、アプリケーションのデプロイ、ネットワーク機器の設定、ワークフローのオーケストレーションを自動化する。
Red Hat が掲げるコンセプトは 「Simple, Powerful, Agentless」 の3点。
- Simple: YAML 形式のプレイブックで人間が読みやすい設定ファイルを記述できる
- Powerful: OS、クラウド、ネットワーク機器など多様な対象を管理できる
- Agentless: 管理対象ノードに専用エージェントのインストールが不要
基本概念
コントロールノード / マネージドノード
- コントロールノード: Ansible を実行するマシン
- マネージドノード(ホスト): 管理対象となるサーバーやネットワーク機器。Ansible のインストールは不要
インベントリ
管理対象ノードのリスト。INI 形式または YAML 形式で記述し、グループ化による一括変数割り当てや対象ホスト選択が可能。
[webservers]
web1.example.com
web2.example.com
[dbservers]
db1.example.com
プレイブック
YAML で記述された自動化の定義ファイル。「どのホストに」「何を実行するか」を宣言的に記述する。
- name: Apache をインストールする
hosts: webservers
tasks:
- name: httpd をインストール
ansible.builtin.yum:
name: httpd
state: present
モジュール
タスクの実体となるコードユニット。Ansible がマネージドノードにコピーして実行する。標準で数千のモジュールが提供されており(yum、apt、copy、service、template など)、コレクション(Collection)単位でパッケージ化・配布される。
ロール
タスク、ハンドラ、変数、テンプレート、ファイルなどをまとめた再利用可能なコンテンツ単位。Ansible Galaxy で共有・配布できる。
roles/
webserver/
tasks/main.yml
handlers/main.yml
templates/nginx.conf.j2
vars/main.yml
ハンドラ
前のタスクが changed 状態を返した場合にのみ実行される特殊なタスク。設定ファイル変更後のサービス再起動などに使用する。プレイ内のすべてのタスクが完了した後に一度だけ実行される。
ファクト
プレイ実行開始時に Ansible が自動収集するマネージドノードの情報(OS の種類、IP アドレス、メモリ量など)。Playbook 内の条件分岐や変数として利用できる。
- name: OS に応じた処理
ansible.builtin.package:
name: httpd
state: present
when: ansible_os_family == "RedHat"
エージェントレスの仕組み
エージェントをインストールする代わりに、SSH プロトコルを使ってリモート接続し、Python スクリプトを転送・実行 することで管理対象を制御する。
マネージドノードの要件は「SSH アクセスが可能」かつ「Python 2.4 以上がインストールされている」ことのみ。ほとんどの Linux 環境で標準要件を満たす。Windows ホストの場合は SSH の代わりに WinRM(Windows Remote Management)を使用する。
冪等性(Idempotency)
冪等性とは「同じ操作を何度繰り返しても結果が変わらない性質」のこと。Ansible の大半のモジュールは冪等性を持ち、実行前にシステムの現在状態を確認して、すでに望ましい状態に達していれば何もしない宣言的アプローチをとる。
- 1回目の実行: httpd が未インストール → インストールを実行 →
changed - 2回目以降: httpd がインストール済み → 何もしない →
ok
command や shell モジュールはシェルコマンドをそのまま実行するため冪等性がない。creates パラメータや changed_when で手動担保が必要。
他の構成管理ツールとの比較
| 観点 | Ansible | Chef | Puppet | SaltStack |
|---|---|---|---|---|
| エージェント | 不要 | 必要 | 必要 | あり(なしも可) |
| 通信モデル | Push 型 | Pull 型 | Pull 型 | Push 型(デフォルト) |
| 設定記述 | YAML | Ruby DSL | Puppet DSL | YAML / Python |
| 学習コスト | 低い | 高い | 中程度 | 中程度 |
周辺ツール
| ツール | 説明 |
|---|---|
| AWX | Ansible に Web UI と REST API を追加した OSS プロジェクト |
| Ansible Automation Platform | AWX をベースにした Red Hat の商用製品(旧 Ansible Tower) |
| ansible-lint | Playbook・ロールの静的解析ツール |
| Molecule | Ansible ロールの開発・テストフレームワーク |
| Ansible Galaxy | コミュニティ製ロール・コレクションの配布ハブ |
関連トピック
参考
- 公式ドキュメント: https://docs.ansible.com/
- 基本概念(公式): https://docs.ansible.com/ansible/latest/getting_started/basic_concepts.html
- Playbook ガイド(公式): https://docs.ansible.com/ansible/latest/playbook_guide/index.html
- Ansible Galaxy: https://galaxy.ansible.com/