Get info from a host, and use it in another host's template

27 views
Skip to first unread message

Brigzzy Briggs

unread,
Feb 17, 2018, 3:44:06 PM2/17/18
to Ansible Project

Hi all,

I'm learning Ansible, and I'm trying to use it to template a Nagios config file. My network is 98% Debian and Ubuntu, with a FreePBX server to mix things up. There en lies the issue I'm having. When I run this command to check facts:


ansible freepbx.domain.com -m

I can see that


"ansible_os_family": "Sangoma"

In my template, I have the following if statement:


{% if ansible_os_family == "Debian" or ansible_os_family == "Ubuntu" %}
define service
{
       
use                             local-service
        host_name                      
{{ hostvars[item].inventory_hostname }}
        service_description            
Apt Status
        check_command                   check_apt
       
}
{% endif %}


and the issue is that the block is still being generated for that server, even though it's not Debian or Ubuntu.


I posted this on Reddit as well, and I realized that the issue is that the template is being applied to my Nagios server, which is Debian, so the ansible_os_family is always coming back Debian.  What I'm having trouble with is how to get the if statement to get it's facts from the target server, and not the one the playbook is running on.  I'm able to get the hostname from the static hosts file like this


{{ hostvars[item].inventory_hostname }}

but I'm not having any luck figuring out how to get the template to apply to the values from that host.  Anyone have any ideas? 

Kai Stian Olstad

unread,
Feb 17, 2018, 4:22:12 PM2/17/18
to ansible...@googlegroups.com
On Saturday, 17 February 2018 21.44.06 CET Brigzzy Briggs wrote:
> I can see that
>
>
> "ansible_os_family": "Sangoma"
>
> In my template, I have the following if statement:
>
>
> {% if ansible_os_family == "Debian" or ansible_os_family == "Ubuntu" %}
> define service{
> use local-service
> host_name {{ hostvars[item].inventory_hostname
> }}
> service_description Apt Status
> check_command check_apt
> }
> {% endif %}
>
> and the issue is that the block is still being generated for that server,
> even though it's not Debian or Ubuntu.
>
>
> I posted this on Reddit as well
> <https://www.reddit.com/r/ansible/comments/7y5uje/troubles_with_an_if_statement_in_a_jinja2_template/?st=jdrthmo2&sh=38998e5f>,
> and I realized that the issue is that the template is being applied to my
> Nagios server, which is Debian, so the ansible_os_family is always coming
> back Debian. What I'm having trouble with is how to get the if statement
> to get it's facts from the target server, and not the one the playbook is
> running on. I'm able to get the hostname from the static hosts file like
> this
>
>
> {{ hostvars[item].inventory_hostname }}
>
> but I'm not having any luck figuring out how to get the template to apply
> to the values from that host. Anyone have any ideas?

Without the more of the code on where and how you are generating the template it's difficult to say, but I believe you are looking for this

{% if hostvars[item].ansible_os_family == "Debian" or hostvars[item].ansible_os_family == "Ubuntu" %}

or the more cleaner version

{% if hostvars[item].ansible_os_family in ['Debian', 'Ubuntu'] %}

--
Kai Stian Olstad
Message has been deleted

Kai Stian Olstad

unread,
Feb 20, 2018, 1:46:32 AM2/20/18
to ansible...@googlegroups.com
On 17.02.2018 23:20, Brigzzy Briggs wrote:
> I tried that, but it didn't work. Thanks for the reply all the same!
>
> Here's the section of the playbook. Let me know if you can see the
> issue,
> or if I can post anything else that would help.
>
> - hosts: nagios-server
> become: yes
> tasks:
> ....
> - name: Generate Configs
> template:
> src=skins/larry/root/ansible/ansible-files/nagios/nagios-monitored-server.cfg.j2
> dest=/usr/local/nagios/etc/servers/{{ item }}.cfg owner=root mode=0644
> with_items: "{{groups['nagios-monitored']}}"
> .....
>
> This is the error the playbook spits out. It throws it for all the
> servers, not just the FreePBX one.
>
> failed: [nagios.domain.com] (item=freepbx.domain.com) => {"failed":
> true, "item": "freepbx.domain.com", "msg": "AnsibleUndefinedVariable:
> 'dict object' has no attribute 'ansible_os_family'"}

You don't have access to the facts the hosts in group nagios-monitored,
that's the reason it fails.

So you need to enable fact caching
http://docs.ansible.com/ansible/latest/playbooks_variables.html#fact-caching

or gather the facts before you run the nagios-server play.
Facts gathered in one play is available in subsequent plays as long as
they are in the same playbook.

---
- hosts: nagios-monitored
gather_facts: yes

- hosts: nagios-server
become: yes
tasks:
....
- name: Generate Configs


--
Kai Stian Olstad

Brigzzy Briggs

unread,
Feb 20, 2018, 12:16:27 PM2/20/18
to Ansible Project
That did it!  Thanks Kai!


So it seems that gathering facts is what populates those variables.  This all makes sense now.  Thanks so much for your guidance! 

Cheers,

Danny 
Reply all
Reply to author
Forward
0 new messages