最简单的非 shell 方法来确认安装点集存在,每个自定义最小大小

Simplest non-shell way to confirm set of mount points exist with custom minimum size for each

ansible_mounts 是字典数组,像这样 -

    "ansible_mounts": [
       {
           "device": "/dev/mapper/vg_centos67template-lv_root",
           "fstype": "ext4",
           "mount": "/",
           "options": "rw",
           "size_available": 8806977536,
           "size_total": 37458894848,
           "uuid": "N/A"
       },
       {
           "device": "/dev/sda1",
           "fstype": "ext4",
           "mount": "/boot",
           "options": "rw",
           "size_available": 369055744,
           "size_total": 499355648,
           "uuid": "N/A"
       },
   ],  

我需要确认一组特定的安装点存在,最小尺寸。我为此控制了数据结构,但目前结构类似 -

requiredMounts:  
 - { mount: /tmp,     size_min:   2147483648, }  
 - { mount: /dev/shm, size_min: 204010946560, }  

我希望像 grep 一样使用 selectattr() 过滤器,但它不可用。

fatal: [tstServer]: FAILED! => {"failed": true, "msg": "template error while templating string: no filter named 'selectattr'. String: {{ ansible_mounts | selectattr( 'mount', 'equalto', item.mount ) }}"}

使用神社 2.6。不知道为什么 selectattr() 不存在。
(如果有人关心的话,这是詹金斯的输出。)

很高兴使用 whenfailassertwith_items, with_nested, combine(), and/or 其他任何东西;只是还没有找到使它整洁的正确组合。我宁愿它不需要十几个步骤 - 一个将是理想的。

建议?

附录: 我可以通过 fail: ... when: not item.mount|is_mount

一步轻松确认挂载点

...这很有趣,因为虽然 /dev/shm 以这种方式显示为挂载点(以及来自 df & mount 之类的命令),但它不包含在 ansible_mounts.

这意味着我不能只使用 ansible_mounts 在单独的 with_nested 中检查 /dev/shm 的文件大小。这让我很伤心熊猫。

进一步附录:

事实证明我必须检查一个挂载点 (/tmp),该挂载点通常可通过通常的文件系统使用 - 最佳选择 ansible_mounts! - 一个 (/dev/shm) 是 tempfs - 最简单的似乎是 df,它也可以处理 /tmp - 以及 oracle 管理的一堆,所以它们只能通过 fdisk 获得。

最后发现我必须检查每个系统的十几个驱动器,但是 /tmp 是 ansible_mounts 唯一可用的驱动器。话虽如此,我的问题就像我问的那样变得没有实际意义...

感谢您的输入。

为什么不更新 Jinja2?

来自documentation

selectattr() New in version 2.7.

回答第一部分。

- name: testing for required mount points
  fail:
    msg: "{{ item.mount }} must be a mount point"
  when: not item.mount|is_mount
  with_items: "{{ requiredMounts }}"  

不过,仍然很难找到一种简单、可靠、非脚本的方法来 git 安装点大小。 {{ ansible_mounts }} 没有显示我的共享内存 /dev/shm 装载,没有其他东西给我尺寸。

为什么它不包括 mount 是 df 显示的?

是否有另一种无需 shell 调用即可访问挂载点分配的方法?

使用简短的脚本,我可以用 -

- name: check mount point space allocation
  shell: df -B 1 {{ reqMount.mount }} | grep {{ reqMount.mount }} | { read x siz x; echo $siz; }
  register: mountStat

- name: Confirm mount point minimum size
  fail:
    msg: "mountpoint '{{ reqMount.mount }}' of {{ mountStat.stdout }} bytes must be at least {{ reqMount.size_min }} bytes."
  when: mountStat.stdout|int < reqMount.size_min|int  

...但我不喜欢使用一些我认为可能应该有几行注释来解释它的脚本。 (我应该懒得提 awk 让我觉得很脏吗?)

也尝试了 parted 模块,但我的逻辑挂载点是文件系统目录,除了 df 什么都看不到,这很容易为我提供每个目录的分区,所以没有什么理由如果我仍然调用它,请添加步骤。

作为附录,ansible_mounts 没有显示 /dev/shm 的原因可能是因为它是 tmpfs 坐骑。希望至少能帮到一些人。