Ansible源码解析Inventory主机概念

Host.py

作者 煮酒品茶

说明

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

对应一个字典

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

补充分析

主机比较关键的地方还在与变量,组为一个逻辑关系的方式,主机为实体,组为关系。
主机的变量实质是一种继承的关系,由于大量用到嵌套自己,所以也不太可能用到类继承的关系

host类的原型溈

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值