はじめに
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 エディターを使用してインベントリファイルを作成します。
- 左側のサイドバーにある「Explorer」アイコンをクリックします。
~/project/ansible-labディレクトリに移動します。- 右クリックして「New File」を選択します。
- ファイル名を
inventory.iniとします。 - ファイルに次の内容を追加します。
[local]
localhost ansible_connection=local
このインベントリファイルは、local というグループを定義し、ローカルホストのみを含み、Ansible が SSH を使用するのではなくローカルに接続するように指定します。
Ansible 設定ファイルの作成
デフォルト設定を指定するための基本的な Ansible 設定ファイルを作成しましょう。
- Explorer パネルで、
ansible-labディレクトリを右クリックし、「New File」を選択します。 - ファイル名を
ansible.cfgとします。 - 次の内容を追加します。
[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 ディレクトリの内容をリスト表示するシンプルなプレイブックを作成しましょう。
- Explorer パネルで、
~/project/ansible-labディレクトリに移動します。 - 右クリックして「New File」を選択します。
- ファイル名を
list_files.ymlとします。 - 次の内容を追加します。
---
- 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 ディレクトリの内容をリスト表示してみましょう。
- エディターで
list_files.ymlファイルを開きます。 - コマンドのパスを
/etcから/home/labexに変更します。 - ファイルを次の内容で保存します。
---
- 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 モジュールを使用する新しいプレイブックを作成しましょう。
- Explorer パネルで、
~/project/ansible-labディレクトリに移動します。 - 右クリックして「New File」を選択します。
- ファイル名を
find_files.ymlとします。 - 次の内容を追加します。
---
- 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
各ファイルに関する詳細情報を含む出力が表示されるはずです。これには以下が含まれます。
- パス
- モード(パーミッション)
- 所有者とグループ
- サイズ
- 変更時刻
長形式の詳細を持つプレイブックの作成
次に、すべての詳細を含む長形式でファイルを表示する、より包括的なプレイブックを作成しましょう。
- Explorer パネルで、右クリックして「New File」を選択します。
- ファイル名を
long_format.ymlとします。 - 次の内容を追加します。
---
- 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] }}"
このプレイブックは次のことを行います。
findモジュールを使用して、/etcディレクトリ内のファイルを検索します。ls -lコマンドの出力に似た形式のリストを作成します。- リストの最初の 10 個のファイルを表示します。
プレイブックを実行しましょう。
ansible-playbook long_format.yml
出力には、ls -l コマンドと同様の形式でファイルの詳細が表示されます。
条件に基づくファイルのフィルタリング
Ansible のモジュールを使用する利点の 1 つは、さまざまな条件に基づいてファイルをフィルタリングできることです。.conf で終わるファイル(設定ファイル)のみをリスト表示するプレイブックを作成しましょう。
- Explorer パネルで、右クリックして「New File」を選択します。
- ファイル名を
filter_files.ymlとします。 - 次の内容を追加します。
---
- 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 }}"
このプレイブックは次のことを行います。
findモジュールを使用して、.confで終わる/etcディレクトリ内のファイルを検索します。- 各ファイルをその詳細とともに表示します。
プレイブックを実行しましょう。
ansible-playbook filter_files.yml
出力には、/etc ディレクトリ内の .conf ファイルの詳細のみが表示されます。
Command モジュールとの比較
find モジュールの出力を従来の ls -l コマンドと比較するために、もう 1 つプレイブックを作成しましょう。
- Explorer パネルで、右クリックして「New File」を選択します。
- ファイル名を
compare_methods.ymlとします。 - 次の内容を追加します。
---
- 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]
このプレイブックは次のことを行います。
commandモジュールを使用して、/etc/passwdファイルに対してls -lを実行します。findモジュールを使用して、同じファイルを検索します。- 比較のために両方の出力を表示します。
プレイブックを実行しましょう。
ansible-playbook compare_methods.yml
これで、2 つの方法の違いを確認できます。
ls -lコマンドは、従来の Unix 形式の単一行のテキストを提供します。findモジュールは、Ansible で操作できる構造化データオブジェクトを提供します。
ファイルリスト表示のための再利用可能なロールの作成
このステップでは、ファイルリスト表示のための Ansible ロールを作成する方法を学びます。ロールは、プレイブックを整理し、再利用性を高める方法です。これは、複数のプレイブックまたはプロジェクトで同じタスクを実行する必要がある場合に特に役立ちます。
Ansible ロールの理解
Ansible ロールは、標準のディレクトリ構造にグループ化された一連のタスク、変数、ファイル、テンプレート、およびその他のリソースです。ロールを使用すると、コードを簡単に再利用し、他のユーザーと共有できます。
ロールの標準的なディレクトリ構造は次のようになります。
roles/
rolename/
tasks/ ## ロールのメインタスク
handlers/ ## タスクによってトリガーされるハンドラー
defaults/ ## デフォルト変数
vars/ ## ロール変数
files/ ## 静的ファイル
templates/ ## テンプレート
meta/ ## ロールのメタデータ
ファイルリスト表示ロールの作成
長形式でファイルをリスト表示するためのロールを作成しましょう。
- まず、ロールのディレクトリ構造を作成します。
cd ~/project/ansible-lab
mkdir -p roles/file_lister/tasks
- ロールのメインタスクファイルを作成します。
cd ~/project/ansible-lab
- Explorer パネルで、
~/project/ansible-lab/roles/file_lister/tasksに移動します。 - 右クリックして「New File」を選択します。
- ファイル名を
main.ymlとします。 - 次の内容を追加します。
---
## 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))
このロールは次のことを行います。
- パラメータに基づいて、指定されたディレクトリ内のファイルを検索します。
- ファイルを長形式またはパスのみで表示します。
- 指定されていない場合は、パラメータにデフォルト値を使用します。
プレイブックでのロールの使用
次に、新しいロールを使用するプレイブックを作成しましょう。
- Explorer パネルで、
~/project/ansible-labディレクトリに移動します。 - 右クリックして「New File」を選択します。
- ファイル名を
use_role.ymlとします。 - 次の内容を追加します。
---
- name: Use file listing role
hosts: local
roles:
- role: file_lister
vars:
path: "/etc"
patterns: "*.conf"
file_type: "file"
show_details: true
このプレイブックは次のことを行います。
- ローカルホストで実行されます。
file_listerロールを使用します。- ロールの動作をカスタマイズするために変数を設定します。
プレイブックを実行しましょう。
cd ~/project/ansible-lab
ansible-playbook use_role.yml
/etc ディレクトリ内のすべての .conf ファイルの詳細を示す出力が表示されるはずです。
ロール変数のカスタマイズ
ロールの利点の 1 つは、変数を変更することでその動作を簡単にカスタマイズできることです。異なるパラメータを使用してロールを使用する別のプレイブックを作成しましょう。
- Explorer パネルで、右クリックして「New File」を選択します。
- ファイル名を
custom_listing.ymlとします。 - 次の内容を追加します。
---
- name: Custom file listing
hosts: local
roles:
- role: file_lister
vars:
path: "/home/labex"
patterns: "*.yml"
file_type: "file"
show_details: false
このプレイブックは次のことを行います。
file_listerロールを使用します。/home/labexディレクトリを検索するように設定します。- YAML ファイル(*.yml)をフィルタリングします。
- ファイルパスのみを表示します(詳細情報なし)。
プレイブックを実行しましょう。
ansible-playbook custom_listing.yml
詳細情報なしで、/home/labex ディレクトリ内のすべての YAML ファイルのリストが表示されるはずです。
高度な使用法:レポートの作成
最後に、ロールを使用してファイルのレポートを生成する、より高度なプレイブックを作成しましょう。
- Explorer パネルで、右クリックして「New File」を選択します。
- ファイル名を
generate_report.ymlとします。 - 次の内容を追加します。
---
- 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 }}"
このプレイブックは次のことを行います。
/etcディレクトリ内の.confファイルを検索します。- ヘッダー付きのテキストファイルを作成します。
- 各ファイルに関する情報をレポートに追加します。
- レポートの場所を表示します。
プレイブックを実行しましょう。
ansible-playbook generate_report.yml
プレイブックを実行した後、レポートを表示できます。
cat ~/project/ansible-lab/file_report.txt
/etc ディレクトリ内のすべての .conf ファイルをリスト表示する、フォーマットされたレポートが表示されるはずです。
まとめ
この実験では、Ansible を使用してファイルとディレクトリを長形式でリスト表示する方法を学びました。以下の実践的な経験を積みました。
- ソフトウェアをインストールし、インベントリファイルを作成して Ansible を設定する
ls -lコマンドを実行するために command モジュールを使用する基本的なプレイブックを作成する- Ansible の組み込みファイルおよび find モジュールを使用して、ファイルに関する詳細情報を取得する
- さまざまなオプションを使用してファイルをリスト表示するための、再利用可能な Ansible ロールを作成する
- ファイル情報に基づいて、フォーマットされたレポートを生成する
これらのスキルは、インフラストラクチャ全体でファイル管理タスクを自動化し、ファイルリスト表示をより大規模な自動化ワークフローに統合するのに役立ちます。Ansible を使い続けることで、これらの概念に基づいて、環境全体でファイル、ディレクトリ、およびそれらのパーミッションを管理する、より複雑な自動化を作成できます。


