python - 如何使用 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
解决方案
例如,要将所有单位转换为 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 %}
推荐阅读
- python - 检查 Python 列表是否包含特定元素
- python - 带有 gunicorn 的 Docker 中的 Flask 应用程序
- css - codename1 项目选项卡组件,我的 codename1 项目从任何地方改变行为
- animation - 后效:如何使文本跟随条形图中动画条的顶部
- ios - 在 Swift 包管理器中找不到“framework/header1.h”文件
- php - Laravel 分页方法不适用于变换方法
- reactjs - 永久解决无法在这个大工作区中监视文件更改
- python - Hosting single project in different server
- bash - 不是有效的标识符 - Apache Maven
- django - 在 django 网站的自动部署期间将调试模式设置为 false