【问题标题】:Ansible Jinja template - read file line by lineAnsible Jinja 模板 - 逐行读取文件
【发布时间】:2020-02-13 22:10:11
【问题描述】:

我正在尝试在 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 命令“文件”,它会被视为“ASCII 文本”。

【问题讨论】:

    标签: ansible jinja2


    【解决方案1】:

    查找将文件的全部内容作为单个字符串返回。

    如果要循环遍历行,则需要拆分结果,如下例所示:

    ---
    - 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"
        ]
    }
    

    【讨论】:

      【解决方案2】:

      问:“逐行读取文件”

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

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

      【讨论】:

      • 谢谢,效果很好。我在这里阅读了另一篇文章,该文章表明默认情况下对文件的查找将逐行解析,并且认为必须有一种更“内置”的方式来完成它,而不是调用 Python 方法。跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 2018-07-02
      • 1970-01-01
      相关资源
      最近更新 更多