2015-10-04 66 views
0

我有一些简单的Python,其目标是部署hosts文件。 hosts文件的目的是这个样子:使用带有Jinja模板的Python循环

[master1] 
*hostname* 

[master2] 
*hostname 

我使用Python,试图做到这一点,首先,我检索我的VMware主机名建立和把它们放在一个名为tfhosts文件,它遵循/ etc/hosts文件的格式:

tfhosts

192.168.100.21 dc01-control-01 
192.168.100.22 dc01-control-02 
192.168.100.23 dc01-control-03 
192.168.100.31 dc01-worker-01 
192.168.100.32 dc01-worker-02 

的Python代码如下所示:

hostname.py

import jinja2 
from tempfile import NamedTemporaryFile 

def return_hosts(): 
     hosts = open('./tfhosts','r') 
     x = "" 
     for line in hosts: 
       x = x + str(line.split()[1:]).strip('[]').strip("''") + '\n' 
     return [x][0:] 

inventory = """ 
[master1] 
{{ host_master01 }} 
[master2] 
{{ host_master02 }} 
""" 

gethosts = return_hosts() 

inventory_template = jinja2.Template(inventory) 

for servers in (gethosts): 
     rendered_inventory = inventory_template.render({ 
       'host_master01': servers[0], 
       'host_master02': servers[1], 
     }) 

hosts = NamedTemporaryFile(delete=False) 
hosts.write(rendered_inventory) 
hosts.close() 

当我运行我的Python针对tfhosts,它简单地产生任一整组主机作为一个阵列切片或如果我试图通过使用限制范围[0:]

或者如果我使用服务器[0] |服务器[1]中的代码:

[master1] 
d 
[master2] 
c 

我得到的第一个字母d(主机名)只和用于主2 Ç

任何人都可以发现问题并提供一些指导吗?

在此先感谢。

+0

什么是与''' rendered_inventory = inventory_template.render输出({ 'host_master01':gethosts [0], 'host_master02':gethosts [1], })'''? – User

+0

我得到: 回溯(最近最后一次通话): 文件 “test.py”,第32行,在 'host_master01':gethosts [1], IndexError:列表索引超出范围 –

回答

0

我修改了它,你可以进一步修改它。让我知道如果它不起作用。

import jinja2 
from tempfile import NamedTemporaryFile 

def return_hosts(): 
    'return a list of host names' 
    with open('./tfhosts') as hosts: 
     return [host.split()[1].strip() for host in hosts] 

inventory = """ 
[master1] 
{{ host_master01 }} 
[master2] 
{{ host_master02 }} 
""" 

gethosts = return_hosts() 

inventory_template = jinja2.Template(inventory) 

rendered_inventory = inventory_template.render({ 
    'host_master01': gethosts[0], 
    'host_master02': gethosts[1], 
    }) 

hosts = NamedTemporaryFile(delete=False) 
hosts.write(rendered_inventory) 
hosts.close() 
+0

感谢您的回答。我试过,但我仍然有同样的问题,输出文件(修正案)生产: '[根@亚军〜]#猫的/ tmp/tmpAuvNIF [master01]''D' '[master02]' 'c' 不是放在整行上,而是放在前两个字母。它应该是: '[根@转轮〜]#猫/ TMP/tmpAuvNIF' '[master01]'' DC01-控制01' '[master1]'' DC02-控制02' 我不能单独阅读每行,直到结束。 –

+0

你能打印'gethosts'吗?我的名单是。 – User

+0

当我打印是回来为列表中的一个项目: '['DC01控制-01 \ ndc01控制-02 \ ndc01控制-03 \ ndc01工人-01 \ ndc01工人-02 \ N ']' –