Ashar
Ashar

Reputation: 3065

Getting Ansible runtime error dict object' has no attribute 'stdout_lines' despite variable not null

Below is my playbook which has a variable running_processes which contains a list of pids(one or more)

Next, I read the user ids for each of the pids. All good so far.

I then try to print the list of user ids in curr_user_ids variable using -debug module is when i get the error: 'dict object' has no attribute 'stdout_lines'

I was expecting the curr_user_ids to contain one or more entries as evident from the output shared below.

    - name: Get running processes list from remote host
      shell: "ps -few | grep java | grep -v grep | awk '{print $2}'"
      changed_when: false
      register: running_processes

    - name: Gather USER IDs from processes id before killing.
      shell: "id -nu `cat /proc/{{ running_processes.stdout }}/loginuid`"
      register: curr_user_ids
      with_items: "{{ running_processes.stdout_lines }}"

    - debug: msg="USER ID LIST HERE:{{ curr_user_ids.stdout }}"
      with_items: "{{ curr_user_ids.stdout_lines }}"

TASK [Get running processes list from remote host] **********************************************************************************************************
task path: /app/wls/startstop.yml:22
ok: [10.9.9.111] => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "cmd": "ps -few | grep java | grep -v grep  | awk '{print $2}'", "delta": "0:00:00.166049", "end": "2019-11-06 11:49:42.298603", "rc": 0, "start": "2019-11-06 11:49:42.132554", "stderr": "", "stderr_lines": [], "stdout": "24032", "stdout_lines": ["24032"]}

TASK [Gather USER IDS of processes id before killing.] ******************************************************************************************************
task path: /app/wls/startstop.yml:59
changed: [10.9.9.111] => (item=24032) => {"ansible_loop_var": "item", "changed": true, "cmd": "id -nu `cat /proc/24032/loginuid`", "delta": "0:00:00.116639", "end": "2019-11-06 11:46:41.205843", "item": "24032", "rc": 0, "start": "2019-11-06 11:46:41.089204", "stderr": "", "stderr_lines": [], "stdout": "user1", "stdout_lines": ["user1"]}

TASK [debug] ************************************************************************************************************************************************
task path: /app/wls/startstop.yml:68
fatal: [10.9.9.111]: FAILED! => {"msg": "'dict object' has no attribute 'stdout_lines'"}

Can you please suggest why am I getting the error and how can I resolve it ?

Upvotes: 1

Views: 10049

Answers (2)

flazzarini
flazzarini

Reputation: 8191

Few points to note why your solution didn't work.

The task Get running processes list from remote host returns a newline splitted \n string. So you will need to process this and turn the output into a propper list object first.

The task Gather USER IDs from processes id before killing. is returning a dictionary containing the key results where the value is of type list, so you will need iterate over it and fetch for each element the stdout value.

This is how I solved it.

---

- hosts: "localhost"
  gather_facts: true
  become: true
  tasks:
      - name: Set default values
        set_fact:
          process_ids: []
          user_names: []

      - name: Get running processes list from remote host
        shell: "ps -few | grep java | grep -v grep | awk '{print $2}'"
        changed_when: false
        register: running_processes

      - name: Register a list of Process ids (Split newline from output before)
        set_fact:
          process_ids: "{{ running_processes.stdout.split('\n') }}"

      - name: Gather USER IDs from processes id before killing.
        shell: "id -nu `cat /proc/{{ item }}/loginuid`"
        register: curr_user_ids
        with_items: "{{ process_ids }}"

      - name: Register a list of User names (Out of result from before)
        set_fact:
          user_names: "{{ user_names + [item.stdout] | unique }}"
        when: item.rc == 0
        with_items:
          - "{{ curr_user_ids.results }}"

      - name: Set unique entries in User names list
        set_fact:
          user_names: "{{ user_names | unique }}"

      - name: DEBUG
        debug:
          msg: "{{ user_names }}"

Upvotes: 1

Vladimir Botka
Vladimir Botka

Reputation: 68254

The variable curr_user_ids registers results of each iteration

register: curr_user_ids
with_items: "{{ running_processes.stdout_lines }}"

The list of the results is stored in

curr_user_ids.results

Take a look at the variable

- debug:
    var: curr_user_ids

and loop the stdout_lines

- debug:
    var: item.stdout_lines
  loop: "{{ curr_user_ids.results }}"

Upvotes: 0

Related Questions