博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ansible源码解析Inventory主机概念
阅读量:7103 次
发布时间:2019-06-28

本文共 2003 字,大约阅读时间需要 6 分钟。

Host.py

作者 煮酒品茶

说明

主机作为Inventory最小的颗粒,所以比较简单,拥有其自己的名字,变量,组信息,其中变量可以获取此主机所有父组以及父组的父组的变量, 同时也有一些提供认证的变量,组信息则是所有的父组是一种递归

对应一个字典

host_name = {    "name" : name,    "port" : port,    "vars" : {        "key", "value",    },    "groups" : [group, group, group]}

补充分析

主机比较关键的地方还在与变量,组为一个逻辑关系的方式,主机为实体,组为关系。

主机的变量实质是一种继承的关系,由于大量用到嵌套自己,所以也不太可能用到类继承的关系

host类的原型溈

import ansible.constants as Cfrom ansible import utilsclass Host(object):    ''' a single ansible host '''    # 对外提供的方法, 节省内存的一种手段    __slots__ = [ 'name', 'vars', 'groups' ]    # 初始化,需要提供主机名和端口主机名和端口    def __init__(self, name=None, port=None):        # 此组的方式一样 主机有自己的变量        self.name = name        self.vars = {}        self.groups = []        # 如果port为真,并且port不为配置文件中的远程port        # 设置port以参数为准        if port and port != C.DEFAULT_REMOTE_PORT:            self.set_variable('ansible_ssh_port', int(port))        # 不允许主机名为空        if self.name is None:            raise Exception("host name is required")    # 简单的添加组的方法    def add_group(self, group):        self.groups.append(group)    # 简单的添加变量的方法    def set_variable(self, key, value):        self.vars[key]=value    # 获取主机组,这里是获取组,包含其父组,最后是一个列表    def get_groups(self):        groups = {}        for g in self.groups:            groups[g.name] = g            ancestors = g.get_ancestors()            for a in ancestors:                groups[a.name] = a        return groups.values()    # 获取所有的变量,也是个递归函数,即所有父组爷爷组拥有的变量    # 这个主机都拥有    def get_variables(self):        results = {}        groups = self.get_groups()        for group in sorted(groups, key=lambda g: g.depth):            results = utils.combine_vars(results, group.get_variables())        results = utils.combine_vars(results, self.vars)        # 添加固定的几个变量,主机名称,         results['inventory_hostname'] = self.name        # 这个应该是针对IPV6的        results['inventory_hostname_short'] = self.name.split('.')[0]        # 主机的所有组信息        results['group_names'] = sorted([ g.name for g in groups if g.name != 'all'])        return results

转载地址:http://avdhl.baihongyu.com/

你可能感兴趣的文章
Javascript获取IFrame内容(兼容IE&FF)
查看>>
[物理学与PDEs]书中出现的向量公式汇总
查看>>
_appstart.cshtml,_pagestart.cshtml,_viewstart.cshtml
查看>>
table_单线条设置大全(转)
查看>>
PHP安全设置(转载)
查看>>
【软件使用】GitHub使用教程for VS2012
查看>>
jQuery UI Datepicker使用介绍
查看>>
Android -- 获取IP和MAC地址
查看>>
踩踩踩
查看>>
MPI编程简单介绍
查看>>
Eclipse 中java跨工程调用类
查看>>
js split str.split(" "); split使用方法 在某处截字符串
查看>>
待翻译的一篇文档
查看>>
ipa上传到APP store
查看>>
Atitit.可视化编程jbpm6 的环境and 使用总结...
查看>>
SilverLight-3:SilverLight 备注
查看>>
数学图形(1.37)伯努利双纽线(无穷大的符号)
查看>>
Ruby
查看>>
SQL Server 执行计划中的扫描方式举例说明
查看>>
用LUA实现BYTEARRAY和BYTEARRAYVARINT
查看>>