Ansible で長形式のファイルとディレクトリをリスト表示する方法

AnsibleAnsibleBeginner
オンラインで実践に進む

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

Ansible は、インフラストラクチャ管理とデプロイを簡素化する、広く利用されている IT 自動化ツールです。この実験(Lab)では、Ansible を使用して、ファイルとディレクトリを詳細形式でリスト表示する方法を探求します。Ansible のセットアップ、プレイブックの作成、および組み込みモジュールを使用して、リモートシステムからファイル情報をリスト表示する方法を学びます。この実験(Lab)の終わりには、自動化ワークフローを強化できる Ansible コマンドとテクニックに関する実践的な経験が得られます。

Ansible のインストールとセットアップ

このステップでは、システムに Ansible をインストールし、ローカル環境を管理するための基本的なインベントリファイルを作成します。

Ansible のインストール

まず、パッケージマネージャーを使用して Ansible をインストールしましょう。

sudo apt update
sudo apt install -y ansible

インストールが完了したら、バージョンを確認して Ansible が正しくインストールされていることを確認します。

ansible --version

次のような出力が表示されるはずです。

ansible [core 2.12.0]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/labex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  ansible collection location = /home/labex/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.10.x (default, Ubuntu 22.04)
  jinja version = 3.0.3
  libyaml = True

Ansible インベントリの作成

インベントリファイルは、Ansible が操作できる管理対象ノードのリストです。この実験(Lab)では、ローカルマシンを含むシンプルなインベントリファイルを作成します。

Ansible プロジェクト用のディレクトリを作成します。

mkdir -p ~/project/ansible-lab
cd ~/project/ansible-lab

次に、VS Code エディターを使用してインベントリファイルを作成します。

  1. 左側のサイドバーにある「Explorer」アイコンをクリックします。
  2. ~/project/ansible-lab ディレクトリに移動します。
  3. 右クリックして「New File」を選択します。
  4. ファイル名を inventory.ini とします。
  5. ファイルに次の内容を追加します。
[local]
localhost ansible_connection=local

このインベントリファイルは、local というグループを定義し、ローカルホストのみを含み、Ansible が SSH を使用するのではなくローカルに接続するように指定します。

Ansible 設定ファイルの作成

デフォルト設定を指定するための基本的な Ansible 設定ファイルを作成しましょう。

  1. Explorer パネルで、ansible-lab ディレクトリを右クリックし、「New File」を選択します。
  2. ファイル名を ansible.cfg とします。
  3. 次の内容を追加します。
[defaults]
inventory = inventory.ini
host_key_checking = False

この設定ファイルは、Ansible にデフォルトで inventory.ini ファイルを使用するように指示し、実験(Lab)環境に役立つ SSH ホストキーチェックを無効にします。

セットアップのテスト

簡単なコマンドを実行して、Ansible のセットアップをテストしましょう。

cd ~/project/ansible-lab
ansible local -m ping

次のような出力が表示されるはずです。

localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

これにより、Ansible が正しく設定され、ローカルマシンと通信できることが確認されます。

ファイルをリスト表示するための基本的な Ansible プレイブックの作成

このステップでは、ファイルとディレクトリをリスト表示するための基本的な Ansible プレイブックを作成します。プレイブックは、管理対象ノードで実行される一連のタスクを定義する YAML ファイルです。

Ansible プレイブックの理解

プレイブックを作成する前に、プレイブックとは何かを理解しましょう。

  • プレイブックは、プレイのリストを含む YAML ファイルです。
  • 各プレイは、特定のホストグループで実行する一連のタスクを定義します。
  • タスクは、Ansible モジュールを呼び出す個々の操作です。
  • モジュールは、特定の操作を実行する再利用可能なコード単位です。

最初のプレイブックの作成

/etc ディレクトリの内容をリスト表示するシンプルなプレイブックを作成しましょう。

  1. Explorer パネルで、~/project/ansible-lab ディレクトリに移動します。
  2. 右クリックして「New File」を選択します。
  3. ファイル名を list_files.yml とします。
  4. 次の内容を追加します。
