使用ansible管理磁盘空间

the*_*ans 12 ansible

简单问:如果分区利用率超过一定百分比,我想删除一些文件.

我可以通过"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过滤器在计算百分比之前将它们转换为浮点数.

  • 请添加一些代码说明. (2认同)
  • “无属性“mount””问题的答案是使用: with_items: '{{ ansible_mounts }}' ...但是,在尝试使用时,该示例似乎也会中断(至少在 Ans 2.2.1.0 上) |列表构造失败。.. 我可以让断言工作,但无法让失败的部分工作。 (2认同)

Cog*_*ves 6

就我而言,我只关心根分区。但我发现在使用上面的帧丢失示例时,我需要一个否定的“或”条件,因为每个安装点都会根据断言进行测试。如果存在多个挂载点,则意味着断言始终会失败。在我的示例中,我直接测试 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)