在 Jinja 模板中使用 Python 循环

Using Python loops with Jinja template

我有一些简单的Python,其目标是部署主机文件。 hosts 文件看起来像这样:

[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 c

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

提前致谢。

我已经修改了,你可以再修改。如果它不起作用,请告诉我。

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()