---
- name: List files and directories
  hosts: local
  tasks:
    - name: Get directory listing
      command: ls -l /etc
      register: directory_contents

    - name: Display directory contents
      debug:
        var: directory_contents.stdout_lines

このプレイブックが何をするのかを理解しましょう。

  • 最初の行 (---) は、YAML ドキュメントの開始を示します。
  • name: List files and directories は、プレイの説明的な名前です。
  • hosts: local は、このプレイが local グループ(インベントリで定義)のホストで実行されることを指定します。
  • tasks: は、実行するタスクのリストを開始します。
  • 最初のタスクは、コマンド ls -l /etc を実行し、結果を directory_contents という変数に格納します。
  • 2 番目のタスクは、directory_contents.stdout_lines 変数の内容を表示します。

プレイブックの実行

それでは、プレイブックを実行しましょう。

cd ~/project/ansible-lab
ansible-playbook list_files.yml

次のような出力が表示されるはずです。

PLAY [List files and directories] *****************************************************

TASK [Gathering Facts] ****************************************************************
ok: [localhost]

TASK [Get directory listing] **********************************************************
changed: [localhost]

TASK [Display directory contents] *****************************************************
ok: [localhost] => {
    "directory_contents.stdout_lines": [
        "total 1088",
        "drwxr-xr-x  2 root root    4096 Apr 15 12:34 acpi",
        "drwxr-xr-x  3 root root    4096 Apr 15 12:34 alternatives",
        "-rw-r--r--  1 root root    3028 Aug  1  2017 bash.bashrc",
        "drwxr-xr-x  2 root root    4096 Apr 15 12:34 bash_completion.d",
        "... [more files and directories] ..."
    ]
}

PLAY RECAP ***************************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

出力には、/etc ディレクトリの内容が詳細形式で表示され、パーミッション、所有者、グループ、サイズ、および変更日が含まれています。

別のディレクトリの使用

次に、プレイブックを変更して、/home/labex ディレクトリの内容をリスト表示してみましょう。

  1. エディターで list_files.yml ファイルを開きます。
  2. コマンドのパスを /etc から /home/labex に変更します。
  3. ファイルを次の内容で保存します。
---
- name: List files and directories
  hosts: local
  tasks:
    - name: Get directory listing
      command: ls -l /home/labex
      register: directory_contents

    - name: Display directory contents
      debug:
        var: directory_contents.stdout_lines

プレイブックをもう一度実行します。

ansible-playbook list_files.yml

出力には、/etc ではなく、/home/labex ディレクトリの内容が表示されるようになります。

長形式でのファイルリスト表示のための Ansible の File モジュールの使用

前のステップでは、command モジュールを使用して ls -l コマンドを実行しました。これは機能しますが、Ansible はファイルとディレクトリを扱うためにより専用のモジュール、ansible.builtin.file モジュールを提供しています。このステップでは、このモジュールと ansible.builtin.find モジュールを組み合わせて、より Ansible ネイティブな方法でファイルをリスト表示する方法を学びます。

find モジュールの使用

ansible.builtin.find モジュールは、特定の条件に一致するファイルを検索するように設計されています。command モジュールと比較して、より強力で柔軟な方法でファイルをリスト表示できます。

find モジュールを使用する新しいプレイブックを作成しましょう。

  1. Explorer パネルで、~/project/ansible-lab ディレクトリに移動します。
  2. 右クリックして「New File」を選択します。
  3. ファイル名を find_files.yml とします。
  4. 次の内容を追加します。
---
- name: Find files with Ansible
  hosts: local
  tasks:
    - name: Find all files in /etc
      ansible.builtin.find:
        paths: /etc
        file_type: any
      register: found_files

    - name: Display the first 10 files
      debug:
        var: found_files.files[:10]

このプレイブックは、find モジュールを使用して /etc ディレクトリ内のすべてのファイルとディレクトリを検索し、最初の 10 個の項目を表示します。

