Ansible でサーバー情報を取得する

### はじめに

Ansible は、現代の IT 環境における不可欠なツールの一つです。この強力なオープンソースソフトウェアは、サーバーの構成管理、アプリケーションのデプロイメント、タスクの自動化など、多様な機能を提供します。Ansible の主要な特長はそのシンプルさと使いやすさにあります。プレイブックと呼ばれる YAML 形式の構成ファイルを用いて、複雑な作業を簡潔に記述できる点が魅力です。また、エージェントレスアーキテクチャにより、追加のソフトウェアを対象ノードにインストールする必要がなく、SSH や WinRM を利用してリモートマシンと通信します。

サーバー管理において、Ansible は特に情報収集において重要な役割を果たします。サーバーの状態を正確に理解し、適切な管理やトラブルシューティングを行うためには、さまざまなサーバー情報の取得が不可欠です。これにはオペレーティングシステムの詳細、インストールされているパッケージ、ネットワーク設定、セキュリティポリシーなどが含まれます。Ansible を使用することで、これらの情報を効率的に収集し、サーバーの健全性を保つための重要な判断材料を提供します。この記事では、Ansible を活用してサーバー情報を取得する方法とその利点について詳しく掘り下げていきます。

### サーバー情報とは？

サーバー情報は、サーバーの運用と管理に不可欠なデータを総称しています。これらの情報は主に二つのカテゴリーに分けられます：

**動的情報**

*   **リアルタイムの状態**：サーバーの現在のパフォーマンスと健全性を反映します。
    *   **CPU使用率**：システムの処理能力と負荷
    *   **メモリ使用量**：使用中のメモリと利用可能な容量
    *   **ネットワークトラフィック**：データの送受信状況
    *   **実行中のプロセス**：サーバー上で動作しているアプリケーション

**静的情報**

*   **基本的な属性や設定**：サーバーの基本構造やセキュリティ状態を示します
    *   **オペレーティングシステムのバージョン**：インストールされているOSの詳細
    *   **インストールされているパッケージ**：システムにインストールされたソフトウェア
    *   **ファイアウォールの設定**：ネットワークセキュリティの状況
    *   **ネットワーク設定**：IPアドレスやDNS設定
    *   **ハードウェアの構成**：CPU、メモリ、ストレージの仕様

これらの情報を適切に収集し管理することで、サーバーの安定性とセキュリティを維持し、効率的な運用を実現することができます。サーバー管理者にとって、これらのデータは日々の業務で欠かせないものとなります。

### Ansible で取得しやすいサーバー情報

Ansible は静的なサーバー情報の収集に特化していますが、リアルタイムのモニタリングや動的なデータ収集には向いていません。この理由は、Ansible のアーキテクチャにあります。Ansible は構成管理と自動化を主目的としており、定期的に設定を適用し、状態を一定に保つことに重点を置いています。一方で、リアルタイムでのデータ変動に迅速に対応するには、継続的な監視と高速な反応が必要で、これは Ansible の設計範囲外です。したがって、システム設定、インストールされたパッケージ、ネットワーク設定などの静的情報の収集と管理には優れていますが、CPU 使用率やメモリ使用量などの動的な情報の監視には他のツールを併用することが推奨されます。

### Playbook サンプル

#### システム情報を取得する

Ansible を使用してシステム情報を取得する場合、setup モジュールを活用することができます。このモジュールは、リモートホストの多くのシステム関連情報を自動的に収集します。

このプレイブックは、指定されたホスト（`your_host`で指定）に対して`setup`モジュールを実行し、さまざまなシステム関連情報を収集します。その後、`debug`モジュールを使用して、必要な情報を表示します。

```yaml
- name: システム情報を収集する
  hosts: your_host
  tasks:
    - name: システム情報を取得
      ansible.builtin.setup:
      
    - name: 情報を表示
      ansible.builtin.debug:
        msg: 
          - "OSタイプ: {{ ansible_distribution }} {{ ansible_distribution_version }}"
          - "CPU情報: {{ ansible_processor }} (コア数: {{ ansible_processor_cores }})"
          - "メモリ: 合計 {{ ansible_memtotal_mb }} MB, 利用可能 {{ ansible_memfree_mb }} MB"
          - "ディスク使用状況: {{ ansible_mounts }}"
          - "アップタイム: {{ ansible_uptime_seconds }} 秒"
```

#### ネットワーク情報

Ansible を使用してネットワーク情報を収集するには、setup モジュールおよびその他のモジュールやコマンドを組み合わせる必要があります。以下に、IPアドレス、ネットワークトラフィックのデータ、および開いているポートや実行中のネットワークサービスに関する情報を収集するための Ansible プレイブックの例を示します。

