本文共 2003 字,大约阅读时间需要 6 分钟。
主机作为Inventory最小的颗粒,所以比较简单,拥有其自己的名字,变量,组信息,其中变量可以获取此主机所有父组以及父组的父组的变量, 同时也有一些提供认证的变量,组信息则是所有的父组是一种递归
host_name = { "name" : name, "port" : port, "vars" : { "key", "value", }, "groups" : [group, group, group]}
主机比较关键的地方还在与变量,组为一个逻辑关系的方式,主机为实体,组为关系。
主机的变量实质是一种继承的关系,由于大量用到嵌套自己,所以也不太可能用到类继承的关系
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/