プレイブックを実行しましょう。

cd ~/project/ansible-lab
ansible-playbook find_files.yml

各ファイルに関する詳細情報を含む出力が表示されるはずです。これには以下が含まれます。

  • パス
  • モード(パーミッション)
  • 所有者とグループ
  • サイズ
  • 変更時刻

長形式の詳細を持つプレイブックの作成

次に、すべての詳細を含む長形式でファイルを表示する、より包括的なプレイブックを作成しましょう。

  1. Explorer パネルで、右クリックして「New File」を選択します。
  2. ファイル名を long_format.yml とします。
  3. 次の内容を追加します。
---
- name: List files in long format
  hosts: local
  tasks:
    - name: Find files in /etc
      ansible.builtin.find:
        paths: /etc
        file_type: any
        recurse: no
      register: found_files

    - name: Create a formatted list of files
      set_fact:
        formatted_files: "{{ formatted_files | default([]) + [item] }}"
      loop: "{{ found_files.files }}"
      loop_control:
        label: "{{ item.path }}"
      vars:
        item_info: >-
          {{ item.mode }} {{ item.uid | string | ljust(5) }}
          {{ item.gid | string | ljust(5) }} {{ item.size | string | ljust(10) }}
          {{ item.mtime | string | ljust(11) }} {{ item.path }}

    - name: Display files in long format
      debug:
        msg: "{{ formatted_files[:10] }}"

このプレイブックは次のことを行います。

  1. find モジュールを使用して、/etc ディレクトリ内のファイルを検索します。
  2. ls -l コマンドの出力に似た形式のリストを作成します。
  3. リストの最初の 10 個のファイルを表示します。

プレイブックを実行しましょう。

ansible-playbook long_format.yml

出力には、ls -l コマンドと同様の形式でファイルの詳細が表示されます。

条件に基づくファイルのフィルタリング

Ansible のモジュールを使用する利点の 1 つは、さまざまな条件に基づいてファイルをフィルタリングできることです。.conf で終わるファイル(設定ファイル)のみをリスト表示するプレイブックを作成しましょう。

  1. Explorer パネルで、右クリックして「New File」を選択します。
  2. ファイル名を filter_files.yml とします。
  3. 次の内容を追加します。
---
- name: List filtered files in long format
  hosts: local
  tasks:
    - name: Find configuration files in /etc
      ansible.builtin.find:
        paths: /etc
        patterns: "*.conf"
        file_type: file
      register: conf_files

    - name: Display configuration files
      debug:
        msg: "{{ item.mode }} {{ item.uid }} {{ item.gid }} {{ item.size }} {{ item.mtime }} {{ item.path }}"
      loop: "{{ conf_files.files }}"
      loop_control:
        label: "{{ item.path }}"

このプレイブックは次のことを行います。

  1. find モジュールを使用して、.conf で終わる /etc ディレクトリ内のファイルを検索します。
  2. 各ファイルをその詳細とともに表示します。

プレイブックを実行しましょう。

ansible-playbook filter_files.yml

出力には、/etc ディレクトリ内の .conf ファイルの詳細のみが表示されます。

Command モジュールとの比較

find モジュールの出力を従来の ls -l コマンドと比較するために、もう 1 つプレイブックを作成しましょう。

  1. Explorer パネルで、右クリックして「New File」を選択します。
  2. ファイル名を compare_methods.yml とします。
  3. 次の内容を追加します。
---
- name: Compare listing methods
  hosts: local
  tasks:
    - name: Get directory listing with ls command
      command: ls -l /etc/passwd
      register: ls_output

    - name: Get file info with find module
      ansible.builtin.find:
        paths: /etc
        patterns: "passwd"
        file_type: file
      register: find_output

    - name: Display ls command output
      debug:
        var: ls_output.stdout_lines

    - name: Display find module output
      debug:
        var: find_output.files[0]

