В роли Ansible я ищу способ скопировать удаленный файл в другое место, а также заменить первые две строки файла.
Я открыт для других подходов, но мое решение включает использование slurp для извлечения файла, его преобразования в список отдельных строк и последующей записи его обратно с помощью шаблона.
Я застрял на этапе разделения строки, возвращаемой slurp, на строки.
Ansible 2.9, и контроллер, и удаленные хосты работают под управлением RHEL 7.8.
Входной файл уже находится на удаленном хосте как /etc/sample/inputfile.txt
Line1 something
Line2 something
Line3 stays untouched
Line4 stays untouched
Желаемый вывод в /etc/sample/outputfile.txt
Line1 has changed
Line2 has also changed
Line3 stays untouched
Line4 stays untouched
Эффект, который я хочу воспроизвести, - это то, что произвела бы следующая последовательность, но идемпотентно без внесения трех изменений в outputfile.txt при каждом запуске.
- copy:
src: /etc/sample/inputfile.txt
dest: /etc/sample/outputfile.txt
remote_src: True
- lineinfile:
path: /etc/sample/outputfile.txt
regexp: '^Line1'
line: 'Line1 has changed'
- lineinfile:
path: /etc/sample/outputfile.txt
regexp: '^Line2'
line: 'Line2 has also changed'
Чтобы сделать этот идемпотентным, моя текущая идея состоит в том, чтобы использовать slurp для извлечения inputfile.txt, затем (каким-то образом) удалить первые две строки этой переменной и создать outputfile.txt с использованием шаблона.
- slurp:
src: /etc/sample/inputfile.txt
register: r_input
- set_fact:
intermediate_var: '{{ r_input.content | b64decode }}'
- ??? How would I convert intermediate_var into a list of lines?
- template:
vars:
line1: 'Line1 has changed'
line2: 'Line2 has also changed'
body: '??? intermediate_var without the first two lines'
Однако я не нашел способа удалить первые две строки из переменной slurped. Я знаю о «строках» плагина поиска, но не понял, как применить его в этом сценарии.
Ответ оказался проще, чем я думал.
- name: Retrieve service.txt file
become: True
shell: "cat /etc/sample/inputfile.txt"
register: r_inputfile
changed_when: False
Это даст мне файл, красиво разделенный на строки в переменной r_inputfile.stdout_lines.
Я все еще ищу улучшения, потому что стараюсь по возможности избегать использования модуля оболочки.