首页 > 解决方案 > 如何使用 ansible playbook 检查 linux 磁盘大小小于 10GB?

问题描述

我需要检查所有服务器磁盘大小小于 10GB 的 linux 服务器,并且还应该显示输出,如果它是 MB、GB、1TB 它应该显示相同。我已经使用下面的代码来检查 ansible playbook 中的磁盘大小

- name: Get disk info
    set_fact:
      disk_size: "{{ item.value.size }}"      
    with_dict:
      - "{{ ansible_facts['devices'] }}"  
    ignore_errors: yes    
    tags: get_disk_info
  # - debug:
  #     msg: "{{ disk_size }}"
  #   ignore_errors: yes
  #   tags: get_disk_info
  - debug:
      msg: >
           {% if disk_size > 10 %} 
            Disk Size {{ disk_size }} -> PASS 
           {% else %} 
            Disk Size {{ disk_size }} -> FAIL
           {% endif %}
    tags: get_disk_info

如果服务器的磁盘大小为 55MB,它也将输出显示为 PASS,但根据代码中的上述条件,它应该显示为 FAIL..

如果它在所有方面都应该大于 10GB,请帮助我在这个剧本中获得 PASS

标签: pythonansiblejinja2

解决方案


例如,要将所有单位转换为 GB,我建议您使用自定义过滤器:

您在 playbook 文件夹中创建一个文件夹filter_plugins(我已将文件命名为myfilters.py和过滤器convertToGB

过滤器:

#!/usr/bin/python
import re
class FilterModule(object):
    def filters(self):
        return {
            'convertToGB': self.convertToGB
        }

    def convertToGB(self, obj):
        # keep only digit and . 
        value = float(re.sub('[^\d\.]', '', obj))
        if obj.endswith('GB'):
            return value
        elif obj.endswith('TB'):
            return value * 1024

        return value

您可以轻松修改自定义插件...

剧本:

- name: playbook1.0
  hosts: all
  gather_facts: yes

  tasks:
    - name: Get disk info
      set_fact:
        disk_size: "{{ item.value.size }}"      
      with_dict:
        - "{{ ansible_facts['devices'] }}"  

    - debug:
        msg: >
            {% if (disk_size | convertToGB) > 10 %} 
              Disk Size {{ disk_size }} -> PASS 
            {% else %} 
              Disk Size {{ disk_size }} -> FAIL
            {% endif %}

如果没有自定义过滤器,您必须像这样修改模板:

  tasks:
    - name: Get disk info
      set_fact:
        disk_size: "{{ item.value.size }}"      
      with_dict:
        - "{{ ansible_facts['devices'] }}"  
      

    - debug:
        msg: >
            {% set value = (disk_size.split(' ')[0] | float) %}
            {% set unit = disk_size.split(' ')[1] %} 
            {% set multiplier = 1.0 %}            
            {% if 'GB' in unit %}
            {%   set multiplier = 1.0 %}
            {% elif 'TB' in unit %}
            {%   set multiplier = 1024 %}
            {% endif %}
            {% if (value * multiplier) > 10 %} 
              Disk Size {{ disk_size }} -> PASS 
            {% else %} 
              Disk Size {{ disk_size }} -> FAIL
            {% endif %}

推荐阅读