Шаблон Ansible Jinja - чтение файла построчно - PullRequest
1 голос
/ 17 октября 2019

Я пытаюсь разобрать текстовый файл построчно внутри цикла for. Я могу нормально анализировать данные JSON, но, казалось бы, более простая задача здесь не выполняется. Похоже, что Джинджа не проводит разграничение на основе перевода строки.

В моей книге воспроизведения YAML я объявил исходный файл и функцию поиска (запроса):

vars:
    myfile: /some/text/file.txt
    myfile_list: "{{ query('file', myfile) }}"

Исходный файл 'myfile'это просто список IP-адресов в формате CIDR:

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 «file» для моего исходного файла, это выглядит как «ASCII текст».

Ответы [ 2 ]

2 голосов
/ 17 октября 2019

Q: «Чтение файла построчно»

A: Можно прочитать только весь файл и разбить строки

myfile_list: "{{ lookup('file', myfile).splitlines() }}"
1 голос
/ 17 октября 2019

Поиск возвращает все содержимое файла в виде одной строки.

Если вы хотите выполнить цикл по строкам, вам нужно разделить результат, как показано в следующем примере:

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