user2150250
user2150250

Reputation: 5167

Using Host Group as Variable in Ansible Task

I'm working on putting together a playbook that will deploy local facts scripts to various groups in my Ansible inventory, and I would to be able to utilize the group name being worked on as a variable in the tasks themselves. Assume for this example that I have the traditional Ansible roles directory structure on my Ansible machine, and I have subdirectories under the "files" directory called "apache", "web", and "db". I'll now illustrate by example, ...

---
- hosts: apache:web:db

  tasks:
  - name: Set facts for facts directories
    set_fact:
      facts_dir_local: "files/{{ group_name }}"
      facts_dir_remote: "/etc/ansible/facts.d"

   - name: Deploy local facts
     copy:
       src: "{{ item }}"
       dest: "{{ facts_dir_remote }}"
       owner: ansible
       group: ansible
       mode: 0750
     with_fileglob:
      - "{{ facts_dir_local }}/*.fact"

The goal is to have {{ group_name }} above take on the value of "apache" for the hosts in the apache group, "web" for the hosts in the web group, and "db" for the hosts in the db group. This way I don't have to copy and paste this task and assign custom variables for each group. Any suggestions for how to accomplish this would be greatly appreciated.

Upvotes: 3

Views: 14953

Answers (2)

Mr. Developerdude
Mr. Developerdude

Reputation: 9668

While there is no group_name variable in ansible, there is a group_names (plural). That is because any host may be part of one or more groups.

It is described in the official documentation as

group_names List of groups the current host is part of

In the most common case each host would only be part of one group and so you could simply say group_names[0] to get what you want.

TLDR;

Use group_names[0].

Upvotes: 3

Matt P
Matt P

Reputation: 2625

You can use group variables to achieve this, either specified in the inventory file or in separate group_vars/<group> files - see https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html

Note though that these group variables are squashed into host variables when you run the playbook. Hosts that are listed in multiple groups will end up with variables based on a precedence order

Upvotes: 0

Related Questions