我是 ansible 的新手,目前正在开发一个游戏,该游戏将查看远程计算机的磁盘空间是否已达到 70% 的阈值。如果他们已经达到了,它应该抛出错误。
我在以下位置找到了一个很好的示例:使用ansible来管理磁盘空间
但在此示例中,安装名称是硬编码的。我的要求是动态地传递它们。所以我写了下面的代码,但似乎不起作用:
name: test for available disk space
assert:
that:
- not {{ item.mount == '{{mountname}}' and ( item.size_available <
item.size_total - ( item.size_total|float * 0.7 ) ) }}
with_items: '{{ansible_mounts}}'
ignore_errors: yes
register: disk_free
name: Fail the play
fail: msg="disk space has reached 70% threshold"
when: disk_free|failed
这个玩法在我使用时有效:
item.mount == '/var/app'
有没有办法动态输入挂载名?我可以输入多个安装名称吗?
我在 rhel 上使用 ansible 2.3
提前致谢:)
试试这个:
name: Ensure that free space on {{ mountname }} is grater than 30%
assert:
that: mount.size_available > mount.size_total|float * 0.3
msg: disk space has reached 70% threshold
vars:
mount: "{{ ansible_mounts | selectattr('mount','equalto',mountname) | list | first }}"
that
是一个原始的 Jinja2 表达式,不要在其中使用大括号。如果
fail
可能失败并显示消息,为什么要使用单独的 assert
任务?对于那些无法使用
selectattr
(像我一样)的人,这里是第一个答案的变体,使用 when
和 with_items
选择要检查的安装点。
name: "Ensure that free space on {{ mountname }} is greater than 30%"
assert:
that: item.size_available > item.size_total|float * 0.3
msg: 'disk space has reached 70% threshold'
when: item.mount == mountname
with_items: '{{ ansible_mounts }}'
注意:为了能够使用变量
{{ ansible_mounts }}
,您需要将 gather_facts
转为 yes
,可以限制为 gather_subset=!all,hardware
。
我正在运行 Ansible 2.5,并且能够通过添加 with_items
来获得
Konstantin Suvorov's解决方案,以便与轻微的 mod 一起使用。示例代码如下:
- name: Ensure that free space on the tested volume is greater than 15%
assert:
that:
- mount.size_available > mount.size_total|float * 0.15
msg: Disk space has reached 85% threshold
vars:
mount: "{{ ansible_mounts | selectattr('mount','equalto',item.mount) | list | first }}"
with_items:
- "{{ ansible_mounts }}"