このプレイブックは次のことを行います。

  1. command モジュールを使用して、/etc/passwd ファイルに対して ls -l を実行します。
  2. find モジュールを使用して、同じファイルを検索します。
  3. 比較のために両方の出力を表示します。

プレイブックを実行しましょう。

ansible-playbook compare_methods.yml

これで、2 つの方法の違いを確認できます。

  • ls -l コマンドは、従来の Unix 形式の単一行のテキストを提供します。
  • find モジュールは、Ansible で操作できる構造化データオブジェクトを提供します。

ファイルリスト表示のための再利用可能なロールの作成

このステップでは、ファイルリスト表示のための Ansible ロールを作成する方法を学びます。ロールは、プレイブックを整理し、再利用性を高める方法です。これは、複数のプレイブックまたはプロジェクトで同じタスクを実行する必要がある場合に特に役立ちます。

Ansible ロールの理解

Ansible ロールは、標準のディレクトリ構造にグループ化された一連のタスク、変数、ファイル、テンプレート、およびその他のリソースです。ロールを使用すると、コードを簡単に再利用し、他のユーザーと共有できます。

ロールの標準的なディレクトリ構造は次のようになります。

roles/
  rolename/
    tasks/      ## ロールのメインタスク
    handlers/   ## タスクによってトリガーされるハンドラー
    defaults/   ## デフォルト変数
    vars/       ## ロール変数
    files/      ## 静的ファイル
    templates/  ## テンプレート
    meta/       ## ロールのメタデータ

ファイルリスト表示ロールの作成

長形式でファイルをリスト表示するためのロールを作成しましょう。

  1. まず、ロールのディレクトリ構造を作成します。
cd ~/project/ansible-lab
mkdir -p roles/file_lister/tasks
  1. ロールのメインタスクファイルを作成します。
cd ~/project/ansible-lab
  1. Explorer パネルで、~/project/ansible-lab/roles/file_lister/tasks に移動します。
  2. 右クリックして「New File」を選択します。
  3. ファイル名を main.yml とします。
  4. 次の内容を追加します。
---
## Tasks for file_lister role

- name: Find files in the specified directory
  ansible.builtin.find:
    paths: "{{ path | default('/etc') }}"
    patterns: "{{ patterns | default('*') }}"
    file_type: "{{ file_type | default('any') }}"
    recurse: "{{ recurse | default(false) }}"
  register: found_files

- name: Display files in long format
  debug:
    msg: "{{ item.mode }} {{ item.uid }} {{ item.gid }} {{ item.size }} {{ item.mtime }} {{ item.path }}"
  loop: "{{ found_files.files | sort(attribute='path') }}"
  loop_control:
    label: "{{ item.path }}"
  when: show_details | default(true)

- name: Display only file paths
  debug:
    msg: "{{ item.path }}"
  loop: "{{ found_files.files | sort(attribute='path') }}"
  loop_control:
    label: "{{ item.path }}"
  when: not (show_details | default(true))

このロールは次のことを行います。

  1. パラメータに基づいて、指定されたディレクトリ内のファイルを検索します。
  2. ファイルを長形式またはパスのみで表示します。
  3. 指定されていない場合は、パラメータにデフォルト値を使用します。

プレイブックでのロールの使用

次に、新しいロールを使用するプレイブックを作成しましょう。

  1. Explorer パネルで、~/project/ansible-lab ディレクトリに移動します。
  2. 右クリックして「New File」を選択します。
  3. ファイル名を use_role.yml とします。
  4. 次の内容を追加します。
---
- name: Use file listing role
  hosts: local
  roles:
    - role: file_lister
      vars:
        path: "/etc"
        patterns: "*.conf"
        file_type: "file"
        show_details: true

このプレイブックは次のことを行います。

  1. ローカルホストで実行されます。
  2. file_lister ロールを使用します。
  3. ロールの動作をカスタマイズするために変数を設定します。

プレイブックを実行しましょう。

cd ~/project/ansible-lab
ansible-playbook use_role.yml

/etc ディレクトリ内のすべての .conf ファイルの詳細を示す出力が表示されるはずです。

