ansible--inventory模块之expand_hosts .py 源码分析

网友投稿 732 2022-10-05

ansible--inventory模块之expand_hosts .py 源码分析

ansible--inventory模块之expand_hosts .py 源码分析

expand_hosts.py中包含两个函数;

detect_range()和expand_hostname_range()

主要目的是处理hosts配置文件中主机名字段

'''主要目的是处理hosts配置文件中主机名字段hosts配置例子: cat hosts [clusters] sp-[1:3] sp-[a:e] [others] sp-[01:03] [test:children] clusters others'''import stringfrom ansible import errorsdef detect_range(line = None): ''' 按行读取hosts文件,并且获取主机行 例子: sp-[1:3]、sp-[a:g]、sp-[05:10] ''' if (not line.startswith("[") and # 不是以[开头,排除组名行[组名] line.find("[") != -1 and # 字符串.find('值') 返回查找值的索引,不等于-1表示匹配到该值 line.find(":") != -1 and line.find("]") != -1 and line.index("[") < line.index(":") < line.index("]")): # index()获取索引,这里的意思是sp-[1:3],三个符号形成这样的组合 return True else: return Falsedef expand_hostname_range(line = None): all_hosts = [] # 主机列表 if line: # 将line(sp-[1:3])"["和"]"替换成"|",再根据"|"切割; or sp-[01:03] # (head, nrange, tail) ==> ('sp-', '1:3', '') or ('sp-', '01:03', '') (head, nrange, tail) = line.replace('[','|').replace(']','|').split('|') # bounds ==> (1,3) or (01,03) bounds = nrange.split(":") if len(bounds) != 2: # ansible不支持步长,[:]里只能两个值 raise errors.AnsibleError("host range incorrectly specified") beg = bounds[0] # 起始 ==> 1 or 01 end = bounds[1] # 结束 ==> 3 or 03 if not beg: # 起始默认值为 0 beg = "0" if not end: # 结束端没有,则抛出异常 raise errors.AnsibleError("host range end value missing") if beg[0] == '0' and len(beg) > 1: # 判断是否是0填充模式,比如[01:03],beg ==> 01 以0开头,且长度大于1 rlen = len(beg) # range length formatting hint # rlen ==>beg的长度,01,长度则是2, 001,则是3 if rlen != len(end): # beg和end的长度要一致,(001, 010),否则抛出异常 raise errors.AnsibleError("host range format incorrectly specified!") ''' zfill(rlen) 字符串不足rlen长度的,以0填充 lambda函数中的'_',表示传入参数 str转换为字符串格式 fill保存lambda函数,提供给下文调用 ''' fill = lambda _: str(_).zfill(rlen) # range sequence else: ''' 否则将str类型赋值给fill >>> fill = str >>> fill ''' fill = str try: ''' 处理字符格式的序列,比如sp-[a:g] >>> import string >>> string.ascii_letters # 26个字母的大小写顺序排列 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' string.ascii_letters.index() 拿到字母排列对应的索引;传入字符 如果传入数字,则抛出异常 ''' i_beg = string.ascii_letters.index(beg) # a ==> 0 i_end = string.ascii_letters.index(end) # g ==> 6 if i_beg > i_end: # 只能由a-zA-Z的顺序 raise errors.AnsibleError("host range format incorrectly specified!") ''' >>> string.ascii_letters[0:6+1] 'abcdefg' 通过索引拿到对应的字母序列 ''' seq = string.ascii_letters[i_beg:i_end+1] except ValueError: # not a alpha range ''' 获取数字序列 beg和end是str类型 >>> beg = '01' >>> end = '09' >>> range(int(beg), int(end)+1) [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> int('09') 9 ''' seq = range(int(beg), int(end)+1) for rseq in seq: # 循环生成主机名 # seq ==> [1, 2, 3...] or abcd hname = ''.join((head, fill(rseq), tail)) # sp-1、sp-2 or sp-01、sp-02 or sp-a、sp-b all_hosts.append(hname) return all_hosts

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微信小程序页面跳转的方法(附代码)(微信小程序开发怎么跳转页面)
下一篇:微信小程序中bug的解决:页面使用flex布局在iOS9.X中无法正常渲染的解决方案
相关文章

 发表评论

暂时没有评论,来抢沙发吧~