shell module with multiple arguments using variables

Hi,

I am trying to call variables to the shell module but failing …

`

  • name: status of services
    hosts: myhost
    remote_user: root
    gather_facts: no
    vars:
  • pp_stat: “/etc/init.d/puppet status”
  • pr_date: “echo ‘========= as on date of ===========’; date”

strategy: free
tasks:

  • name: List the status of the puppet services
    ignore_errors: yes
    shell: “{{ item }}”
    with_items:
  • pp_stat
  • pr_date
    register: pupstat
  • debug:
    var: pupstat.stdout_lines
    `

error reads:

`
TASK [List the status of the puppet services] **************************************************************************************
failed: [wf-omsal1-01-01] (item=pp_stat) => {“changed”: true, “cmd”: “pp_stat”, “delta”: “0:00:00.004792”, “end”: “2019-08-02 01:02:19.344642”, “item”: “pp_stat”, “msg”: “non-zero return code”, “rc”: 127, “start”: “2019-08-02 01:02:19.339850”, “stderr”: “/bin/sh: pp_stat: command not found”, “stderr_lines”: [“/bin/sh: pp_stat: command not found”], “stdout”: “”, “stdout_lines”: }
failed: [wf-omsal1-01-01] (item=pr_date) => {“changed”: true, “cmd”: “pr_date”, “delta”: “0:00:00.004765”, “end”: “2019-08-02 01:02:24.356002”, “item”: “pr_date”, “msg”: “non-zero return code”, “rc”: 127, “start”: “2019-08-02 01:02:24.351237”, “stderr”: “/bin/sh: pr_date: command not found”, “stderr_lines”: [“/bin/sh: pr_date: command not found”], “stdout”: “”, “stdout_lines”: }
…ignoring

TASK [debug] *************************************************************************************************************************
ok: [wf-omsal1-01-01] => {
“pupstat.stdout_lines”: “VARIABLE IS NOT DEFINED!”
}
`

what I am missing in calling the variables?
using {{ }} to items also failed…

When registering a variable with a loop the structure of the data is different.

Try doing a debug on just pupstat to see the data structure. See this documentation for more information: https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#registering-variables-with-a-loop

Variables in with_items need {{ }} around them.

When running pup_stat alone, it works.

Adding {{ }} around items did not help

Hi Martz,

I tried with a couple of options as per the link you have shared including the "shell: echo “{{ item }}” . but still I am unable to combine the right combination.

my current snippet:

`
tasks:

  • name: List the status of the puppet services
    ignore_errors: yes
    shell: “{{ item }}”
    register: pupstat
    with_items:
  • “{{ pp_stat }}”
  • “{{ pr_date }}”
  • debug:
    var: pupstat
    `

and the output of debug is fine.

`
TASK [debug] *****************************************************************************************************************
ok: [myhost] => {
“pupstat”: {
“changed”: true,
“msg”: “All items completed”,
“results”: [
{
“_ansible_ignore_errors”: true,
“_ansible_item_label”: “/etc/init.d/puppet status”,
“_ansible_item_result”: true,
“_ansible_no_log”: false,
“_ansible_parsed”: true,
“changed”: true,
“cmd”: “/etc/init.d/puppet status”,
“delta”: “0:00:00.030987”,
“end”: “2019-08-02 14:35:42.933291”,
“failed”: false,
“invocation”: {
“module_args”: {
“_raw_params”: “/etc/init.d/puppet status”,
“_uses_shell”: true,
“argv”: null,
“chdir”: null,
“creates”: null,
“executable”: null,
“removes”: null,
“stdin”: null,
“warn”: true
}
},
“item”: “/etc/init.d/puppet status”,
“rc”: 0,
“start”: “2019-08-02 14:35:42.902304”,
“stderr”: “”,
“stderr_lines”: ,
“stdout”: “puppetd (pid 5881) is running…”,
“stdout_lines”: [
“puppetd (pid 5881) is running…”
]
},
{
“_ansible_ignore_errors”: true,
“_ansible_item_label”: “echo ‘========= as on date of ===========’; date”,
“_ansible_item_result”: true,
“_ansible_no_log”: false,
“_ansible_parsed”: true,
“changed”: true,
“cmd”: “echo ‘========= as on date of ===========’; date”,
“delta”: “0:00:00.006032”,
“end”: “2019-08-02 14:35:47.994833”,
“failed”: false,
“invocation”: {
“module_args”: {
“_raw_params”: “echo ‘========= as on date of ===========’; date”,
“_uses_shell”: true,
“argv”: null,
“chdir”: null,
“creates”: null,
“executable”: null,
“removes”: null,
“stdin”: null,
“warn”: true
}
},
“item”: “echo ‘========= as on date of ===========’; date”,
“rc”: 0,
“start”: “2019-08-02 14:35:47.988801”,
“stderr”: “”,
“stderr_lines”: ,
“stdout”: “========= as on date of ===========\nFri Aug 2 14:35:47 +04 2019”,
“stdout_lines”: [
“========= as on date of ===========”,
“Fri Aug 2 14:35:47 +04 2019”
]
}
]
}
}

`

But debug with “stdout.lines” is giving an error

`
TASK [debug] *****************************************************************************************************************
ok: [myhost] => {
“pupstat.stdout_lines”: “VARIABLE IS NOT DEFINED!: ‘dict object’ has no attribute ‘stdout_lines’”
}

`

Now … I am able to print the output of items using debug module with items…
… but “stdout_lines” is not working …

Finally , I got the right combination … Thaks for all …

`
name: List the status of the puppet services
ignore_errors: yes
shell: “{{ item }}”
with_items:

  • pp_stat
  • pr_date
    register: pupstat
  • debug:
    msg: “{{ pupstat.results|map(attribute=‘stdout_lines’)|list }}”

`