3

我需要为“毛茸茸”的应用程序设置一个应用程序目录。根据具体情况,该目录可能对每个参与的服务器都是本地的,或者通过 NFS 在多个服务器之间共享。

因此,我需要能够检测给定路径是本地路径还是 NFS 访问路径,并在后一种情况下跳过一些任务。

在 Ansible 角色中检测到这一点的最佳方法是什么?

我尝试使用stat 模块,但device_type似乎在所有情况下都设置为 0,NFS 或本地(XFS)。

在 Linux 上,我可以调用stat -f /path——这将输出详细信息,包括类型(实用程序使用statfs系统调用)。但这是一种仅限 Linux 的方法,我宁愿避免这种琐碎的操作系统依赖性(mountpoint实用程序也是如此)。

我会编写一个自定义库函数,但os.statfs在 Python 中没有......

还剩下什么?

4

2 回答 2

2

另一种方法是利用 Ansible 事实。您可以为您的 mount=您的挂载点过滤ansible_mounts数组并提取文件系统类型字段。例如,请参阅我在这里得到的答案: https ://stackoverflow.com/a/49662135/1268949 。

我的生产代码中的另一个示例:

- 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
于 2018-04-05T05:38:31.297 回答
1

如果 GNU stat实用程序在您的目标平台上可用,那么您可以以不使用statfs调用来检测挂载点的方式调用它,然后在 mount 的输出中搜索它例如在 Linux 上:

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

我验证了此stat调用仅使用标准系统调用(请参阅stat(2)手册页中的 CONFORMING TO ):

$ 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
于 2018-04-03T08:59:57.157 回答