760176104 发表于 2018-7-29 08:48:27

Ansible源码解析Inventory主机概念

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=value
  # 获取主机组,这里是获取组,包含其父组,最后是一个列表
  def get_groups(self):
  groups = {}
  for g in self.groups:
  groups = g
  ancestors = g.get_ancestors()
  for a in ancestors:
  groups = 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('.')
  # 主机的所有组信息
  results['group_names'] = sorted([ g.name for g in groups if g.name != 'all'])
  return results
页: [1]
查看完整版本: Ansible源码解析Inventory主机概念