【问题标题】:Using Python loops with Jinja template在 Jinja 模板中使用 Python 循环
【发布时间】:2015-10-04 17:28:01
【问题描述】:

我有一些简单的 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 代码如下所示:

主机名.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()

当我针对 tfhosts 运行我的 Python 时,它只是将整个主机集生成为一个数组切片,或者如果我尝试使用 [0:] 来限制范围

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

[master1]
d
[master2]
c

我只得到第一个字母d(主机名的),对于master 2 c。

谁能发现问题并提供一些指导?

提前致谢。

【问题讨论】:

  • ``` render_inventory = inventory_template.render({ 'host_master01': gethosts[0], 'host_master02': gethosts[1], })```的输出是什么? >
  • 我得到:回溯(最近一次调用最后一次):文件“test.py”,第 32 行,在 'host_master01':gethosts[1],IndexError:列表索引超出范围

标签: python loops jinja2


【解决方案1】:

我已对其进行了修改,您可以进一步修改。如果它不起作用,请告诉我。

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

【讨论】:

  • 感谢您的回答。我试过了,但我仍然有同样的问题,输出文件(有你的修改)产生:[root@runner ~]# cat /tmp/tmpAuvNIF [master01]d[master02]c而不是放整行,它只放前两个字母。应该是:[root@runner ~]# cat /tmp/tmpAuvNIF[master01]dc01-control-01[master1]dc02-control-02直到最后我都无法单独读取每一行。
  • 你能打印gethosts 吗?我的是一个列表。
  • 当我打印时作为列表中的单个项目返回:['dc01-control-01\ndc01-control-02\ndc01-control-03\ndc01-worker-01\ndc01-worker-02\n']
  • 对不起,我运行了错误的版本,使用了我得到的更改:['dc01-control-01', 'dc01-control-02', 'dc01-control-03', 'dc01-worker-01', 'dc01-worker-02'] 我只是想逐行提取它,我该如何分割这个列表来做到这一点?所以我得到:[master01] dc01-control-01 etc...
  • 它现在似乎起作用了,我的大脑功能出现了问题。谢谢!最后一个问题,我如何设置它以使所有其他主机默认都在[master02] 下?如果我输入 gethosts[3:] 我会得到一个完整的列表,它不会让我拆分 gethosts 来强制换行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
相关资源
最近更新 更多