import ansible.constants as C from ansible import utils
class 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