Ansible源码解析 Inventory组概念
group.py
作者 煮酒品茶
一个组的Class,包含对外方法以及属性如下。
组做为inventory的子节点,会有嵌套组,组变量,组内主机,子组,父组的一些概念
[ 'name', 'hosts', 'vars', 'child_groups', 'parent_groups', 'depth', '_hosts_cache' ]
- name 主机名称,就是IP
- hosts 组内主机列表
- vars 组的变量
- child_groups 子组
- parent_groups 父组
- depth 深度,表示这个组有多少嵌套的组
- _hosts_cache 一个用来清理内存的方法
属性说明
虽然类是一个对象,但是我们有时可以把类看成一个字典,加一个方法
Group看起来就像一个字典,既然理解是一个字典,我们把结构分析出来。
记住这个结构就很好理解这个类,另外提供的方法都是为了实现这个实例
group_name = {"depth" : depth,"name" : name,"hosts" : [host, host, host], # 这里的host为host类的实例,看host类分析"vars" : {"key1" : "value1","key2" : "value2",},"child_groups" : [group, # 这里的group就是我们自己,一种深度的方式group, group,],"parent_group" : [group, # 这里的group就是我们自己group, group ,],# 这里的host为所有的子组子组的host的集合,# 代表这个组包含的所有主机"_hosts_cache" : [host, host, host]
}
方法说明
- add_child_group # 添加子组
- add_host # 添加主机,即添加到hosts属性当中
- set_variable # 设置环境变量,即vars当中
- clear_hosts_cache # 清空组内所有主机的缓存,这是一个属性
- get_hosts # 获取所有主机,当_hosts_cache不存在时,否则直接返回_hosts_cache
- get_variables # 获取所有变量
- get_ancestors # 获取所有父组
类原型
class Group(object):''' a group of ansible hosts '''__slots__ = [ 'name', 'hosts', 'vars', 'child_groups', 'parent_groups', 'depth', '_hosts_cache' ]def __init__(self, name=None):# 组内的主机、子组和父组是一个列表、变量为为字典self.depth = 0self.name = nameself.hosts = []self.vars = {}self.child_groups = []self.parent_groups = []self._hosts_cache = None#self.clear_hosts_cache()# 不允许没有不传组名,这里没有用真假, 个人认为用# if not self.name 为更好if self.name is None: raise Exception("group name is required")# 添加子组方法def add_child_group(self, group):if self == group: # 不允许自己添加自己raise Exception("can't add group to itself")# don't add if it's already there# 组名如果已经存在子组里面即不添加,这里的验证方式以组名认证# 同样认为用 if group not in self.child_groups会更好理解一点if not group in self.child_groups:# 添加子组,可以看到子组也是一个列表self.child_groups.append(group)# update the depth of the child# 更新组的深度,这里需要注意的是子组也是同样走这个类,而depth# 会动态生成, 比较当前组的深度 +1 与要添加的组的深度,哪个# 更大当前组的深度就为这个group.depth = max([self.depth+1, group.depth])# update the depth of the grandchildren# 更新子组的子组的深度,这里用的是注释是孙组# 但看函数原型则所有后辈组的深度为一样group._check_children_depth()# now add self to child's parent_groups list, but only if there# isn't already a group with the same name# 如果组名不在 父组列组的名称当中,用到了列表解析# 通过列表解析获取所有父组的名字来进行比对,不在即不同名,就添加# 到父组里面if not self.name in [g.name for g in group.parent_groups]:group.parent_groups.append(self)# 添缓存, 即子组与所有子组的 _hosts_cache为量为空self.clear_hosts_cache()# 验证子组深度,这是一个递归函数,这里可以知道的一点是# 所有后輩组的深度都是一样def _check_children_depth(self):# 递归所有子组for group in self.child_groups: # 子组的深度更新,保持与当前组一置group.depth = max([self.depth+1, group.depth])# 递归,所以所有子组的所有深度都会被改变group._check_children_depth()# 添加主机def add_host(self, host):# 往组的主机列表里添加这台主机self.hosts.append(host)# 同样把主机的组里面添加自己的组host.add_group(self)# 再清缓存, 即子组与所有子组的 _hosts_cache为量为空self.clear_hosts_cache()# 设置变量,这里对应的是组,所以设置的是组的变量def set_variable(self, key, value):self.vars[key] = value# 清空缓存def clear_hosts_cache(self):# 子组与所有子组的 _hosts_cache为量为空self._hosts_cache = Nonefor g in self.parent_groups:g.clear_hosts_cache()# 获取组内的主机def get_hosts(self):# 如果主机缓存在的话直接返回,否则返回内置方法# self._get_hosts()if self._hosts_cache is None:self._hosts_cache = self._get_hosts()return self._hosts_cache# 内置获取主机的方法, 用到集合的概念,但没有用集合的方法def _get_hosts(self):# hosts列表 seen 字典hosts = []seen = {}# 先遍历子组for kid in self.child_groups:# 一个递归,外部递归,获取子组的所有主机,即# 不管组多深,都能拿出子组所有的主机kid_hosts = kid.get_hosts()# 下面是做主机重复的判断,如果重复了就不加了for kk in kid_hosts:if kk not in seen:# 这里暂时没有意义,代表主机已经存在了seen[kk] = 1 # 不存在就添加主机hosts.append(kk)# 再遍历自己组的主机for mine in self.hosts:# 上面的seen作用主要体现在这儿,因为两个for# 命令空间不同所以写在这里做判断,同样存在即不添加# 保持hosts为一个组内的集合 集合是不会有同样的组的if mine not in seen:seen[mine] = 1hosts.append(mine)return hosts# 获取变量def get_variables(self):# 一份浅拷贝的变量,需要注意的是变量是没有潜逃的return self.vars.copy()# 获取所有父组的递归函数def _get_ancestors(self):results = {}for g in self.parent_groups:results[g.name] = gresults.update(g._get_ancestors())return resultsdef get_ancestors(self):return self._get_ancestors().values()
转载于:https://blog.51cto.com/cwtea/2043640
相关文章:

