Необходимо создать сценарий Python, который получает факты о системе в разных средах (хотя по существу частично копирует функциональные возможности модуля настройки) и выводит данные в формате json. Примерно так:
{
"DATE": "14102019 0101",
"HOSTNAME": "host1",
"DOMAIN": ""no domain name",
"HW_PLATFORM": "x86_64",
"SERVER_TYPE": "virtual",
"CPU_TYPE": "Intel Xeon Processor (Skylake, IBRS)",
"CPU_COUNT": "1",
"CORE_COUNT": "8",
"THREAD_COUNT": "8",
"MEMORY": "32005120 kB",
"OS": "Linux",
"OS_VERSION": "CentOS",
"OS_UPTIME": "6473126",
"RELEASE": "7.6.1810",
"RELEASE_PATCHLEVEL": "NOT READY"
}
Также есть условие: использовать меньше дополнительных модулей python. Только ванильные возможности python2.6. Так что ANSIBLE будет лучше для этих целей, но есть другое условие: не используйте системы оркестровки :), только Python.
Поскольку у меня меньше опыта в программировании на Python, не могли бы вы помочь мне вправильно и упрощенно дать некоторые советы и ссылки на соответствующие скрипты с исходным кодом, которые используются для сбора информации о системе?
https://github.com/ansible/ansible/blob/devel/lib/ansible/modules/system/setup.py
Я также пишу какой-то грязный код:
#!/usr/bin/python
import struct
import os
import json
import subprocess
import re
import datetime
import socket
import platform
import psutil
def cpuHypervisorID():
HYPERVISOR_CPUID_LEAF = 0x40000000
with open('/dev/cpu/0/cpuid', 'rb') as f:
f.seek(HYPERVISOR_CPUID_LEAF)
c = struct.unpack('I12s', f.read(16))
return c[1].strip('\x00')
def cpuModelName():
with open('/proc/cpuinfo', 'rt') as f:
for line in f:
if ':' in line:
k, v = line.split(':', 1)
k = k.strip()
if k == 'model name':
return v.strip()
return ''
def findHypervisor():
name = ''
try:
hid = cpuHypervisorID()
if hid == 'VMwareVMware':
name = 'vmware'
elif hid == 'Microsoft Hv':
name = 'hyperv'
elif hid == 'XenVMMXenVMM':
name = 'xen'
elif hid == 'KVMKVMKVM':
name = 'kvm'
elif 'QEMU' in cpuModelName():
name = 'qemu'
except:
pass # TODO
return name
def server_type():
if findHypervisor() == '':
return "physical"
else:
return findHypervisor()
def cpu_count():
return int(subprocess.check_output('cat /proc/cpuinfo | grep "physical id" | sort -u | wc -l', shell=True))
def get_uptime():
with open('/proc/uptime', 'r') as f:
uptime_seconds = float(f.readline().split()[0])
return uptime_seconds
getinfo = {}
getinfo["DATE"] = datetime.datetime.today().strftime("%d%m%y %H%M")
getinfo["HOSTNAME"] = socket.gethostname()
getinfo["DOMAIN"] = ".".join(socket.getfqdn().split('.')[-2:])
getinfo["HW_PLATFORM"] = platform.machine()
getinfo["SERVER_TYPE"] = server_type()
getinfo["CPU_TYPE"] = cpuModelName()
getinfo["CPU_COUNT"] = cpu_count()
getinfo["CORE_COUNT"] = int(psutil.cpu_count(logical=False)) * cpu_count()
getinfo["THREAD_COUNT"] = int(psutil.cpu_count(logical=True)) * cpu_count()
getinfo["MEMORY"] = (str(os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES')/(1024)) + " kB")
getinfo["OS"] = (str(platform.system()))
getinfo["OS_VERSION"] = (str(platform.release()))
getinfo["OS_UPTIME"] = "NOT READY"
getinfo["RELEASE"] = (str(platform.dist()))
getinfo["RELEASE_VERSION"] = (str(platform.version()))
getinfo["RELEASE_PATCHLEVEL"] = "NOT READY"
print json.dumps(getinfo)
И был бы признателен вам за любой ограничительный обзор.
С уважением