I have a very long configuration file I am pulling from various pieces of equipment, and need it exactly as the command output gives me back. Ansible however, appears to be stripping the line breaks when I go to write the output to a file.
- name: Pull the running-config...
cisco.ios.ios_command:
commands: show running-config brief
register: running_output
...
...
- name: Copy running_config data to file...
ansible.builtin.copy:
content: "{{ running_output.stdout_lines }}"
dest: "/etc/ansible/backups/{{ inventory_hostname }}/running_config.txt"
When I debug the output, I do see the line breaks removed in stdout. But I also see a different output, (stdout_lines) as the configuration should be and not replaced with a ton of "\n"s.
Is there a way to ensure that line breaks exist in the output I send to file? Or ensure that the character that is replacing them is noted and formatted correctly?
Short answer: Use stdout instead of stdout_lines.
Details: Given the below file for testing
shell> cat /tmp/config.txt
line1
line2
line3
Read it and register the variable running_output
- command: cat /tmp/config.txt
register: running_output
gives
running_output:
ansible_facts:
discovered_interpreter_python: /usr/bin/python3
changed: true
cmd:
- cat
- /tmp/config.txt
delta: '0:00:00.007317'
end: '2023-11-02 02:15:50.172897'
failed: false
msg: ''
rc: 0
start: '2023-11-02 02:15:50.165580'
stderr: ''
stderr_lines: []
stdout: |-
line1
line2
line3
stdout_lines:
- line1
- line2
- line3
If you use the list running_output.stdout_lines
- copy:
dest: /tmp/running_config.txt
content: "{{ running_output.stdout_lines }}"
You'll get the list
shell> cat /tmp/running_config.txt
["line1", "line2", "line"]
Use running_output.stdout instead
- copy:
dest: /tmp/running_config.txt
content: "{{ running_output.stdout }}"
You'll get
shell> cat /tmp/running_config.txt
line1
line2
line3