Ansible

作成日:
Ansible infrastructure DevOps automation

概要

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 がマネージドノードにコピーして実行する。標準で数千のモジュールが提供されており(yumaptcopyservicetemplate など)、コレクション(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

commandshell モジュールはシェルコマンドをそのまま実行するため冪等性がない。creates パラメータや changed_when で手動担保が必要。

他の構成管理ツールとの比較

観点AnsibleChefPuppetSaltStack
エージェント不要必要必要あり(なしも可)
通信モデルPush 型Pull 型Pull 型Push 型(デフォルト)
設定記述YAMLRuby DSLPuppet DSLYAML / Python
学習コスト低い高い中程度中程度

周辺ツール

ツール説明
AWXAnsible に Web UI と REST API を追加した OSS プロジェクト
Ansible Automation PlatformAWX をベースにした Red Hat の商用製品(旧 Ansible Tower)
ansible-lintPlaybook・ロールの静的解析ツール
MoleculeAnsible ロールの開発・テストフレームワーク
Ansible Galaxyコミュニティ製ロール・コレクションの配布ハブ

関連トピック

参考