Ansible set_fact with with_items always prints last item

52 views
Skip to first unread message

kumare...@gmail.com

unread,
Sep 19, 2020, 6:29:51 AM9/19/20
to Ansible Project
Hi Experts,

I am looking to capture certain service status using ansible the problem is debug prints only last item.Below is the expected output.

Hostname : test

httpd --> Running
ntpd  --> Running

Below are the playbook.

---
- hosts: test
  become: true
  gather_facts: false
  tasks:
    - name: Service facts
      service_facts:

    - set_fact:
       elk_app1: "{{ ansible_facts.services[item + '.service'].name}} Running"
      when: ansible_facts.services[item + '.service'].state == 'running'
      with_items:
        - httpd
        - ntpd
      register: foo_result

    - debug: msg="{{ foo_result }}"


Regards
Kumar

Stefan Hornburg (Racke)

unread,
Sep 19, 2020, 9:58:58 AM9/19/20
to ansible...@googlegroups.com
Hello Kumar,

if you use set_fact with a loop, you need to reference the variable on the right hand side:

set_fact:
elk_app1: "{{ elk_app1 | default('') + ansible_facts.services[item + '.service'].name + ' Running\n' }}"

The default filter is necessary as the variable is undefined on the first iteration of the loop.

Regards
Racke

>
> --
> You received this message because you are subscribed to the Google Groups "Ansible Project" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to
> ansible-proje...@googlegroups.com <mailto:ansible-proje...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/ansible-project/cbd4fd36-e141-48a1-b306-0a9629ec8e31n%40googlegroups.com
> <https://groups.google.com/d/msgid/ansible-project/cbd4fd36-e141-48a1-b306-0a9629ec8e31n%40googlegroups.com?utm_medium=email&utm_source=footer>.


--
Ecommerce and Linux consulting + Perl and web application programming.
Debian and Sympa administration. Provisioning with Ansible.

signature.asc

kumare...@gmail.com

unread,
Sep 21, 2020, 1:12:28 AM9/21/20
to Ansible Project
Hi Brae,

Thanks for the help was able to get the desired output.But the output are in same line is there way to print new line for each service?

TASK [debug] ***********************************************************************************************************************************************************
ok: [test] => {
    "msg": "httpd.service Running\nntpd.service Running\n"
}

Expected output:

httpd.service Running 
ntpd.service Running 

Regards
Kumar

Stefan Hornburg (Racke)

unread,
Sep 21, 2020, 2:30:25 AM9/21/20
to ansible...@googlegroups.com
On 9/21/20 7:12 AM, kumare...@gmail.com wrote:
> Hi Brae,
>
> Thanks for the help was able to get the desired output.But the output are in same line is there way to print new line
> for each service?
>
> TASK [debug]
> ***********************************************************************************************************************************************************
> ok: [test] => {
>     "msg": "httpd.service Running\nntpd.service Running\n"
> }
>
> Expected output:
>
> httpd.service Running 
> ntpd.service Running 
>
> Regards
> Kumar
>

Hello Kumar,

use the YAML callback plugin, e.g in ansible.cfg:

# Use the YAML callback plugin.
stdout_callback = yaml

This changes the output to look like as follows:

ok: [buster-test-box] =>
elk_app1: |-
sympa.service Running
wwsympa.service Running

Regards
Racke
> https://groups.google.com/d/msgid/ansible-project/48b4d375-f1bf-46fb-a4a5-84e8f89c88een%40googlegroups.com
> <https://groups.google.com/d/msgid/ansible-project/48b4d375-f1bf-46fb-a4a5-84e8f89c88een%40googlegroups.com?utm_medium=email&utm_source=footer>.
signature.asc
Reply all
Reply to author
Forward
0 new messages