简单问:如果分区利用率超过一定百分比,我想删除一些文件.
我可以通过"ansible_mounts"访问"size_total"和"size_available".即:
ansible myhost -m setup -a 'filter=ansible_mounts'
myhost | success >> {
"ansible_facts": {
"ansible_mounts": [
{
"device": "/dev/mapper/RootVolGroup00-lv_root",
"fstype": "ext4",
"mount": "/",
"options": "rw",
"size_available": 5033046016,
"size_total": 8455118848
},
Run Code Online (Sandbox Code Playgroud)
如何访问这些值,以及如何使用Ansible基于它们有条件地执行操作?
fra*_*oss 15
Slava的回答肯定是在正确的轨道上,这是我使用的:
- name: test for available disk space
assert:
that:
- not {{ item.mount == '/' and ( item.size_available < item.size_total - ( item.size_total|float * 0.8 ) ) }}
- not {{ item.mount == '/var' and ( item.size_available < item.size_total - ( item.size_total|float * 0.8 ) ) }}
with_items: ansible_mounts
ignore_errors: yes
register: disk_free
- name: free disk space
command: "/some/command/that/fixes/it"
when: disk_free|failed
Run Code Online (Sandbox Code Playgroud)
断言任务只是通过设置ignore_errors来测试条件,并将测试结果注册到新变量,我们可以在游戏中稍后执行条件任务,而不是在断言结果失败时失败.
测试本身可能更有效地编写,但代价是可读性.所以我没有在示例中使用多列表循环.在这种情况下,任务循环遍历已挂载文件系统列表中的每个项目(一个ansible创建的事实,称为ansible_mounts.)
通过否定测试我们避免在列表中没有的文件系统挂载失败,然后简单的数学处理其余的.绊倒我的部分是size_available和size_total变量是字符串,因此jinja过滤器在计算百分比之前将它们转换为浮点数.
就我而言,我只关心根分区。但我发现在使用上面的帧丢失示例时,我需要一个否定的“或”条件,因为每个安装点都会根据断言进行测试。如果存在多个挂载点,则意味着断言始终会失败。在我的示例中,我直接测试 size_available 是否小于 size_total 的 50%,而不是像帧损失那样计算它。
其次,至少在我使用的ansible版本中,有必要在with_items中的变量周围包含{{}}。我犯的一个错误不在上面的示例中,那就是没有将“when”子句与“fail”指令的缩进对齐。(如果犯了这个错误,那么解决方案就不起作用......)
# This works with ansible 2.2.1.0
- hosts: api-endpoints
become: True
tasks:
- name: Test disk space available
assert:
that:
- item.mount != '/' or {{ item.mount == '/' and item.size_available > (item.size_total|float * 0.4) }}
with_items: '{{ ansible_mounts }}'
ignore_errors: yes
register: disk_free
- name: Fail when disk space needs attention
fail:
msg: 'Disk space needs attention.'
when: disk_free|failed
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26400 次 |
| 最近记录: |