2015-10-04 27 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 ']' –