In an Ansible role, I'm looking for a way to copy a remote file to a different location, while also replacing the first two lines of the file.
I'm open to other approaches, but my solution involves using slurp to retrieve the file, somehow convert it into a list of individual lines, and then write it back using a template.
I'm stuck at the step of splitting the string returned by slurp into lines.
Ansible 2.9, both the controller and the remote hosts are running RHEL 7.8.
The input file is already on the remote host as /etc/sample/inputfile.txt
Line1 something
Line2 something
Line3 stays untouched
Line4 stays untouched
Desired output in /etc/sample/outputfile.txt
Line1 has changed
Line2 has also changed
Line3 stays untouched
Line4 stays untouched
The effect I want to replicate is what the following sequence would produce, but idempotently without making three changes to outputfile.txt on every run.
- 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'
To make this idempotent, my current idea is to use slurp to retrieve inputfile.txt, then (somehow) strip the first two lines of that variable, and create outputfile.txt using a template.
- 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'
However, I haven't figured out a way to strip the first two lines off the slurped variable. I'm aware of the lookup plugin "lines" but have not figured out how to apply it in this scenario.
The answer turned out to be easier than I thought.
This will give me the file nicely split in lines in the r_inputfile.stdout_lines variable.
I'm still looking for an improvement because I try to avoid the shell module when possible.