Hadoop简要介绍
本文大部分内容都是从官网Hadoop上来的。其中有一篇介绍HDFS的pdf文档,里面对Hadoop介绍的比较全面了。我的这一个系列的Hadoop学习笔记也是从这里一步一步进行下来的,同时又参考了网上的很多文章,对学习Hadoop中遇到的问题进行了归纳总结。 …

超 40W 奖金池等你来战!第二届“长沙银行杯”腾讯云启创新大赛火热来袭!...
HEY!你在等待一个机会提升自己的能力吗?现在机会来啦!第二届“长沙银行杯”腾讯云启创新大赛如约而至!现在,让更多人见证你的创新能力和新鲜想法第二届“长沙银行杯”腾讯云启创新大赛由长沙银行联合腾讯云、腾讯云启共…

(转)AppCan中调用系统浏览器打开网页
<!DOCTYPE html> <html> <head> <style>body{ background:#fff; font-size:30px;}</style> <meta charset"utf-8"> <script> function openUrl(url){if(uexWidgetOne.getPlatform()0){//IOS设备uexWidget.loadApp(url,,);…

Python optionParser模块的使用方法
Python 有两个内建的模块用于处理命令行参数: 一个是 getopt,《Deep in python》一书中也有提到,只能简单处理 命令行参数; 另一个是 optparse,它功能强大,而且易于使用,可以方便地生成标准的、…

squid命中率分析参数注释
默认squid配置文件里面已经加上acl all src 0.0.0.0/0.0.0.0acl manager proto cache_objecthttp_access allow all#cachemgr_passwd pass allhttp_access allow Manager all 3.0直接看这里基本的使用方法*取得squid运行状态信息: squidclient -p 80 mgr:info //注…

库克退休前的最后一战:不是苹果汽车而是……
整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 上个月库克迎来了他担任苹果 CEO 十周年的日子,我们也为此统计了一份成绩单;而下一个十年,库克可能不会再陪苹果完整走过了:今年 4 月库克在采访中表示…

VIM技巧:显示行号
在vi的命令模式下输入":set nu",就有行号了,取消行号输入":set nonu"。 命令只对当前文档有效,如果想使vi打开文档时默认显示行号,可以修改vi的配置文件。 # vi ~/.vimrc 在这个文件中,添加 set n…

Python 自动化运维 pycurl
1.探测web服务质量(HTTP状态码,请求延时,HTTP头信息,下载速度等) web服务质量:1.服务可用性 2.服务响应速度 2.实例 12345678910111213141516171819202122232425262728293031323334353637383940414243impor…

Squid3反向代理安装与配置
一、编译安装 下载 #wget http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE25.tar.gz //找到地址#tar zxvf squid-3.0.STABLE25.tar.gz //稳定版#cd squid-3.0.STABLE25 #./configure --prefix/usr/local/squid / //必须 //以下几步可选 --enable-arp-ac…

ServiceStack OrmLite 数据库查询 几个实用方法 (继承表格式化集合等)
执行SQL语句:int result db.SqlScalar<int>("SELECT OBJECT_ID(name)", new { name "SomeName" });继承表的实现 (存储于同一个表中)[Alias("Table")] public abstract class MyBaseClass {public…

Deepsort + Yolo 实现行人检测和轨迹追踪
作者 | 李秋键 出品 | AI科技大本营(ID:rgznai100) 引言 行人检测是近年来计算机视觉领域的研究热点,同时也是目标检测领域中的难点。其目的是识别和定位图像中存在的行人,在许多领域中都有广泛的应用。交通安全方面,无人驾驶汽车通过提前…

推荐15个国外使用 CSS3 制作的漂亮网站
今天分享的作品集网站有些特别,因为他们都是使用 CSS3 技术制作的。对于设计师来说,为了吸引注意力,作品集必须展示出你的能力,这有点像制作简历,要让人们看到你所擅长的,突出的部分,这是一次推…
7_2判断两个单链表是否相交,若相交,求出第一个交点
转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4251372.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,…

对抗软件系统复杂性①:如无必要,勿增实体
作者 | 袁进辉 我们经常面临如何评价一个大型软件系统质量的问题。首要的评价指标肯定是功能,软件是否满足主要的需求(do right things)。如果有多条技术路径可以实现同样的功能,人们倾向于选择更简单的办法。奥卡姆剃刀准则“如无必要,勿增实…

修改squid的Header中的X-Cache为Powered-By-LinuxTone
今天分析别人网站的时候,注意到国内的chinacache服务商的CDN加速,把squid默认的X-Cache修改为Powered-By-ChinaCache,如下图:以前注意了但是没去研究过,今天刚好有点空挡自己就来研究看看。我的squid版本:s…

NginxApachePHP参数汇总
1、Nginx vim /etc/nginx/conf.d/www.cmdschool.org.conf 12345678910111213client_max_body_size 30m; //上传文件大小改30M upstream www.cmdschool.org { server 10.168.82.25:87; ip_hash; } server { listen 80; server_name www.cmdschool.org; location / { proxy_pass …

android Intent PendingIntent的区别
含义:intent英文意思是意图,pending表示即将发生或来临的事情。 PendingIntent这个类用于处理即将发生的事情。比如在通知Notification中用于跳转页面,但不是马上跳转。 Intent 是及时启动,intent 随所在的activity 消失而消失。…

Squid如何提高命中率
缓存命中1.缓存时间设置,顾名思义,缓存时间设置的越长那么命中率也会相对较高。缓存与更新是一对矛盾的概念,既要做到高命中又要做到快速更新这个就需要自己对自己网站内容的了解然后指定合适的缓存策略。2.缓存能缓存的内容,什么…

海量秋招面试资料等你来拿!你离大厂也许并不远
秋招在即,你还在为秋招如何准备而发愁吗?你还在为拿不到大厂offer而苦恼吗?工欲善其事,必先利其器。金秋开学季,CSDN助力你的技术学习与成长,为你免费提供海量大厂面试资料,让你的秋招不再慌乱&…

Microsoft Dynamics CRM server 2013 中业务规则,有点像C#的正则表达式
Microsoft Dynamics CRM server 2013 中业务规则,我的理解就是有点像C#的正则表达式, 如方某个字段,必须输入什么范围的数值,其它字符不能乱输入。 打开方式有二种: 1. 种像上篇文章中写的那样, 在系统视图…

cCodeforces Round #286 (Div. 2)
A题。。暴力枚举在每个位置添加字符,然后检查一下是不是回文串 1 #include <iostream>2 #include <cstdio>3 #include <cstring>4 #include <algorithm>5 #include <cmath>6 #include <vector>7 8 using namespace std;9 10 #…

Sarg安装配置使用
SARG的全称是:Squid Analysis Report GeneratorSARG作为一款Squid日志分析工具,它采用html格式,详细列出了每一位用户访问internet的站点信息,时间占用信息,排名,连接次数,访问量,访…

OpenAI 以 10 亿美元出售「灵魂」,网友热评不再「Open」
编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) OpenAI 如何以 10 亿美元的价格出售其灵魂:GPT-3 和 Codex 背后的公司并不像它声称的那样开放。 当金钱成为障碍时,最好的意图可能会被破坏。 近日,一篇“How Open…

IBM IMM默认ID 及修改默认IP 方法
默认ID: http://192.168.70.125 用户名:USERID 密码:PASSW0RD (数字0) BIOS 下更改IP方法:(另一种可进IMM 进行修改,此处不再介绍) 本文转自easy80851CTO博客,原文链接:http://blog.51cto.com/6…

squid 优化指南
很多squid 优化只限于在 squid参数和系统参数上面的调整。但是这个实在只是细枝末节的事情,只要不是太弱智的配置导致无法缓存,squid的性能不会有太大差距,也就提高10%左右,只有实际的业务针对squid 进行一些调整,squi…

Android TextView
2019独角兽企业重金招聘Python工程师标准>>> 1、TextView不用获取焦点也能实现跑马灯 public class MarqueeTextView extends TextView { Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { if(focused) …

人脸识别模型的动手实践!
作者:宋志龙 来源:Datawhale人脸识别已经成为生活中越来越常见的技术,其中最关键的问题就是安全,而活体检测技术又是保证人脸识别安全性的一个重要手段,本文将向大家简单介绍活体检测,并动手完成一个活体检…

Pyqt5学习系列
最近在学习Pyqt5做界面,找到了一个非常棒的博主的学习系列 在此记录下来: http://blog.csdn.net/zhulove86/article/category/6381941

编程方式刷新Squid缓存服务器的五种方法
网站进行内容更新是常有的事情,当被缓存的资源更新时,前端Squid 缓存服务器内容也必须要相应的更新,否则用户就可能会看到过期的数据。当没有程序支持时就需要每次登录到服务器上执行刷新操作,在服务器数量小的的时候这种方式还可…

Android 实时文件夹
实时文件夹是一种用来显示由某个ContentProvider提供的数据信息的桌面组件。要创建一个实时文件夹,必须要有两个方面的支持。 1,要定义一个用来创建实时文件夹的Activity。 2,所指定数据信息URI的ContentProvider必须支持实时文件夹时文件夹查…