```yaml
- name: ネットワーク情報を収集する
  hosts: your_host
  tasks:
    - name: ネットワーク情報を取得
      ansible.builtin.setup:
        gather_subset:
          - network
      
    - name: IPアドレス情報を表示
      ansible.builtin.debug:
        msg: 
          - "パブリックIP: {{ ansible_default_ipv4.address }}"
          - "プライベートIP: {{ ansible_default_ipv4.address }}"

    - name: ネットワークトラフィックデータを取得
      ansible.builtin.command: netstat -i
      register: netstat_output

    - name: ネットワークトラフィックデータを表示
      ansible.builtin.debug:
        msg: "{{ netstat_output.stdout_lines }}"

    - name: 開いているポートを取得
      ansible.builtin.command: netstat -tuln
      register: open_ports

    - name: 開いているポートを表示
      ansible.builtin.debug:
        msg: "{{ open_ports.stdout_lines }}"
```

#### セキュリティパッチの適用状況

Linuxシステムでは、パッケージマネージャ（例：`apt`, `yum`）を利用してインストール済みのパッケージと更新可能なパッケージのリストを取得できます。

```yaml
- name: セキュリティ関連情報を収集する
  hosts: your_host
  tasks:
    - name: セキュリティパッチの適用状況を確認（Debian/Ubuntuの場合）
      ansible.builtin.apt:
        update_cache: yes
        upgrade: dry-run
      register: apt_upgrade
      when: ansible_os_family == "Debian"

    - name: セキュリティパッチの適用状況を表示（Debian/Ubuntuの場合）
      ansible.builtin.debug:
        var: apt_upgrade
      when: ansible_os_family == "Debian"
```

#### ファイアウォールの設定

`iptables` や `firewalld` などのファイアウォールツールの設定状況を確認します。

```yaml
    - name: iptablesの設定を表示
      ansible.builtin.command: iptables -L
      register: iptables_output

    - name: iptablesの設定を表示
      ansible.builtin.debug:
        msg: "{{ iptables_output.stdout_lines }}"
```

#### インストールされているアプリケーションやサービス

インストールされているパッケージのリストを取得するには、各 OS に応じたパッケージ管理ツールを使用します。例として、以下は Debian/Ubuntu システム用のタスクです。

```yaml
- name: アプリケーション情報を収集する
  hosts: your_host
  tasks:
    - name: インストールされているパッケージをリストアップ（Debian/Ubuntuの場合）
      ansible.builtin.command: dpkg-query -l
      register: installed_packages

    - name: インストールされているパッケージを表示
      ansible.builtin.debug:
        msg: "{{ installed_packages.stdout_lines }}"
```

#### ユーザーとグループの情報

Ansibleを使用してシステム上のユーザーアカウントとグループの情報を取得するためのプレイブックの例を以下に示します。このプレイブックは、対象ホスト上の全ユーザーとグループのリストを収集します。

```yaml
---
- name: ユーザーとグループの情報を取得する
  hosts: your_host
  become: yes  # 管理者権限が必要な場合
  tasks:
    - name: ユーザーアカウントの情報を取得
      ansible.builtin.command: awk -F: '{print $1}' /etc/passwd
      register: users

    - name: ユーザーアカウントの情報を表示
      ansible.builtin.debug:
        msg: "{{ users.stdout_lines }}"

    - name: グループの情報を取得
      ansible.builtin.command: awk -F: '{print $1}' /etc/group
      register: groups

    - name: グループの情報を表示
      ansible.builtin.debug:
        msg: "{{ groups.stdout_lines }}"
```


このプレイブックでは、以下のステップを実行します：

1.  `/etc/passwd` ファイルからユーザーのリストを取得します。
2.  取得したユーザーのリストを表示します。
3.  `/etc/group` ファイルからグループのリストを取得します。
4.  取得したグループのリストを表示します。

このプレイブックを実行する前に、`your_host` を対象ホストに置き換え、Ansibleがそのホストにアクセスできるように設定しておく必要があります。また、システムによっては `/etc/passwd` や `/etc/group` ファイルの場所が異なる場合があるので、その場合は適宜パスを調整してください。

### まとめ

この記事では、Ansible を使用してサーバー情報を収集する方法を詳しく見てきました。Ansible の強みは、そのシンプルさとエージェントレスなアーキテクチャにあります。これにより、リモートホストの静的な情報を効率的に収集し、サーバーの構成を容易に把握できます。動的情報のリアルタイムモニタリングには別のツールを使うことが推奨されますが、静的な情報に関しては、Ansible が提供する多様なモジュールと機能が、サーバー管理の自動化と簡素化を可能にします。

提供されたプレイブックのサンプルを通じて、Ansible がどのように様々なタイプのサーバー情報を取得できるかが明確になりました。これらのサンプルは、実際の環境での使用に際して、カスタマイズや拡張が可能です。Ansible の利用を通じて、システム管理者はサーバーの状態をより効率的に監視し、適切なメンテナンスやトラブルシューティングを行うことができます。

この記事が、Ansible を用いたサーバー情報の収集と管理に関して、有用なガイドとなることを願っています。Ansible の機能を最大限に活用し、より効率的かつ効果的なサーバー管理を実現しましょう。