我有一个使用以下代码构建的列表:
def return_hosts():
'return a list of host names'
with open('./tfhosts') as hosts:
return [host.split()[1].strip() for host in hosts]
tfhosts 的格式是hosts文件的格式,所以我正在做的是获取主机名部分并将其填充到模板中,到目前为止这是有效的。
我要做的是确保即使添加了更多主机,他们也会在其他主机部分被修复时被放入默认部分,但这部分我希望是动态的,这样做我得到了以下内容:
rendered_inventory = inventory_template.render({
'host_main': gethosts[0],
'host_master1': gethosts[1],
'host_master2': gethosts[2],
'host_spring': gethosts[3],
'host_default': gethosts[4:],
})
除了host_default部分下的最后一个主机之外,所有内容都正确呈现,而不是获取新行分隔的主机列表,如下所示(这就是我想要的):
[host_default]
dc01-worker-02
dc01-worker-03
它只是在一个列表中写出剩余的主机名,因为(我不想要):
[host_default]
['dc01-worker-02', 'dc01-worker-03']
我试图包装主机默认部分并将其拆分,但如果我尝试,我会收到运行时错误:
[gethosts[4:].split(",").strip()...
答案 0 :(得分:0)
我相信gethosts[4:]
会返回一个列表,如果gethosts
是一个列表(似乎就是这种情况),那么它就是直接将列表写入您的文件。
此外,您无法在列表中执行.split()
(我猜您希望对字符串执行.split
,但gethosts[4:]
会返回一个列表。我相信一个简单的方法是使用str.join
和\n
作为分隔符加入列表中的字符串。示例 -
rendered_inventory = inventory_template.render({
'host_main': gethosts[0],
'host_master1': gethosts[1],
'host_master2': gethosts[2],
'host_spring': gethosts[3],
'host_default': '\n'.join(gethosts[4:]),
})
演示 -
>>> lst = ['dc01-worker-02', 'dc01-worker-03']
>>> print('\n'.join(lst))
dc01-worker-02
dc01-worker-03
如果您拥有该模板,则更简洁的方法是遍历host_default
的列表并打印模板中的每个元素。例如,您可以尝试使用for
loop construct in the jinja template。