Введение
Ansible – широко используемый инструмент автоматизации IT, упрощающий управление инфраструктурой и развертывание. В этой лабораторной работе мы рассмотрим, как выводить списки файлов и каталогов в расширенном формате с помощью Ansible. Вы узнаете, как настроить Ansible, создавать плейбуки (playbooks) и использовать встроенные модули для получения информации о файлах с удаленных систем. К концу этой лабораторной работы вы получите практический опыт работы с командами и методами 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
Файл инвентаризации (inventory file) – это список управляемых узлов, с которыми может работать Ansible. Для этой лабораторной работы мы создадим простой файл инвентаризации, который включает нашу локальную машину.
Создайте каталог для нашего проекта 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, которая включает только наш localhost, и указывает, что Ansible должен подключаться локально, а не используя SSH.
Создание файла конфигурации Ansible
Давайте создадим базовый файл конфигурации Ansible, чтобы указать настройки по умолчанию:
- На панели Explorer щелкните правой кнопкой мыши каталог
ansible-labи выберите "New File" (Новый файл). - Назовите файл
ansible.cfg. - Добавьте следующее содержимое:
[defaults]
inventory = inventory.ini
host_key_checking = False
Этот файл конфигурации сообщает Ansible использовать наш файл inventory.ini по умолчанию и отключает проверку ключей SSH-хоста, что полезно для лабораторных сред.
Тестирование настройки
Давайте протестируем нашу настройку Ansible, выполнив простую команду:
cd ~/project/ansible-lab
ansible local -m ping
Вы должны увидеть вывод, похожий на этот:
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
Это подтверждает, что Ansible правильно настроен и может взаимодействовать с нашей локальной машиной.
Создание базового плейбука Ansible для вывода списка файлов
На этом шаге мы создадим базовый плейбук Ansible для вывода списка файлов и каталогов. Плейбуки (playbooks) – это YAML-файлы, которые определяют набор задач для выполнения на управляемых узлах.
Понимание плейбуков Ansible
Прежде чем мы начнем создавать наш плейбук, давайте разберемся, что такое плейбук:
- Плейбук – это YAML-файл, который содержит список plays (игр).
- Каждый play определяет набор задач для запуска на определенной группе хостов.
- Задачи (tasks) – это отдельные действия, которые вызывают модули Ansible.
- Модули (modules) – это многократно используемые единицы кода, которые выполняют определенные операции.
Создание нашего первого плейбука
Давайте создадим простой плейбук для вывода содержимого каталога /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– это описательное имя для play.hosts: localуказывает, что этот play будет запущен на хостах в группеlocal(определенной в нашей инвентаризации).tasks:начинает список задач для выполнения.- Первая задача запускает команду
ls -l /etcи сохраняет результат в переменную с именемdirectory_contents. - Вторая задача отображает содержимое переменной
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
Вывод теперь покажет содержимое каталога /home/labex вместо /etc.
Использование модуля File Ansible для вывода списка в расширенном формате
На предыдущем шаге мы использовали модуль 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 является возможность фильтрации файлов на основе различных критериев. Давайте создадим плейбук, который выводит список только файлов конфигурации (файлы, заканчивающиеся на .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для поиска файлов в каталоге/etc, которые заканчиваются на.conf. - Отображает каждый файл с его деталями.
Давайте запустим плейбук:
ansible-playbook filter_files.yml
Вывод покажет детали только для файлов .conf в каталоге /etc.
Сравнение с модулем Command
Давайте создадим еще один плейбук, чтобы сравнить вывод модуля find с традиционной командой ls -l:
- На панели 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для запускаls -lдля файла/etc/passwd. - Использует модуль
findдля поиска того же файла. - Отображает оба вывода для сравнения.
Давайте запустим плейбук:
ansible-playbook compare_methods.yml
Теперь вы можете увидеть разницу между двумя методами:
- Команда
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
Вы должны увидеть вывод, показывающий детали всех файлов .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.
Резюме
В этой лабораторной работе вы узнали, как использовать Ansible для вывода списка файлов и каталогов в расширенном формате. Вы получили практический опыт работы со следующими аспектами:
- Настройка Ansible путем установки программного обеспечения и создания файла инвентаризации.
- Создание базовых плейбуков, использующих модуль command для запуска команды
ls -l. - Использование встроенных модулей file и find Ansible для получения подробной информации о файлах.
- Создание многократно используемой роли Ansible для вывода списка файлов с различными параметрами.
- Создание отформатированных отчетов на основе информации о файлах.
Эти навыки помогут вам автоматизировать задачи управления файлами в вашей инфраструктуре и интегрировать вывод списков файлов в более крупные рабочие процессы автоматизации. Продолжая работать с Ansible, вы сможете опираться на эти концепции для создания более сложных автоматизаций, которые управляют файлами, каталогами и их разрешениями во всей вашей среде.


