在 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()
我有一些简单的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()