Как различить, если каталог NFS-монтируется из Ansible?

Мне нужно настроить каталог приложений для "волосатых" приложений. В зависимости от случая, каталог может быть локальным для каждого участвующего сервера или общим для нескольких серверов через NFS.

Итак, я должен быть в состоянии определить, является ли данный путь локальным или доступен по NFS, и пропустить некоторые задачи в последнем случае.

Какой лучший способ обнаружить это в роли Ansible?

Я пытался использовать модуль статистики, но device_type Кажется, для всех случаев установлено значение 0, NFS или локальное (XFS).

В Linux я мог бы вызвать stat -f /path - это вывело бы детали, включая тип (утилита использует statfs Системный вызов). Но это метод только для Linux, и я бы предпочел избегать таких мелких ОС-зависимостей (то же самое касается mountpoint полезность).

Я хотел бы написать пользовательскую функцию библиотеки, но нет os.statfs в Python...

Что осталось?

2 ответа

Другой подход будет использовать Ansible факты. Вы можете отфильтровать массив ansible_mounts для вашего mount=вашей точки монтирования и извлечь поле типа файловой системы. Для примера, смотрите ответ, который я получил здесь: /questions/10255456/ansible-opredelit-montirovana-li-fajlovaya-sistema-linux-tolko-dlya-chteniya/10255468#10255468.

Еще один пример из моего производственного кода:

- name: Determine shared-dir mount point
command: "/usr/bin/env stat -c '%m' {{ shared_dir_real_path }}"
register: shared_dir_mount_point
changed_when: False

- name: Determine the mount point's filesystem type and mount options
set_fact:
    "shared_dir_mount_{{ item }}": "{{ ansible_mounts | selectattr('mount', 'equalto', shared_dir_mount_point.stdout) | map(attribute = item) | join(',') }}"
with_items:
    - fstype
    - options

Если утилита GNU stat доступна на ваших целевых платформах, вы можете вызвать ее так, чтобы не использовать вызов statfs для определения точки монтирования, а затем искать ее в выходных данных mount, например, в Linux:

$ mount | grep -F `stat -c %m /boot/grub` | cut -d' ' -f5
ext2

Я проверил, что этот вызов stat использует только стандартные системные вызовы (см. СООТВЕТСТВИЕ СТРАНИЦЕ на man-странице stat (2)):

$ strace stat -c %m /boot/grub/ |& fgrep stat
execve("/usr/bin/stat", ["stat", "-c", "%m", "/boot/grub/"], [/* 65 vars */]) = 0
fstat(3, {st_mode=S_IFREG|0644, st_size=218501, ...}) = 0
fstat(3, {st_mode=S_IFREG|0644, st_size=130224, ...}) = 0
fstat(3, {st_mode=S_IFREG|0755, st_size=1868984, ...}) = 0
fstat(3, {st_mode=S_IFREG|0644, st_size=456632, ...}) = 0
fstat(3, {st_mode=S_IFREG|0644, st_size=14608, ...}) = 0
fstat(3, {st_mode=S_IFREG|0755, st_size=138696, ...}) = 0
statfs("/sys/fs/selinux", 0x7ffe62882ff0) = -1 ENOENT (No such file or directory)
statfs("/selinux", 0x7ffe62882ff0)      = -1 ENOENT (No such file or directory)
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
fstat(3, {st_mode=S_IFREG|0644, st_size=5152256, ...}) = 0
lstat("/boot/grub/", {st_mode=S_IFDIR|0755, st_size=1024, ...}) = 0
lstat("/boot", {st_mode=S_IFDIR|0755, st_size=3072, ...}) = 0
lstat("/boot/grub", {st_mode=S_IFDIR|0755, st_size=1024, ...}) = 0
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
stat("/boot/grub", {st_mode=S_IFDIR|0755, st_size=1024, ...}) = 0
stat("..", {st_mode=S_IFDIR|0755, st_size=3072, ...}) = 0
stat("..", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/boot", {st_mode=S_IFDIR|0755, st_size=3072, ...}) = 0
fstat(1, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
Другие вопросы по тегам