Ansible - Only if host is also in other hostgroup

25-11-2014 | Remy van Elst


Table of Contents


This trick helps you execute actions only when a host is in another hostgroup in Ansible. For example, you might deploy munin-node via ansible, but you only want your apache and NGINX plugins deployed on your webservers, not on your database servers. I found this hard to find in the Ansible documentation, only in the mailing list was more information.

This example playbook is rolled out to all the hosts (hosts: all), because all the hosts are monitored via Munin. In my ansible-hosts file I also have two groups, webservers and databaseservers. I only want my http-status plugin on the webservers, and the postgres-status plugin only on the datase servers. This is how you do that.

Sample from the playbook:

      - name: Deploy munin http status code plugin
        copy: src=files/http-status dest=/usr/share/munin/plugins/http-status.sh owner=root group=root mode=0755

      - name: Deploy postgres status plugin
        copy: src=files/postgres-status dest=/usr/share/munin/plugins/posgres-status.py owner=root group=root mode=0755

      - name: Link munin apache plugin
        command: ln -sf /usr/share/munin/plugins/http-status /etc/munin/plugins/http-status
        when: "'webservers' in {{ group_names }}" 

      - name: Link munin postgres plugin
        command: ln -sf /usr/share/munin/plugins/postgres-status.py /etc/munin/plugins/postgres-status
        when: "'databaseservers' in {{ group_names }}"    

By using the when: "'GROUP_NAME' in {{ group_names }}" statement in an action you get more control over the nodes specific actions are run on.


Tags: ansible, configuration-management, deployment, devops, munin, python, sudo, sudoers, visudo,