通过AnsibleAPI获取主机信息-创新互联
在我上一篇文章中,编写了 Ansible Ad-Hoc & Playbook 的 API,
这一篇将使用 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) + "\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()
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
当前文章:通过AnsibleAPI获取主机信息-创新互联
路径分享:http://azwzsj.com/article/pecod.html