Почему это важно для разработчиков и фрилансеров
При работе с серверным окружением часто требуется убедиться, что‑то уже существует: конфигурационный файл, директория с логами или артефакт, созданный предыдущим запуском playbook‑а. Не проверив наличие ресурса, вы рискуете выполнить лишние действия, вызвать ошибки установки - а в продакшене каждая лишняя минута простоя дорого стоит. Модуль stat позволяет получать полные сведения о файле или каталоге и использовать их в условных операторах (when), тем самым делая плейбуки более надёжными и безопасными.
1. Базовый пример: проверяем, существует ли файл
---- name: Проверка наличия /etc/myfile.txt hosts: myserver become: true # запуск от root tasks: - name: Считываем атрибуты файла stat: path: /etc/myfile.txt register: file_info
- name: Выводим полученные данные (для отладки) debug: var: file_info
- Что происходит:
statчитает метаданные пути/etc/myfile.txt.- Результат сохраняется в переменную
file_info. - Через
debugмы видим весь набор атрибутов (разрешения, владелец, время изменения и т.д.).
Из полученного словаря нас интересует только поле stat.exists, которое принимает true, если файл найден, и false - если нет.
2. Условные действия в зависимости от результата
- name: Файл найден - выводим сообщение debug: msg: "Файл /etc/myfile.txt присутствует" when: file_info.stat.exists
- name: Файла нет - предупреждение debug: msg: "Файл /etc/myfile.txt отсутствует" when: not file_info.stat.exists
Можно заменить debug на любые другие задачи: установка пакетов, копирование шаблонов, перезапуск сервисов и т.п. Пример с Apache:
- name: Устанавливаем Apache, если файл существует apt: name: apache2 state: present when: file_info.stat.exists
- name: Убираем Apache, если файла нет apt: name: apache2 state: absent when: not file_info.stat.exists
3. Определяем тип объекта: файл или каталог
Модуль stat возвращает булевы флаги isdir, isreg, islnk и пр. Чтобы избежать ошибки, сначала проверяем, определён ли ключ:
- name: Проверяем, является ли путь каталогом debug: msg: "Это каталог" when: file_info.stat.isdir is defined and file_info.stat.isdir
Аналогично можно проверить, является ли объект обычным файлом (isreg) или символьной ссылкой (islnk).
4. Если файла нет - создаём его "на лету"
Для простого создания пустого файла лучше использовать модуль file со статусом touch:
- name: Создаём файл, если его ещё нет file: path: /etc/myfile.txt state: touch # создаст, если отсутствует owner: root mode: '0644' modification_time: preserve access_time: preserve
Параметр modification_time: preserve гарантирует, что дата изменения не будет обновлена, если файл уже существует.
5. Полный набор полей, возвращаемых stat
| Поле | Тип | Что описывает |
|---|---|---|
atime |
float | Время последнего доступа |
ctime |
float | Время последней мета‑операции (создание/изменение атрибутов) |
mtime |
float | Время последнего изменения содержимого |
size |
int | Размер в байтах |
mode |
str | Права доступа в октальном виде (например, 0644) |
owner / group |
str | Владелец и группа |
isdir |
bool | Является каталогом |
isreg |
bool | Обычный файл |
islnk |
bool | Символьная ссылка |
exists |
bool | Существует ли путь |
checksum |
str | Хеш‑сумма (при checksum: md5 и т.п.) |
| ... | ... | И многие другие (см. официальную документацию) |
Эти данные позволяют строить сложные логические цепочки: проверять наличие прав доступа, сравнивать хеши, определять тип устройства и т.д.
6. Лучшие практики по использованию stat
- Кешируйте результат - храните его в переменной (
register) и переиспользуйте в нескольких задачах, а не вызывайтеstatкаждый раз. - Ограничьте вывод отладки - в продакшене оставляйте
debugтолько при реальной необходимости, иначе лог будет перегружен. - Обрабатывайте исключения - используйте
ignore_errors: trueсовместно с проверкойfile_info.stat.exists, если отсутствие файла считается штатным случаем. - Проверка прав доступа - сочетайте
statсwhen: file_info.stat.readableилиfile_info.stat.writableдля гарантии, что текущий пользователь сможет работать с объектом. - Документируйте переменные - явно указывайте в комментариях, какие свойства
statнужны дальше, это улучшит читаемость и повышает экспертность статьи.
7. Заключение
Модуль stat - один из самых гибких инструментов Ansible для работы с файловой системой. Он позволяет не только узнать, существует ли путь, но и собрать полную картину о его свойствах, используя полученные данные в условных блоках when. При правильном применении вы получаете:
- Экономию времени - не запускаете лишние операции.
- Повышение надёжности - избегаете ошибок "файл не найден".
- Прозрачность кода - все проверки находятся в одном месте, что упрощает поддержку и масштабирование playbook‑ов.
Применяйте примеры из этой статьи в своих проектах, адаптируя путь, условия и действия под конкретные задачи - и ваши Ansible‑скрипты станут более "умными", а инфраструктура - более устойчивой.
