Назад | Перейти на главную страницу

Ansible - копирование и редактирование удаленного файла одновременно?

В роли 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.

Я все еще ищу улучшения, потому что стараюсь по возможности избегать использования модуля оболочки.