Ansible基礎 #2 - プレイブック

Last Edited: 11/16/2025

このブログ記事では、Ansibleにおけるプレイブックについて紹介します。

DevOps

前回の記事では、Ansibleを始めるために必要な基本概念とインストール方法について説明しました。 そこで、この記事では、管理ノードへの接続方法、アドホックコマンドの実行、 および基本的な設定のためのプレイブックの使用方法について説明します。

アドホックコマンド

管理ノードに設定を適用するコマンドを実行する前に、制御ノード上でインベントリファイルを設定する必要があります。 このファイルには、管理するノードのIPアドレスまたはホスト名が保存されます。 これを手動で行うには、ローカルリポジトリにinventoryファイルを作成し、 1行につき1つのIPアドレスまたはホスト名を単純に列挙します。 (より良いワークフローのためにインベントリファイルを自動生成または編集することもできます。) 設定が成功したかどうかは、アドホックコマンドansible all --key-file <key_file_path> -i inventory -m ping を実行して確認できます。これはpingモジュールを使用してホストへのSSH接続を確認するものです。

ansible.cfg
[defaults]
inventory = inventory
private_key_file = <key_file_path>

しかし、毎回上記のような長いコマンドを実行するのは、Ansibleのようなツールを使用する目的に反します。 そこで、ローカルリポジトリにデフォルトパラメータが保存され、参照されるansible.cfgファイルを作成できます。 (グローバルなデフォルト設定のためにetc/ansibleフォルダにansible.cfgがありますが、 一般的には予期しない動作を避けるために、ローカルのansible.cfgを設定し、ローカルのデフォルト設定を構成することが推奨されます。) 設定ファイルを設定した後は、ansible all -m pingのように同じアドホックコマンドを実行できます。 また、gather_factsモジュールを使用して、プロセッサの詳細、オペレーティングシステム、 環境変数などのサーバー情報を収集することもできます。 また--limit <host>を使用して特定のホストの情報を抽出でき、これはトラブルシューティングなどに役立ちます。

aptなどのモジュールをansible all -m apt -a "update_cache=true"のように使用してサーバーに変更を加えることもできます。 しかし、上記のコマンドは失敗する可能性があります。これは、管理対象ノード上のansibleユーザーが、 sudoなしでaptコマンドを実行する権限を持っていないためです。 したがって、--become--ask-become-passを追加してsudoパスワード(管理対象ノード間で同じであると仮定)を提供し、 aptコマンドを実行する必要があります。このモジュールは、-aフラグの下で提供される引数に応じて、パッケージのインストール、 アンインストール、アップグレードに使用できます。これらの引数の説明や他のモジュールの詳細は Ansibleドキュメント で確認できます。

プレイブック

アドホックコマンドは、すべてのサーバーに一度に変更を適用でき便利ですが、サーバーを設定するために複数のコマンドを実行する必要があることが多く、 多くのアドホックコマンドが必要になる場合もある他、行われている変更を追跡することが困難になる場合があります。 必要なコマンドやモジュールは、オペレーティングシステムやLinuxディストリビューションによって異なる場合もあり、 アドホックコマンドで異なるホストを扱うのは面倒です。 そこで、複数のタスクを実行するために、プレイブックと呼ばれるYAMLファイルを使用することが多いです。

install_apache.yaml
- hosts: all
  become: true
  tasks:
  - name: update repository index for Debian/Ubuntu
    apt:
        update_cache: yes
    when: ansible_distribution in ["Debian", "Ubuntu"]
 
  - name: install apache2 and php package for Ubuntu (22.0.4)
    apt:
        name: 
            - apache2
            - libapache2-mod-php
        state: latest
    when: ansible_distribution == "Ubuntu" and ansible_distribution_version = 22.0.4
 
  - name: install apache and php for CentOS
    dnf:
        name:
            - httpd
            - php
        state: latest
        update_cache: yes
    when: ansible_distribution == "CentOS"

上は、UbuntuとCentOSサーバーにApacheとPHPをインストールするプレイブックの例で、プレイブックのさまざまな機能を実演しています。 when文はオプションで、gather_factsのフィールドに基づいて異なるサーバーにモジュールを適用するために使用されます。 Pythonと同様にinandなどの演算子を使用して、様々な場合分けを行うことができます。 プレイブックに基づいて変更を適用するには、ansible-playbook --ask-become-pass install_apache.yamlを使用できます。 コマンドを実行した後、すべての変更が正常に行われたことが確認できるはずです。 また、以下のように、プレイブックをより簡潔に書き直すこともできます。

install_apache.yaml
- hosts: all
  become: true
  tasks:
  - name: install apache and php
    package:
        name:
            - "{{ apache_package }}"
            - "{{ php_package }}"
        state: latest
        update_cache: yes

上はAnsibleのpackageモジュールを利用しており、 サーバーで実行されているオペレーティングシステムに応じて適切なパッケージマネージャを実行します。 また、インベントリから値を取得するテンプレートもパッケージ名に使用しています。 したがって、これが機能するためには、 インベントリにすべてのホストに対してapache_package=httpd php_package=phpのようなキーと値のペアを追加する必要があります。 この方法でパッケージをインストールするのが良いかどうかは議論の余地があります(個人的には、より明示的でインベントリファイルに 値をハードコーディングすることを避ける最初のアプローチを好みます)が、 どちらもAnsibleが複数のノードを管理することに適しているかを示していると言えるでしょう。

結論

この記事では、管理ノードに異なるパッケージをインストールするためにモジュールを使用するアドホックコマンドとプレイブックの基本について説明しました。 利用可能なモジュールの詳細については、下記に引用したAnsibleドキュメントを確認できます。 この記事では、異なるオペレーティングシステムとプロセッサを持つ複数の管理ノードを、 わずか1つまたは数個のコマンドで設定できるというAnsibleの便利さの一部をすでに実演しましたが、 次の記事では、管理ノードのより柔軟な設定を可能にするAnsibleの機能について説明します。

リソース