Как вывести список файлов и каталогов в расширенном формате с помощью Ansible

AnsibleAnsibleBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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:

  1. Щелкните значок "Explorer" на левой боковой панели.
  2. Перейдите в каталог ~/project/ansible-lab.
  3. Щелкните правой кнопкой мыши и выберите "New File" (Новый файл).
  4. Назовите файл inventory.ini.
  5. Добавьте следующее содержимое в файл:
[local]
localhost ansible_connection=local

Этот файл инвентаризации определяет группу с именем local, которая включает только наш localhost, и указывает, что 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 по умолчанию и отключает проверку ключей 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:

  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 – это описательное имя для 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:

  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

Вывод теперь покажет содержимое каталога /home/labex вместо /etc.

Использование модуля File Ansible для вывода списка в расширенном формате

На предыдущем шаге мы использовали модуль 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 является возможность фильтрации файлов на основе различных критериев. Давайте создадим плейбук, который выводит список только файлов конфигурации (файлы, заканчивающиеся на .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 для поиска файлов в каталоге /etc, которые заканчиваются на .conf.
  2. Отображает каждый файл с его деталями.

Давайте запустим плейбук:

ansible-playbook filter_files.yml

Вывод покажет детали только для файлов .conf в каталоге /etc.

Сравнение с модулем Command

Давайте создадим еще один плейбук, чтобы сравнить вывод модуля find с традиционной командой ls -l:

  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 для запуска ls -l для файла /etc/passwd.
  2. Использует модуль find для поиска того же файла.
  3. Отображает оба вывода для сравнения.

Давайте запустим плейбук:

ansible-playbook compare_methods.yml

Теперь вы можете увидеть разницу между двумя методами:

  • Команда 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

Вы должны увидеть вывод, показывающий детали всех файлов .conf в каталоге /etc.

Настройка переменных роли

Одним из преимуществ ролей является то, что мы можем легко настроить их поведение, изменяя переменные. Давайте создадим другой плейбук, который использует нашу роль с другими параметрами:

  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

Вы должны увидеть список всех файлов YAML в каталоге /home/labex без подробной информации.

Расширенное использование: создание отчета

Наконец, давайте создадим более сложный плейбук, который использует нашу роль для создания отчета о файлах:

  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. Находит файлы .conf в каталоге /etc.
  2. Создает текстовый файл с заголовком.
  3. Добавляет информацию о каждом файле в отчет.
  4. Отображает местоположение отчета.

Давайте запустим плейбук:

ansible-playbook generate_report.yml

После запуска плейбука вы можете просмотреть отчет:

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

Вы должны увидеть отформатированный отчет со списком всех файлов .conf в каталоге /etc.

Резюме

В этой лабораторной работе вы узнали, как использовать Ansible для вывода списка файлов и каталогов в расширенном формате. Вы получили практический опыт работы со следующими аспектами:

  1. Настройка Ansible путем установки программного обеспечения и создания файла инвентаризации.
  2. Создание базовых плейбуков, использующих модуль command для запуска команды ls -l.
  3. Использование встроенных модулей file и find Ansible для получения подробной информации о файлах.
  4. Создание многократно используемой роли Ansible для вывода списка файлов с различными параметрами.
  5. Создание отформатированных отчетов на основе информации о файлах.

Эти навыки помогут вам автоматизировать задачи управления файлами в вашей инфраструктуре и интегрировать вывод списков файлов в более крупные рабочие процессы автоматизации. Продолжая работать с Ansible, вы сможете опираться на эти концепции для создания более сложных автоматизаций, которые управляют файлами, каталогами и их разрешениями во всей вашей среде.