Skip to main content

Raymii.org Raymii.org Logo

Quis custodiet ipsos custodes?
Home | About | All pages | Cluster Status | RSS Feed

Ansible - Only if host is also in other hostgroup

Published: 25-11-2014 | Author: Remy van Elst | Text only version of this article


❗ This post is over nine years old. It may no longer be up to date. Opinions may have changed.

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.

Recently I removed all Google Ads from this site due to their invasive tracking, as well as Google Analytics. Please, if you found this content useful, consider a small donation using any of the options below:

I'm developing an open source monitoring app called Leaf Node Monitoring, for windows, linux & android. Go check it out!

Consider sponsoring me on Github. It means the world to me if you show your appreciation and you'll help pay the server costs.

You can also sponsor me by getting a Digital Ocean VPS. With this referral link you'll get $200 credit for 60 days. Spend $25 after your credit expires and I'll get $25!

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 }}"    

In newer versions of Ansible you would replace the symlink command with the file module, that creates a symlink as well.

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 , tutorials , visudo