通过 Ansible API 获取主机信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过 Ansible API 获取主机信息相关的知识,希望对你有一定的参考价值。

在我上一篇文章中,编写了 Ansible Ad-Hoc & Playbook 的 API,上篇文章 http://blog.51cto.com/784687488/2171821
这一篇将使用 Ansible API 获取主机详细信息,CMDB系统中最基本的功能

话不多说,还是直接上代码

# - encoding:utf-8 -

import os
import sys

# 因为我是在 django 中使用,所以我加上了下面这段代码。自已测试时不用加
import django
Search_Path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(file))))
sys.path.append(Search_Path)
os.environ.setdefault(‘DJANGO_SETTINGS_MODULE‘, ‘AutoOPPlatform.settings‘)
django.setup()

import ansibleAPI
from collections import namedtuple

DEVICES = namedtuple(‘mount‘, [‘device‘, ‘point‘, "total_size", "free_size"])

class Resource(object):

def __init__(self, hostname=None, sshport=22, username=None, password=None, **kwargs):

    if hostname:
        self.hostname = hostname
        self.sshport = sshport
        self.username = username
        self.password = password
        self.group = None
    if kwargs:
        self.hostname = None
        self.group = kwargs
    self.info = self._get_info()

def _get_info(self):

    if self.hostname:
        execute = ansibleAPI.AnsibleAPI([dict(hostname=self.hostname, port=self.sshport,
                                              username=self.username, password=self.password)])
        execute.PrivateAdHoc(‘setup‘)
        msg = execute.adhoc_result()
        for k in msg.keys():
            if k == ‘success‘ and msg[‘success‘]:
                return dict(success=msg[‘success‘])
            elif k == ‘unreachable‘ and msg[‘unreachable‘]:
                return dict(error=msg[‘unreachable‘])
            elif k == ‘failed‘ and msg[‘failed‘]:
                return dict(error=msg[‘failed‘])
    if self.group:
        execute = ansibleAPI.AnsibleAPI(self.group)
        execute.PrivateAdHoc(‘setup‘)
        msg = execute.adhoc_result()
        return msg

def get_info(self):
    return self.info

def get_failed(self):
    return self.info[‘failed‘]

def get_unreachable(self):
    return self.info[‘unreachable‘]

def get_success(self):
    success = []
    for k in self.info[‘success‘]:
        success.append(k)
    return success

def get_hostname(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_hostname‘]

def ip(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_default_ipv4‘][‘address‘]

def netmask(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_default_ipv4‘][‘netmask‘]

def gateway(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_default_ipv4‘][‘gateway‘]

def broadcast(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_default_ipv4‘][‘broadcast‘]

def mac(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_default_ipv4‘][‘macaddress‘]

def memory_cards(self):
    if self.hostname:
        execute = ansibleAPI.AnsibleAPI([dict(hostname=self.hostname, port=self.sshport,
                                              username=self.username, password=self.password)])
        execute.PrivateAdHoc(‘shell‘, ‘dmidecode -t memory|grep Size|grep MB|wc -l‘)
        msg = execute.adhoc_result()
        for k in msg.keys():
            if k == ‘success‘ and msg[‘success‘]:
                return msg[‘success‘][self.hostname][‘stdout‘]
            elif k == ‘unreachable‘ and msg[‘unreachable‘]:
                return 0
            elif k == ‘failed‘ and msg[‘failed‘]:
                return 0
    if self.group:
        execute = ansibleAPI.AnsibleAPI(self.group)
        execute.PrivateAdHoc(‘shell‘, ‘dmidecode -t memory|grep Size|grep MB|wc -l‘)
        msg = execute.adhoc_result()
        return msg

def memory_total(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_memtotal_mb‘]

def memory_free(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_memfree_mb‘]

def memory_used(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_memory_mb‘][‘real‘][‘used‘]

def swap_total(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_swaptotal_mb‘]

def swap_free(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_swapfree_mb‘]

def swap_used(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_memory_mb‘][‘swap‘][‘used‘]

def memory(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_memory_mb‘]

def cpu_brand_model(self):
    take_repetition = set(self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_processor‘])
    take_repetition.remove(‘GenuineIntel‘)
    if len(take_repetition) == 1:
        return list(take_repetition)[0]
    elif len(take_repetition) == 0:
        return None
    else:
        cpu = ""
        for n in take_repetition:
            cpu = str(cpu) + str(n) + "
"
        return cpu

def cpu_number(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_processor_count‘]

def cpu_core(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_processor_cores‘]

def cpu_thread(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_processor_vcpus‘]

def kernel(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_kernel‘]

def device(self):
    device_size = dict()
    for dev, info in self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_devices‘].iteritems():
        if dev != ‘sr0‘:
            device_size.setdefault(dev, info[‘size‘])
    return device_size

def device_number(self):
    return len(self.device())

def device_total_size(self):
    return reduce(lambda x, y: x + y, self.device().values())

def partitions(self):
    partitions = dict()
    for dev, info in self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_devices‘].iteritems():
        if dev != ‘sr0‘:
            partitions.setdefault(dev, dict())
            for partition, v in info[‘partitions‘].iteritems():
                partitions[dev].setdefault(partition, v[‘size‘])
    return partitions

def mounts(self):

    mount_list = []
    for dev in self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_mounts‘]:
        mount = DEVICES(device=dev[‘device‘], point=dev[‘mount‘],
                          total_size=dev[‘size_total‘], free_size=dev[‘size_available‘])
        mount_list.append(mount)
    return mount_list

def system(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_system‘]

def architecture(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_machine‘]

def distribution(self):
    return "%s %s" % (self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_distribution‘],
                      self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_distribution_version‘])

def uuid(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_product_uuid‘]

def vendor(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_system_vendor‘]

def product_name(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_product_name‘]

def serial_number(self):
    return self.info[‘success‘][self.hostname][‘ansible_facts‘][‘ansible_product_serial‘]

if name == ‘main‘:

host = Resource(‘10.10.181.132‘, sshport=20003, username=‘root‘, password=123456)
print host.memory_cards()
#hosts = [{‘hostname‘: ‘10.0.2.6‘}, {‘hostname‘: ‘10.0.2.7‘}, {‘hostname‘: ‘10.0.2.8‘}]
#group = Resource(group1=dict(hosts=hosts, vars={}))
#print group.get_failed()
#print group.get_unreachable()
#print group.get_success()

以上是关于通过 Ansible API 获取主机信息的主要内容,如果未能解决你的问题,请参考以下文章

使用ansible API打印主机列表

PHP通过ZABBIX API获取主机信息 VS 直接从数据库获取主机信息

ansible-cmdb友好展示ansible收集主机信息

Ansible 之动态Inventory文件

[RHCE学习笔记] ansible使用jinja2 生成hosts主机文件

Ansible运行setup模块卡住不动