ロール変数のカスタマイズ

ロールの利点の 1 つは、変数を変更することでその動作を簡単にカスタマイズできることです。異なるパラメータを使用してロールを使用する別のプレイブックを作成しましょう。

  1. Explorer パネルで、右クリックして「New File」を選択します。
  2. ファイル名を custom_listing.yml とします。
  3. 次の内容を追加します。
---
- name: Custom file listing
  hosts: local
  roles:
    - role: file_lister
      vars:
        path: "/home/labex"
        patterns: "*.yml"
        file_type: "file"
        show_details: false

このプレイブックは次のことを行います。

  1. file_lister ロールを使用します。
  2. /home/labex ディレクトリを検索するように設定します。
  3. YAML ファイル(*.yml)をフィルタリングします。
  4. ファイルパスのみを表示します(詳細情報なし)。

プレイブックを実行しましょう。

ansible-playbook custom_listing.yml

詳細情報なしで、/home/labex ディレクトリ内のすべての YAML ファイルのリストが表示されるはずです。

高度な使用法:レポートの作成

最後に、ロールを使用してファイルのレポートを生成する、より高度なプレイブックを作成しましょう。

  1. Explorer パネルで、右クリックして「New File」を選択します。
  2. ファイル名を generate_report.yml とします。
  3. 次の内容を追加します。
---
- name: Generate file listing report
  hosts: local
  vars:
    report_path: "~/project/ansible-lab/file_report.txt"
  tasks:
    - name: Find files in the specified directory
      ansible.builtin.find:
        paths: "/etc"
        patterns: "*.conf"
        file_type: "file"
      register: found_files

    - name: Create report header
      copy:
        dest: "{{ report_path }}"
        content: |
          File Listing Report
          Generated on: {{ ansible_date_time.date }} at {{ ansible_date_time.time }}
          -----------------------------------------------------------
          Mode       Owner  Group  Size       Modified    Path
          -----------------------------------------------------------
        force: yes

    - name: Append file information to report
      lineinfile:
        path: "{{ report_path }}"
        line: "{{ item.mode }} {{ item.uid }} {{ item.gid }} {{ item.size | string | ljust(10) }} {{ item.mtime }} {{ item.path }}"
      loop: "{{ found_files.files | sort(attribute='path') }}"
      loop_control:
        label: "{{ item.path }}"

    - name: Display report location
      debug:
        msg: "Report generated at {{ report_path }}"

このプレイブックは次のことを行います。

  1. /etc ディレクトリ内の .conf ファイルを検索します。
  2. ヘッダー付きのテキストファイルを作成します。
  3. 各ファイルに関する情報をレポートに追加します。
  4. レポートの場所を表示します。

プレイブックを実行しましょう。

ansible-playbook generate_report.yml

プレイブックを実行した後、レポートを表示できます。

cat ~/project/ansible-lab/file_report.txt

/etc ディレクトリ内のすべての .conf ファイルをリスト表示する、フォーマットされたレポートが表示されるはずです。

まとめ

この実験では、Ansible を使用してファイルとディレクトリを長形式でリスト表示する方法を学びました。以下の実践的な経験を積みました。

  1. ソフトウェアをインストールし、インベントリファイルを作成して Ansible を設定する
  2. ls -l コマンドを実行するために command モジュールを使用する基本的なプレイブックを作成する
  3. Ansible の組み込みファイルおよび find モジュールを使用して、ファイルに関する詳細情報を取得する
  4. さまざまなオプションを使用してファイルをリスト表示するための、再利用可能な Ansible ロールを作成する
  5. ファイル情報に基づいて、フォーマットされたレポートを生成する

これらのスキルは、インフラストラクチャ全体でファイル管理タスクを自動化し、ファイルリスト表示をより大規模な自動化ワークフローに統合するのに役立ちます。Ansible を使い続けることで、これらの概念に基づいて、環境全体でファイル、ディレクトリ、およびそれらのパーミッションを管理する、より複雑な自動化を作成できます。