Ansible Jinja模板-逐行读取文件

Ansible Jinja模板-逐行读取文件,ansible,jinja2,Ansible,Jinja2,我试图在for循环中逐行解析文本文件。我可以很好地解析JSON数据,但一个看似简单的任务在这里失败了。Jinja似乎没有根据换行符进行描绘 在我的YAML剧本中,我声明了源文件和查找(查询)函数: vars: myfile: /some/text/file.txt myfile_list: "{{ query('file', myfile) }}" 源文件“myfile”只是CIDR格式的IP列表: 1.2.3.4/32 5.6.7.8/32 10.20.30.0/24 在J

我试图在for循环中逐行解析文本文件。我可以很好地解析JSON数据,但一个看似简单的任务在这里失败了。Jinja似乎没有根据换行符进行描绘

在我的YAML剧本中,我声明了源文件和查找(查询)函数:

vars:
    myfile: /some/text/file.txt
    myfile_list: "{{ query('file', myfile) }}"
源文件“myfile”只是CIDR格式的IP列表:

1.2.3.4/32
5.6.7.8/32
10.20.30.0/24
在Jinja2模板文件中,我正在运行for循环:

{% for line in myfile_list %}
permit ip {{ line }} any
{% endfor %}
所需输出为:

permit ip 1.2.3.4/32 any
permit ip 5.6.7.8/32 any
permit ip 10.20.30.0/24 any
相反,我得到的是:

permit ip 1.2.3.4/32
5.6.7.8/32
10.20.30.0/24 any

我尝试了查找插件。设置“wantlist=True”。使用列表筛选器跟踪查找调用。我要么每行获得一个字符,要么如上所示获得一个文本块。如果对源文件运行Linux shell命令“file”,它将被视为“ASCII文本”。

查找将以单个字符串的形式返回文件的完整内容

如果要在直线上循环,则需要拆分结果,如以下示例所示:

---
- hosts: localhost
  gather_facts: false

  vars:
    file_content: |-
      first line
      second line
      third line

  tasks:
    - debug:
        msg: "{{ file_content.split('\n') }}"
其中:

TASK [debug] ***************************************************
ok: [localhost] => {
    "msg": [
        "first line",
        "second line",
        "third line"
    ]
}
Q:“逐行读取文件”

答:可以只读取整个文件并拆分行

myfile_list: "{{ lookup('file', myfile).splitlines() }}"

谢谢,很好用。我在这里读过另一篇文章,其中指出默认情况下,对文件的查找会逐行解析,我一直认为必须有一种更“内置”的方式来完成,而不是调用Python方法。