#split #ansible #jinja2 #ansible-facts
Вопрос:
У меня есть локальный txt-файл под названием file-names.txt который содержит список имен файлов
file1.txt
file2.txt
file3.txt
В моем сборнике ansible-play я регистрирую содержимое файла file-name.txt используя модуль slurp.
И установить названный факт files_names
.
tasks:
- name: Getting the file
ansible.builtin.slurp:
src: file-name.txt
register: file_names
- name: Saving the file names
set_fact:
file_name_list: "{{ (file_name['content] | b64decode | trim ).split('rn') }}"
Я хочу file_name_list
, чтобы факт был списком, содержащим только имена файлов. но какая-то функция разделения не может удалить 'r'
из имен файлов, и я получаю следующие результаты
ok: [localhost] => {
"ansible_facts":{
"file_name_list": [
"file1.txtr",
"file2.txtr",
"file3.txt"
]
},
"changed": false
}
Как я могу удалить возврат каретки 'r'
из каждого элемента массива, чтобы это file_name_list
выглядело так
ok: [localhost] => {
"ansible_facts":{
"file_name_list": [
"file1.txt",
"file2.txt",
"file3.txt"
]
},
"changed": false
}
PS: file-name.txt было сделано на машине с Windows, поэтому в каждую строку включен возврат каретки.
Ответ №1:
Таким trim
образом, фильтр, похоже, удаляет финал r
из списка файлов file3.txt
. Поэтому вместо использования trim
перед разделением мы можем обрезать каждое item
из них после разделения имен r
файлов .
Что-то вроде приведенного ниже должно сработать:
- name: saving the file names
set_fact:
filename_list: "{{ filename_list|default([]) [ item|trim ] }}"
with_items: "{{ (filenames.content|b64decode).split('r') }}"
- name: show the filenames
debug:
var: filename_list
Это должно привести к:
ok: [localhost] => {
"filename_list": [
"file1.txt",
"file2.txt",
"file3.txt"
]
}