Ansible tip: Variables from inventory file

Categories
Ansible logo

While growing my Kubernetes cluster and working on some Ansible scripts for my infrastructure I recently realized that I’ve been under-utilizing one of the staples of ansible code, tying node-specific information to nodes in the inventory file! It was harder than I thought to use so this a quick writeup on how to do it:

Given an inventory file like this:

all:
  children:
    some_machine_group_name:
      hosts:
        some.machine.you.have: # possibly 'xxx.xxx.xxx.xxx'
          os_partition_size_gb: 128
          drive_paths:
            - /dev/nvme0n1
            - /dev/nvme1n1

    another_machine_group_name:
      hosts:
        the.second.machine.you.have: # possibly 'xxx.xxx.xxx.xxx'
          os_partition_size_gb: 128
          drive_paths:
            - /dev/sda
            - /dev/sdb

Q: Why not just write your provisioning scripts flexibly enough so that they can deal with all the disparate drive paths you expect?

A: This is a very good point.

You can use the path in a template like this:

# Set up drives as provided by inventory YAML
{% for path in hostvars[inventory_hostname]['drive_paths'] %}
DRIVE{{loop.index}} {{ path }}
{% endfor %}

From a regular ansible task you can use it like so:

    - name: Drive preparation
      tags: [ "drive-partition-prep" ]
      include_tasks: process_drive.yaml
      loop: "{{ hostvars[inventory_hostname]['drive_paths'] }}"

Obviously I’m not as good at ansible as I thought because it took way more than the required amount of searching and reading docs to figure it out, so hopefully this finds someone before they search too much.