Создание многократно используемой роли для вывода списка файлов
На этом шаге мы узнаем, как создать роль 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
Вы должны увидеть вывод, показывающий детали всех файлов .conf
в каталоге /etc
.
Настройка переменных роли
Одним из преимуществ ролей является то, что мы можем легко настроить их поведение, изменяя переменные. Давайте создадим другой плейбук, который использует нашу роль с другими параметрами:
- На панели 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
Вы должны увидеть список всех файлов YAML в каталоге /home/labex
без подробной информации.
Расширенное использование: создание отчета
Наконец, давайте создадим более сложный плейбук, который использует нашу роль для создания отчета о файлах:
- На панели 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 }}"
Этот плейбук:
- Находит файлы
.conf
в каталоге /etc
.
- Создает текстовый файл с заголовком.
- Добавляет информацию о каждом файле в отчет.
- Отображает местоположение отчета.
Давайте запустим плейбук:
ansible-playbook generate_report.yml
После запуска плейбука вы можете просмотреть отчет:
cat ~/project/ansible-lab/file_report.txt
Вы должны увидеть отформатированный отчет со списком всех файлов .conf
в каталоге /etc
.