как работает ANSIBLE модуль установки изнутри? - PullRequest
0 голосов
/ 17 октября 2019

Необходимо создать сценарий 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)

И был бы признателен вам за любой ограничительный обзор.

С уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...