-1

In the below playbook, I need to print the output of all the stdout_lines executed from the text file.
I need to validate for some string existence in the stdout_lines.

---
- hosts: '{{ host }}'
  gather_facts: true
  become: true
  vars:
    command_txt: '{{ txt_file }}'
  tasks:
  - name: apply patch on remote nodes
    ansible.builtin.shell: some_command
    register: output
    with_lines: cat {{ command_txt }}
    ignore_errors: yes   

  - debug:
        msg: "The patch apply status is::: {{ output }}" 
β.εηοιτ.βε
  • 33,893
  • 13
  • 69
  • 83
  • 1
    See [registering variables with a loop](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_loops.html#registering-variables-with-a-loop) – Zeitounator Dec 06 '22 at 06:32

1 Answers1

3

For example, given the tree for testing

shell> tree /tmp/test
/tmp/test
├── commands.txt
├── file1.txt
├── patch1.txt
├── patch2.txt
└── patch3.txt

0 directories, 5 files
shell> cat /tmp/test/commands.txt 
patch file1.txt < patch1.txt
patch file1.txt < patch2.txt
patch file1.txt < patch3.txt
shell> cat /tmp/test/file1.txt 
shell> cat /tmp/test/patch1.txt 
--- file1.txt.orig  2022-12-06 06:54:57.349543101 +0100
+++ file1.txt   2022-12-06 06:52:13.493314972 +0100
@@ -0,0 +1 @@
+line 1
shell> cat /tmp/test/patch2.txt 
--- file1.txt.orig  2022-12-06 06:58:33.773844471 +0100
+++ file1.txt   2022-12-06 06:58:47.569863681 +0100
@@ -1 +1,2 @@
 line 1
+line 2
shell> cat /tmp/test/patch3.txt 
--- file1.txt.orig  2022-12-06 06:59:36.633932008 +0100
+++ file1.txt   2022-12-06 06:59:48.049947906 +0100
@@ -1,2 +1,3 @@
 line 1
 line 2
+line 3

Declare the variables

  my_path: /tmp/test
  txt_file: /tmp/test/commands.txt

and iterate the commands

    - shell:
        cmd: "{{ item }}"
        chdir: "{{ my_path }}"
      with_lines: "cat {{ txt_file }}"
      register: output

The patches will be applied

shell> cat /tmp/test/file1.txt 
line 1
line 2
line 3

and the output will be registered

  output:
    changed: true
    msg: All items completed
    results:
    - ansible_facts:
        discovered_interpreter_python: /usr/bin/python3
      ansible_loop_var: item
      changed: true
      cmd: patch file1.txt < patch1.txt
      delta: '0:00:00.003814'
      end: '2022-12-06 07:25:24.057143'
      failed: false
      invocation:
        module_args:
          _raw_params: patch file1.txt < patch1.txt
          _uses_shell: true
          argv: null
          chdir: /tmp/test
          creates: null
          executable: null
          removes: null
          stdin: null
          stdin_add_newline: true
          strip_empty_ends: true
          warn: false
      item: patch file1.txt < patch1.txt
      msg: ''
      rc: 0
      start: '2022-12-06 07:25:24.053329'
      stderr: ''
      stderr_lines: []
      stdout: patching file file1.txt
      stdout_lines:
      - patching file file1.txt
    - ansible_loop_var: item
      changed: true
      cmd: patch file1.txt < patch2.txt
      delta: '0:00:00.004013'
      end: '2022-12-06 07:25:24.317642'
      failed: false
      invocation:
        module_args:
          _raw_params: patch file1.txt < patch2.txt
          _uses_shell: true
          argv: null
          chdir: /tmp/test
          creates: null
          executable: null
          removes: null
          stdin: null
          stdin_add_newline: true
          strip_empty_ends: true
          warn: false
      item: patch file1.txt < patch2.txt
      msg: ''
      rc: 0
      start: '2022-12-06 07:25:24.313629'
      stderr: ''
      stderr_lines: []
      stdout: patching file file1.txt
      stdout_lines:
      - patching file file1.txt
    - ansible_loop_var: item
      changed: true
      cmd: patch file1.txt < patch3.txt
      delta: '0:00:00.003602'
      end: '2022-12-06 07:25:24.582663'
      failed: false
      invocation:
        module_args:
          _raw_params: patch file1.txt < patch3.txt
          _uses_shell: true
          argv: null
          chdir: /tmp/test
          creates: null
          executable: null
          removes: null
          stdin: null
          stdin_add_newline: true
          strip_empty_ends: true
          warn: false
      item: patch file1.txt < patch3.txt
      msg: ''
      rc: 0
      start: '2022-12-06 07:25:24.579061'
      stderr: ''
      stderr_lines: []
      stdout: patching file file1.txt
      stdout_lines:
      - patching file file1.txt
    skipped: false

You can see that the list results keeps the iteration's items. Print any information you like. For example,

    - debug:
        msg: "{{ item.item }} rc: {{ item.rc }}"
      loop: "{{ output.results }}"
      loop_control:
        label: "{{ item.item }}"

gives

TASK [debug] *********************************************************************************
ok: [localhost] => (item=patch file1.txt < patch1.txt) => 
  msg: 'patch file1.txt < patch1.txt rc: 0'
ok: [localhost] => (item=patch file1.txt < patch2.txt) => 
  msg: 'patch file1.txt < patch2.txt rc: 0'
ok: [localhost] => (item=patch file1.txt < patch3.txt) => 
  msg: 'patch file1.txt < patch3.txt rc: 0'

You can put the information into a single block. For example,

    - debug:
        msg: |
          {% for item in output.results %}
          {{ item.item }} rc: {{ item.rc }}
          {% endfor %}

gives

TASK [debug] *********************************************************************************
ok: [localhost] => 
  msg: |-
    patch file1.txt < patch1.txt rc: 0
    patch file1.txt < patch2.txt rc: 0
    patch file1.txt < patch3.txt rc: 0
Vladimir Botka
  • 58,131
  • 4
  • 32
  • 63