From af3b719b73cb1805c10cf6d6343e7eded63dc186 Mon Sep 17 00:00:00 2001
From: Mark Goddard <mark@stackhpc.com>
Date: Fri, 12 Nov 2021 20:46:51 +0000
Subject: [PATCH] Move group_vars to an inventory directory

The group variables originally in ansible/group_vars/ were playbook
group variables, due to being adjacent to the playbooks. Typically they
provided default values for global variables in the all group, as well
as some more specific groups. This has worked fairly well, but results
in (at least) a couple of problems.

1. The default variable precedence rules mean that these playbook group
   variables have a higher precedence than inventory group variables
   (for a given group). This can make it challenging to override
   playbook group variables in the inventory in Kayobe configuration.

2. Any playbook run by Kayobe must be in the same directory as the
   playbook group variables in order to use them. Given that they
   include variables required for connectivity such as ansible_host and
   ansible_user, this is quite critical. For Kayobe custom playbooks, we
   work around this by symlinking to the group_vars directory from the
   directory containing the custom playbook. This is not an elegant
   workaround, and has assumptions about the relative paths of the
   Kayobe configuration and virtual environment in which Kayobe is
   installed.

Story: 2010280
Task: 46233

Change-Id: Ifea5c7e73f6f410f96a7398bfd349d1f631d9fc0
---
 ansible/{ => inventory}/group_vars/all/apt    |  0
 .../{ => inventory}/group_vars/all/bifrost    |  0
 ansible/{ => inventory}/group_vars/all/bmc    |  0
 .../{ => inventory}/group_vars/all/compute    |  0
 .../group_vars/all/controllers                |  0
 .../group_vars/all/dell-switch-bmp            |  0
 ansible/{ => inventory}/group_vars/all/dnf    |  0
 ansible/{ => inventory}/group_vars/all/dns    |  0
 ansible/{ => inventory}/group_vars/all/docker |  0
 .../group_vars/all/docker-registry            |  0
 .../{ => inventory}/group_vars/all/globals    |  0
 .../{ => inventory}/group_vars/all/grafana    |  0
 ansible/{ => inventory}/group_vars/all/idrac  |  0
 .../{ => inventory}/group_vars/all/infra-vms  |  0
 .../{ => inventory}/group_vars/all/inspector  |  0
 ansible/{ => inventory}/group_vars/all/ipa    |  0
 ansible/{ => inventory}/group_vars/all/ironic |  0
 ansible/{ => inventory}/group_vars/all/kolla  |  0
 .../{ => inventory}/group_vars/all/monasca    |  0
 .../{ => inventory}/group_vars/all/monitoring |  0
 .../{ => inventory}/group_vars/all/network    |  0
 .../{ => inventory}/group_vars/all/neutron    |  0
 ansible/{ => inventory}/group_vars/all/nova   |  0
 ansible/{ => inventory}/group_vars/all/opensm |  0
 .../{ => inventory}/group_vars/all/openstack  |  0
 .../{ => inventory}/group_vars/all/overcloud  |  0
 .../group_vars/all/overcloud-dib              |  0
 ansible/{ => inventory}/group_vars/all/pip    |  0
 ansible/{ => inventory}/group_vars/all/proxy  |  0
 ansible/{ => inventory}/group_vars/all/seed   |  0
 .../group_vars/all/seed-hypervisor            |  0
 .../{ => inventory}/group_vars/all/seed-vm    |  0
 ansible/{ => inventory}/group_vars/all/ssh    |  0
 .../{ => inventory}/group_vars/all/storage    |  0
 ansible/{ => inventory}/group_vars/all/swift  |  0
 .../group_vars/all/switches/arista            |  0
 .../group_vars/all/switches/config            |  0
 .../group_vars/all/switches/dell              |  0
 .../group_vars/all/switches/dell-powerconnect |  0
 .../group_vars/all/switches/junos             |  0
 .../group_vars/all/switches/mellanox          |  0
 ansible/{ => inventory}/group_vars/all/time   |  0
 ansible/{ => inventory}/group_vars/all/users  |  0
 .../group_vars/compute/ansible-user           |  0
 .../{ => inventory}/group_vars/compute/bios   |  0
 .../group_vars/compute/firewall               |  0
 .../{ => inventory}/group_vars/compute/luks   |  0
 .../{ => inventory}/group_vars/compute/lvm    |  0
 .../{ => inventory}/group_vars/compute/mdadm  |  0
 .../group_vars/compute/network                |  0
 .../{ => inventory}/group_vars/compute/raid   |  0
 .../{ => inventory}/group_vars/compute/sysctl |  0
 .../{ => inventory}/group_vars/compute/tuned  |  0
 .../{ => inventory}/group_vars/compute/users  |  0
 .../group_vars/controllers/ansible-user       |  0
 .../group_vars/controllers/bios               |  0
 .../group_vars/controllers/firewall           |  0
 .../group_vars/controllers/luks               |  0
 .../group_vars/controllers/lvm                |  0
 .../group_vars/controllers/mdadm              |  0
 .../group_vars/controllers/network            |  0
 .../group_vars/controllers/raid               |  0
 .../group_vars/controllers/sysctl             |  0
 .../group_vars/controllers/tuned              |  0
 .../group_vars/controllers/users              |  0
 .../group_vars/infra-vms/ansible-host         |  0
 .../group_vars/infra-vms/ansible-user         |  0
 .../group_vars/infra-vms/firewall             |  0
 .../{ => inventory}/group_vars/infra-vms/luks |  0
 .../{ => inventory}/group_vars/infra-vms/lvm  |  0
 .../group_vars/infra-vms/mdadm                |  0
 .../group_vars/infra-vms/network              |  0
 .../group_vars/infra-vms/sysctl               |  0
 .../group_vars/infra-vms/tuned                |  0
 .../group_vars/infra-vms/users                |  0
 .../group_vars/monitoring/ansible-user        |  0
 .../group_vars/monitoring/bios                |  0
 .../group_vars/monitoring/firewall            |  0
 .../group_vars/monitoring/luks                |  0
 .../{ => inventory}/group_vars/monitoring/lvm |  0
 .../group_vars/monitoring/mdadm               |  0
 .../group_vars/monitoring/network             |  0
 .../group_vars/monitoring/raid                |  0
 .../group_vars/monitoring/sysctl              |  0
 .../group_vars/monitoring/tuned               |  0
 .../group_vars/monitoring/users               |  0
 .../group_vars/overcloud/ansible-host         |  0
 .../group_vars/seed-hypervisor/ansible-host   |  0
 .../group_vars/seed-hypervisor/ansible-user   |  0
 .../group_vars/seed-hypervisor/firewall       |  0
 .../group_vars/seed-hypervisor/luks           |  0
 .../group_vars/seed-hypervisor/lvm            |  0
 .../group_vars/seed-hypervisor/mdadm          |  0
 .../group_vars/seed-hypervisor/network        |  0
 .../group_vars/seed-hypervisor/snat           |  0
 .../group_vars/seed-hypervisor/sysctl         |  0
 .../group_vars/seed-hypervisor/tuned          |  0
 .../group_vars/seed-hypervisor/users          |  0
 .../group_vars/seed/ansible-host              |  0
 .../group_vars/seed/ansible-user              |  0
 .../{ => inventory}/group_vars/seed/firewall  |  0
 ansible/{ => inventory}/group_vars/seed/luks  |  0
 ansible/{ => inventory}/group_vars/seed/lvm   |  0
 ansible/{ => inventory}/group_vars/seed/mdadm |  0
 .../{ => inventory}/group_vars/seed/network   |  0
 ansible/{ => inventory}/group_vars/seed/snat  |  0
 .../{ => inventory}/group_vars/seed/sysctl    |  0
 ansible/{ => inventory}/group_vars/seed/tuned |  0
 ansible/{ => inventory}/group_vars/seed/users |  0
 .../group_vars/storage/ansible-user           |  0
 .../{ => inventory}/group_vars/storage/bios   |  0
 .../group_vars/storage/firewall               |  0
 .../{ => inventory}/group_vars/storage/luks   |  0
 .../{ => inventory}/group_vars/storage/lvm    |  0
 .../{ => inventory}/group_vars/storage/mdadm  |  0
 .../group_vars/storage/network                |  0
 .../{ => inventory}/group_vars/storage/raid   |  0
 .../{ => inventory}/group_vars/storage/sysctl |  0
 .../{ => inventory}/group_vars/storage/tuned  |  0
 .../{ => inventory}/group_vars/storage/users  |  0
 .../configuration/reference/infra-vms.rst     |  2 +-
 doc/source/configuration/reference/kayobe.rst | 20 ++++++++++---------
 doc/source/configuration/reference/kolla.rst  |  2 +-
 doc/source/contributor/development.rst        |  2 +-
 .../control-plane-service-placement.rst       |  8 ++++----
 doc/source/custom-ansible-playbooks.rst       |  1 -
 kayobe/ansible.py                             |  7 ++++---
 kayobe/tests/unit/test_ansible.py             | 14 +++++++++++++
 ...inventory-group-vars-cef39cb6f3803ee7.yaml | 18 +++++++++++++++++
 tools/test-ansible.sh                         |  4 ++--
 130 files changed, 56 insertions(+), 22 deletions(-)
 rename ansible/{ => inventory}/group_vars/all/apt (100%)
 rename ansible/{ => inventory}/group_vars/all/bifrost (100%)
 rename ansible/{ => inventory}/group_vars/all/bmc (100%)
 rename ansible/{ => inventory}/group_vars/all/compute (100%)
 rename ansible/{ => inventory}/group_vars/all/controllers (100%)
 rename ansible/{ => inventory}/group_vars/all/dell-switch-bmp (100%)
 rename ansible/{ => inventory}/group_vars/all/dnf (100%)
 rename ansible/{ => inventory}/group_vars/all/dns (100%)
 rename ansible/{ => inventory}/group_vars/all/docker (100%)
 rename ansible/{ => inventory}/group_vars/all/docker-registry (100%)
 rename ansible/{ => inventory}/group_vars/all/globals (100%)
 rename ansible/{ => inventory}/group_vars/all/grafana (100%)
 rename ansible/{ => inventory}/group_vars/all/idrac (100%)
 rename ansible/{ => inventory}/group_vars/all/infra-vms (100%)
 rename ansible/{ => inventory}/group_vars/all/inspector (100%)
 rename ansible/{ => inventory}/group_vars/all/ipa (100%)
 rename ansible/{ => inventory}/group_vars/all/ironic (100%)
 rename ansible/{ => inventory}/group_vars/all/kolla (100%)
 rename ansible/{ => inventory}/group_vars/all/monasca (100%)
 rename ansible/{ => inventory}/group_vars/all/monitoring (100%)
 rename ansible/{ => inventory}/group_vars/all/network (100%)
 rename ansible/{ => inventory}/group_vars/all/neutron (100%)
 rename ansible/{ => inventory}/group_vars/all/nova (100%)
 rename ansible/{ => inventory}/group_vars/all/opensm (100%)
 rename ansible/{ => inventory}/group_vars/all/openstack (100%)
 rename ansible/{ => inventory}/group_vars/all/overcloud (100%)
 rename ansible/{ => inventory}/group_vars/all/overcloud-dib (100%)
 rename ansible/{ => inventory}/group_vars/all/pip (100%)
 rename ansible/{ => inventory}/group_vars/all/proxy (100%)
 rename ansible/{ => inventory}/group_vars/all/seed (100%)
 rename ansible/{ => inventory}/group_vars/all/seed-hypervisor (100%)
 rename ansible/{ => inventory}/group_vars/all/seed-vm (100%)
 rename ansible/{ => inventory}/group_vars/all/ssh (100%)
 rename ansible/{ => inventory}/group_vars/all/storage (100%)
 rename ansible/{ => inventory}/group_vars/all/swift (100%)
 rename ansible/{ => inventory}/group_vars/all/switches/arista (100%)
 rename ansible/{ => inventory}/group_vars/all/switches/config (100%)
 rename ansible/{ => inventory}/group_vars/all/switches/dell (100%)
 rename ansible/{ => inventory}/group_vars/all/switches/dell-powerconnect (100%)
 rename ansible/{ => inventory}/group_vars/all/switches/junos (100%)
 rename ansible/{ => inventory}/group_vars/all/switches/mellanox (100%)
 rename ansible/{ => inventory}/group_vars/all/time (100%)
 rename ansible/{ => inventory}/group_vars/all/users (100%)
 rename ansible/{ => inventory}/group_vars/compute/ansible-user (100%)
 rename ansible/{ => inventory}/group_vars/compute/bios (100%)
 rename ansible/{ => inventory}/group_vars/compute/firewall (100%)
 rename ansible/{ => inventory}/group_vars/compute/luks (100%)
 rename ansible/{ => inventory}/group_vars/compute/lvm (100%)
 rename ansible/{ => inventory}/group_vars/compute/mdadm (100%)
 rename ansible/{ => inventory}/group_vars/compute/network (100%)
 rename ansible/{ => inventory}/group_vars/compute/raid (100%)
 rename ansible/{ => inventory}/group_vars/compute/sysctl (100%)
 rename ansible/{ => inventory}/group_vars/compute/tuned (100%)
 rename ansible/{ => inventory}/group_vars/compute/users (100%)
 rename ansible/{ => inventory}/group_vars/controllers/ansible-user (100%)
 rename ansible/{ => inventory}/group_vars/controllers/bios (100%)
 rename ansible/{ => inventory}/group_vars/controllers/firewall (100%)
 rename ansible/{ => inventory}/group_vars/controllers/luks (100%)
 rename ansible/{ => inventory}/group_vars/controllers/lvm (100%)
 rename ansible/{ => inventory}/group_vars/controllers/mdadm (100%)
 rename ansible/{ => inventory}/group_vars/controllers/network (100%)
 rename ansible/{ => inventory}/group_vars/controllers/raid (100%)
 rename ansible/{ => inventory}/group_vars/controllers/sysctl (100%)
 rename ansible/{ => inventory}/group_vars/controllers/tuned (100%)
 rename ansible/{ => inventory}/group_vars/controllers/users (100%)
 rename ansible/{ => inventory}/group_vars/infra-vms/ansible-host (100%)
 rename ansible/{ => inventory}/group_vars/infra-vms/ansible-user (100%)
 rename ansible/{ => inventory}/group_vars/infra-vms/firewall (100%)
 rename ansible/{ => inventory}/group_vars/infra-vms/luks (100%)
 rename ansible/{ => inventory}/group_vars/infra-vms/lvm (100%)
 rename ansible/{ => inventory}/group_vars/infra-vms/mdadm (100%)
 rename ansible/{ => inventory}/group_vars/infra-vms/network (100%)
 rename ansible/{ => inventory}/group_vars/infra-vms/sysctl (100%)
 rename ansible/{ => inventory}/group_vars/infra-vms/tuned (100%)
 rename ansible/{ => inventory}/group_vars/infra-vms/users (100%)
 rename ansible/{ => inventory}/group_vars/monitoring/ansible-user (100%)
 rename ansible/{ => inventory}/group_vars/monitoring/bios (100%)
 rename ansible/{ => inventory}/group_vars/monitoring/firewall (100%)
 rename ansible/{ => inventory}/group_vars/monitoring/luks (100%)
 rename ansible/{ => inventory}/group_vars/monitoring/lvm (100%)
 rename ansible/{ => inventory}/group_vars/monitoring/mdadm (100%)
 rename ansible/{ => inventory}/group_vars/monitoring/network (100%)
 rename ansible/{ => inventory}/group_vars/monitoring/raid (100%)
 rename ansible/{ => inventory}/group_vars/monitoring/sysctl (100%)
 rename ansible/{ => inventory}/group_vars/monitoring/tuned (100%)
 rename ansible/{ => inventory}/group_vars/monitoring/users (100%)
 rename ansible/{ => inventory}/group_vars/overcloud/ansible-host (100%)
 rename ansible/{ => inventory}/group_vars/seed-hypervisor/ansible-host (100%)
 rename ansible/{ => inventory}/group_vars/seed-hypervisor/ansible-user (100%)
 rename ansible/{ => inventory}/group_vars/seed-hypervisor/firewall (100%)
 rename ansible/{ => inventory}/group_vars/seed-hypervisor/luks (100%)
 rename ansible/{ => inventory}/group_vars/seed-hypervisor/lvm (100%)
 rename ansible/{ => inventory}/group_vars/seed-hypervisor/mdadm (100%)
 rename ansible/{ => inventory}/group_vars/seed-hypervisor/network (100%)
 rename ansible/{ => inventory}/group_vars/seed-hypervisor/snat (100%)
 rename ansible/{ => inventory}/group_vars/seed-hypervisor/sysctl (100%)
 rename ansible/{ => inventory}/group_vars/seed-hypervisor/tuned (100%)
 rename ansible/{ => inventory}/group_vars/seed-hypervisor/users (100%)
 rename ansible/{ => inventory}/group_vars/seed/ansible-host (100%)
 rename ansible/{ => inventory}/group_vars/seed/ansible-user (100%)
 rename ansible/{ => inventory}/group_vars/seed/firewall (100%)
 rename ansible/{ => inventory}/group_vars/seed/luks (100%)
 rename ansible/{ => inventory}/group_vars/seed/lvm (100%)
 rename ansible/{ => inventory}/group_vars/seed/mdadm (100%)
 rename ansible/{ => inventory}/group_vars/seed/network (100%)
 rename ansible/{ => inventory}/group_vars/seed/snat (100%)
 rename ansible/{ => inventory}/group_vars/seed/sysctl (100%)
 rename ansible/{ => inventory}/group_vars/seed/tuned (100%)
 rename ansible/{ => inventory}/group_vars/seed/users (100%)
 rename ansible/{ => inventory}/group_vars/storage/ansible-user (100%)
 rename ansible/{ => inventory}/group_vars/storage/bios (100%)
 rename ansible/{ => inventory}/group_vars/storage/firewall (100%)
 rename ansible/{ => inventory}/group_vars/storage/luks (100%)
 rename ansible/{ => inventory}/group_vars/storage/lvm (100%)
 rename ansible/{ => inventory}/group_vars/storage/mdadm (100%)
 rename ansible/{ => inventory}/group_vars/storage/network (100%)
 rename ansible/{ => inventory}/group_vars/storage/raid (100%)
 rename ansible/{ => inventory}/group_vars/storage/sysctl (100%)
 rename ansible/{ => inventory}/group_vars/storage/tuned (100%)
 rename ansible/{ => inventory}/group_vars/storage/users (100%)
 create mode 100644 releasenotes/notes/inventory-group-vars-cef39cb6f3803ee7.yaml

diff --git a/ansible/group_vars/all/apt b/ansible/inventory/group_vars/all/apt
similarity index 100%
rename from ansible/group_vars/all/apt
rename to ansible/inventory/group_vars/all/apt
diff --git a/ansible/group_vars/all/bifrost b/ansible/inventory/group_vars/all/bifrost
similarity index 100%
rename from ansible/group_vars/all/bifrost
rename to ansible/inventory/group_vars/all/bifrost
diff --git a/ansible/group_vars/all/bmc b/ansible/inventory/group_vars/all/bmc
similarity index 100%
rename from ansible/group_vars/all/bmc
rename to ansible/inventory/group_vars/all/bmc
diff --git a/ansible/group_vars/all/compute b/ansible/inventory/group_vars/all/compute
similarity index 100%
rename from ansible/group_vars/all/compute
rename to ansible/inventory/group_vars/all/compute
diff --git a/ansible/group_vars/all/controllers b/ansible/inventory/group_vars/all/controllers
similarity index 100%
rename from ansible/group_vars/all/controllers
rename to ansible/inventory/group_vars/all/controllers
diff --git a/ansible/group_vars/all/dell-switch-bmp b/ansible/inventory/group_vars/all/dell-switch-bmp
similarity index 100%
rename from ansible/group_vars/all/dell-switch-bmp
rename to ansible/inventory/group_vars/all/dell-switch-bmp
diff --git a/ansible/group_vars/all/dnf b/ansible/inventory/group_vars/all/dnf
similarity index 100%
rename from ansible/group_vars/all/dnf
rename to ansible/inventory/group_vars/all/dnf
diff --git a/ansible/group_vars/all/dns b/ansible/inventory/group_vars/all/dns
similarity index 100%
rename from ansible/group_vars/all/dns
rename to ansible/inventory/group_vars/all/dns
diff --git a/ansible/group_vars/all/docker b/ansible/inventory/group_vars/all/docker
similarity index 100%
rename from ansible/group_vars/all/docker
rename to ansible/inventory/group_vars/all/docker
diff --git a/ansible/group_vars/all/docker-registry b/ansible/inventory/group_vars/all/docker-registry
similarity index 100%
rename from ansible/group_vars/all/docker-registry
rename to ansible/inventory/group_vars/all/docker-registry
diff --git a/ansible/group_vars/all/globals b/ansible/inventory/group_vars/all/globals
similarity index 100%
rename from ansible/group_vars/all/globals
rename to ansible/inventory/group_vars/all/globals
diff --git a/ansible/group_vars/all/grafana b/ansible/inventory/group_vars/all/grafana
similarity index 100%
rename from ansible/group_vars/all/grafana
rename to ansible/inventory/group_vars/all/grafana
diff --git a/ansible/group_vars/all/idrac b/ansible/inventory/group_vars/all/idrac
similarity index 100%
rename from ansible/group_vars/all/idrac
rename to ansible/inventory/group_vars/all/idrac
diff --git a/ansible/group_vars/all/infra-vms b/ansible/inventory/group_vars/all/infra-vms
similarity index 100%
rename from ansible/group_vars/all/infra-vms
rename to ansible/inventory/group_vars/all/infra-vms
diff --git a/ansible/group_vars/all/inspector b/ansible/inventory/group_vars/all/inspector
similarity index 100%
rename from ansible/group_vars/all/inspector
rename to ansible/inventory/group_vars/all/inspector
diff --git a/ansible/group_vars/all/ipa b/ansible/inventory/group_vars/all/ipa
similarity index 100%
rename from ansible/group_vars/all/ipa
rename to ansible/inventory/group_vars/all/ipa
diff --git a/ansible/group_vars/all/ironic b/ansible/inventory/group_vars/all/ironic
similarity index 100%
rename from ansible/group_vars/all/ironic
rename to ansible/inventory/group_vars/all/ironic
diff --git a/ansible/group_vars/all/kolla b/ansible/inventory/group_vars/all/kolla
similarity index 100%
rename from ansible/group_vars/all/kolla
rename to ansible/inventory/group_vars/all/kolla
diff --git a/ansible/group_vars/all/monasca b/ansible/inventory/group_vars/all/monasca
similarity index 100%
rename from ansible/group_vars/all/monasca
rename to ansible/inventory/group_vars/all/monasca
diff --git a/ansible/group_vars/all/monitoring b/ansible/inventory/group_vars/all/monitoring
similarity index 100%
rename from ansible/group_vars/all/monitoring
rename to ansible/inventory/group_vars/all/monitoring
diff --git a/ansible/group_vars/all/network b/ansible/inventory/group_vars/all/network
similarity index 100%
rename from ansible/group_vars/all/network
rename to ansible/inventory/group_vars/all/network
diff --git a/ansible/group_vars/all/neutron b/ansible/inventory/group_vars/all/neutron
similarity index 100%
rename from ansible/group_vars/all/neutron
rename to ansible/inventory/group_vars/all/neutron
diff --git a/ansible/group_vars/all/nova b/ansible/inventory/group_vars/all/nova
similarity index 100%
rename from ansible/group_vars/all/nova
rename to ansible/inventory/group_vars/all/nova
diff --git a/ansible/group_vars/all/opensm b/ansible/inventory/group_vars/all/opensm
similarity index 100%
rename from ansible/group_vars/all/opensm
rename to ansible/inventory/group_vars/all/opensm
diff --git a/ansible/group_vars/all/openstack b/ansible/inventory/group_vars/all/openstack
similarity index 100%
rename from ansible/group_vars/all/openstack
rename to ansible/inventory/group_vars/all/openstack
diff --git a/ansible/group_vars/all/overcloud b/ansible/inventory/group_vars/all/overcloud
similarity index 100%
rename from ansible/group_vars/all/overcloud
rename to ansible/inventory/group_vars/all/overcloud
diff --git a/ansible/group_vars/all/overcloud-dib b/ansible/inventory/group_vars/all/overcloud-dib
similarity index 100%
rename from ansible/group_vars/all/overcloud-dib
rename to ansible/inventory/group_vars/all/overcloud-dib
diff --git a/ansible/group_vars/all/pip b/ansible/inventory/group_vars/all/pip
similarity index 100%
rename from ansible/group_vars/all/pip
rename to ansible/inventory/group_vars/all/pip
diff --git a/ansible/group_vars/all/proxy b/ansible/inventory/group_vars/all/proxy
similarity index 100%
rename from ansible/group_vars/all/proxy
rename to ansible/inventory/group_vars/all/proxy
diff --git a/ansible/group_vars/all/seed b/ansible/inventory/group_vars/all/seed
similarity index 100%
rename from ansible/group_vars/all/seed
rename to ansible/inventory/group_vars/all/seed
diff --git a/ansible/group_vars/all/seed-hypervisor b/ansible/inventory/group_vars/all/seed-hypervisor
similarity index 100%
rename from ansible/group_vars/all/seed-hypervisor
rename to ansible/inventory/group_vars/all/seed-hypervisor
diff --git a/ansible/group_vars/all/seed-vm b/ansible/inventory/group_vars/all/seed-vm
similarity index 100%
rename from ansible/group_vars/all/seed-vm
rename to ansible/inventory/group_vars/all/seed-vm
diff --git a/ansible/group_vars/all/ssh b/ansible/inventory/group_vars/all/ssh
similarity index 100%
rename from ansible/group_vars/all/ssh
rename to ansible/inventory/group_vars/all/ssh
diff --git a/ansible/group_vars/all/storage b/ansible/inventory/group_vars/all/storage
similarity index 100%
rename from ansible/group_vars/all/storage
rename to ansible/inventory/group_vars/all/storage
diff --git a/ansible/group_vars/all/swift b/ansible/inventory/group_vars/all/swift
similarity index 100%
rename from ansible/group_vars/all/swift
rename to ansible/inventory/group_vars/all/swift
diff --git a/ansible/group_vars/all/switches/arista b/ansible/inventory/group_vars/all/switches/arista
similarity index 100%
rename from ansible/group_vars/all/switches/arista
rename to ansible/inventory/group_vars/all/switches/arista
diff --git a/ansible/group_vars/all/switches/config b/ansible/inventory/group_vars/all/switches/config
similarity index 100%
rename from ansible/group_vars/all/switches/config
rename to ansible/inventory/group_vars/all/switches/config
diff --git a/ansible/group_vars/all/switches/dell b/ansible/inventory/group_vars/all/switches/dell
similarity index 100%
rename from ansible/group_vars/all/switches/dell
rename to ansible/inventory/group_vars/all/switches/dell
diff --git a/ansible/group_vars/all/switches/dell-powerconnect b/ansible/inventory/group_vars/all/switches/dell-powerconnect
similarity index 100%
rename from ansible/group_vars/all/switches/dell-powerconnect
rename to ansible/inventory/group_vars/all/switches/dell-powerconnect
diff --git a/ansible/group_vars/all/switches/junos b/ansible/inventory/group_vars/all/switches/junos
similarity index 100%
rename from ansible/group_vars/all/switches/junos
rename to ansible/inventory/group_vars/all/switches/junos
diff --git a/ansible/group_vars/all/switches/mellanox b/ansible/inventory/group_vars/all/switches/mellanox
similarity index 100%
rename from ansible/group_vars/all/switches/mellanox
rename to ansible/inventory/group_vars/all/switches/mellanox
diff --git a/ansible/group_vars/all/time b/ansible/inventory/group_vars/all/time
similarity index 100%
rename from ansible/group_vars/all/time
rename to ansible/inventory/group_vars/all/time
diff --git a/ansible/group_vars/all/users b/ansible/inventory/group_vars/all/users
similarity index 100%
rename from ansible/group_vars/all/users
rename to ansible/inventory/group_vars/all/users
diff --git a/ansible/group_vars/compute/ansible-user b/ansible/inventory/group_vars/compute/ansible-user
similarity index 100%
rename from ansible/group_vars/compute/ansible-user
rename to ansible/inventory/group_vars/compute/ansible-user
diff --git a/ansible/group_vars/compute/bios b/ansible/inventory/group_vars/compute/bios
similarity index 100%
rename from ansible/group_vars/compute/bios
rename to ansible/inventory/group_vars/compute/bios
diff --git a/ansible/group_vars/compute/firewall b/ansible/inventory/group_vars/compute/firewall
similarity index 100%
rename from ansible/group_vars/compute/firewall
rename to ansible/inventory/group_vars/compute/firewall
diff --git a/ansible/group_vars/compute/luks b/ansible/inventory/group_vars/compute/luks
similarity index 100%
rename from ansible/group_vars/compute/luks
rename to ansible/inventory/group_vars/compute/luks
diff --git a/ansible/group_vars/compute/lvm b/ansible/inventory/group_vars/compute/lvm
similarity index 100%
rename from ansible/group_vars/compute/lvm
rename to ansible/inventory/group_vars/compute/lvm
diff --git a/ansible/group_vars/compute/mdadm b/ansible/inventory/group_vars/compute/mdadm
similarity index 100%
rename from ansible/group_vars/compute/mdadm
rename to ansible/inventory/group_vars/compute/mdadm
diff --git a/ansible/group_vars/compute/network b/ansible/inventory/group_vars/compute/network
similarity index 100%
rename from ansible/group_vars/compute/network
rename to ansible/inventory/group_vars/compute/network
diff --git a/ansible/group_vars/compute/raid b/ansible/inventory/group_vars/compute/raid
similarity index 100%
rename from ansible/group_vars/compute/raid
rename to ansible/inventory/group_vars/compute/raid
diff --git a/ansible/group_vars/compute/sysctl b/ansible/inventory/group_vars/compute/sysctl
similarity index 100%
rename from ansible/group_vars/compute/sysctl
rename to ansible/inventory/group_vars/compute/sysctl
diff --git a/ansible/group_vars/compute/tuned b/ansible/inventory/group_vars/compute/tuned
similarity index 100%
rename from ansible/group_vars/compute/tuned
rename to ansible/inventory/group_vars/compute/tuned
diff --git a/ansible/group_vars/compute/users b/ansible/inventory/group_vars/compute/users
similarity index 100%
rename from ansible/group_vars/compute/users
rename to ansible/inventory/group_vars/compute/users
diff --git a/ansible/group_vars/controllers/ansible-user b/ansible/inventory/group_vars/controllers/ansible-user
similarity index 100%
rename from ansible/group_vars/controllers/ansible-user
rename to ansible/inventory/group_vars/controllers/ansible-user
diff --git a/ansible/group_vars/controllers/bios b/ansible/inventory/group_vars/controllers/bios
similarity index 100%
rename from ansible/group_vars/controllers/bios
rename to ansible/inventory/group_vars/controllers/bios
diff --git a/ansible/group_vars/controllers/firewall b/ansible/inventory/group_vars/controllers/firewall
similarity index 100%
rename from ansible/group_vars/controllers/firewall
rename to ansible/inventory/group_vars/controllers/firewall
diff --git a/ansible/group_vars/controllers/luks b/ansible/inventory/group_vars/controllers/luks
similarity index 100%
rename from ansible/group_vars/controllers/luks
rename to ansible/inventory/group_vars/controllers/luks
diff --git a/ansible/group_vars/controllers/lvm b/ansible/inventory/group_vars/controllers/lvm
similarity index 100%
rename from ansible/group_vars/controllers/lvm
rename to ansible/inventory/group_vars/controllers/lvm
diff --git a/ansible/group_vars/controllers/mdadm b/ansible/inventory/group_vars/controllers/mdadm
similarity index 100%
rename from ansible/group_vars/controllers/mdadm
rename to ansible/inventory/group_vars/controllers/mdadm
diff --git a/ansible/group_vars/controllers/network b/ansible/inventory/group_vars/controllers/network
similarity index 100%
rename from ansible/group_vars/controllers/network
rename to ansible/inventory/group_vars/controllers/network
diff --git a/ansible/group_vars/controllers/raid b/ansible/inventory/group_vars/controllers/raid
similarity index 100%
rename from ansible/group_vars/controllers/raid
rename to ansible/inventory/group_vars/controllers/raid
diff --git a/ansible/group_vars/controllers/sysctl b/ansible/inventory/group_vars/controllers/sysctl
similarity index 100%
rename from ansible/group_vars/controllers/sysctl
rename to ansible/inventory/group_vars/controllers/sysctl
diff --git a/ansible/group_vars/controllers/tuned b/ansible/inventory/group_vars/controllers/tuned
similarity index 100%
rename from ansible/group_vars/controllers/tuned
rename to ansible/inventory/group_vars/controllers/tuned
diff --git a/ansible/group_vars/controllers/users b/ansible/inventory/group_vars/controllers/users
similarity index 100%
rename from ansible/group_vars/controllers/users
rename to ansible/inventory/group_vars/controllers/users
diff --git a/ansible/group_vars/infra-vms/ansible-host b/ansible/inventory/group_vars/infra-vms/ansible-host
similarity index 100%
rename from ansible/group_vars/infra-vms/ansible-host
rename to ansible/inventory/group_vars/infra-vms/ansible-host
diff --git a/ansible/group_vars/infra-vms/ansible-user b/ansible/inventory/group_vars/infra-vms/ansible-user
similarity index 100%
rename from ansible/group_vars/infra-vms/ansible-user
rename to ansible/inventory/group_vars/infra-vms/ansible-user
diff --git a/ansible/group_vars/infra-vms/firewall b/ansible/inventory/group_vars/infra-vms/firewall
similarity index 100%
rename from ansible/group_vars/infra-vms/firewall
rename to ansible/inventory/group_vars/infra-vms/firewall
diff --git a/ansible/group_vars/infra-vms/luks b/ansible/inventory/group_vars/infra-vms/luks
similarity index 100%
rename from ansible/group_vars/infra-vms/luks
rename to ansible/inventory/group_vars/infra-vms/luks
diff --git a/ansible/group_vars/infra-vms/lvm b/ansible/inventory/group_vars/infra-vms/lvm
similarity index 100%
rename from ansible/group_vars/infra-vms/lvm
rename to ansible/inventory/group_vars/infra-vms/lvm
diff --git a/ansible/group_vars/infra-vms/mdadm b/ansible/inventory/group_vars/infra-vms/mdadm
similarity index 100%
rename from ansible/group_vars/infra-vms/mdadm
rename to ansible/inventory/group_vars/infra-vms/mdadm
diff --git a/ansible/group_vars/infra-vms/network b/ansible/inventory/group_vars/infra-vms/network
similarity index 100%
rename from ansible/group_vars/infra-vms/network
rename to ansible/inventory/group_vars/infra-vms/network
diff --git a/ansible/group_vars/infra-vms/sysctl b/ansible/inventory/group_vars/infra-vms/sysctl
similarity index 100%
rename from ansible/group_vars/infra-vms/sysctl
rename to ansible/inventory/group_vars/infra-vms/sysctl
diff --git a/ansible/group_vars/infra-vms/tuned b/ansible/inventory/group_vars/infra-vms/tuned
similarity index 100%
rename from ansible/group_vars/infra-vms/tuned
rename to ansible/inventory/group_vars/infra-vms/tuned
diff --git a/ansible/group_vars/infra-vms/users b/ansible/inventory/group_vars/infra-vms/users
similarity index 100%
rename from ansible/group_vars/infra-vms/users
rename to ansible/inventory/group_vars/infra-vms/users
diff --git a/ansible/group_vars/monitoring/ansible-user b/ansible/inventory/group_vars/monitoring/ansible-user
similarity index 100%
rename from ansible/group_vars/monitoring/ansible-user
rename to ansible/inventory/group_vars/monitoring/ansible-user
diff --git a/ansible/group_vars/monitoring/bios b/ansible/inventory/group_vars/monitoring/bios
similarity index 100%
rename from ansible/group_vars/monitoring/bios
rename to ansible/inventory/group_vars/monitoring/bios
diff --git a/ansible/group_vars/monitoring/firewall b/ansible/inventory/group_vars/monitoring/firewall
similarity index 100%
rename from ansible/group_vars/monitoring/firewall
rename to ansible/inventory/group_vars/monitoring/firewall
diff --git a/ansible/group_vars/monitoring/luks b/ansible/inventory/group_vars/monitoring/luks
similarity index 100%
rename from ansible/group_vars/monitoring/luks
rename to ansible/inventory/group_vars/monitoring/luks
diff --git a/ansible/group_vars/monitoring/lvm b/ansible/inventory/group_vars/monitoring/lvm
similarity index 100%
rename from ansible/group_vars/monitoring/lvm
rename to ansible/inventory/group_vars/monitoring/lvm
diff --git a/ansible/group_vars/monitoring/mdadm b/ansible/inventory/group_vars/monitoring/mdadm
similarity index 100%
rename from ansible/group_vars/monitoring/mdadm
rename to ansible/inventory/group_vars/monitoring/mdadm
diff --git a/ansible/group_vars/monitoring/network b/ansible/inventory/group_vars/monitoring/network
similarity index 100%
rename from ansible/group_vars/monitoring/network
rename to ansible/inventory/group_vars/monitoring/network
diff --git a/ansible/group_vars/monitoring/raid b/ansible/inventory/group_vars/monitoring/raid
similarity index 100%
rename from ansible/group_vars/monitoring/raid
rename to ansible/inventory/group_vars/monitoring/raid
diff --git a/ansible/group_vars/monitoring/sysctl b/ansible/inventory/group_vars/monitoring/sysctl
similarity index 100%
rename from ansible/group_vars/monitoring/sysctl
rename to ansible/inventory/group_vars/monitoring/sysctl
diff --git a/ansible/group_vars/monitoring/tuned b/ansible/inventory/group_vars/monitoring/tuned
similarity index 100%
rename from ansible/group_vars/monitoring/tuned
rename to ansible/inventory/group_vars/monitoring/tuned
diff --git a/ansible/group_vars/monitoring/users b/ansible/inventory/group_vars/monitoring/users
similarity index 100%
rename from ansible/group_vars/monitoring/users
rename to ansible/inventory/group_vars/monitoring/users
diff --git a/ansible/group_vars/overcloud/ansible-host b/ansible/inventory/group_vars/overcloud/ansible-host
similarity index 100%
rename from ansible/group_vars/overcloud/ansible-host
rename to ansible/inventory/group_vars/overcloud/ansible-host
diff --git a/ansible/group_vars/seed-hypervisor/ansible-host b/ansible/inventory/group_vars/seed-hypervisor/ansible-host
similarity index 100%
rename from ansible/group_vars/seed-hypervisor/ansible-host
rename to ansible/inventory/group_vars/seed-hypervisor/ansible-host
diff --git a/ansible/group_vars/seed-hypervisor/ansible-user b/ansible/inventory/group_vars/seed-hypervisor/ansible-user
similarity index 100%
rename from ansible/group_vars/seed-hypervisor/ansible-user
rename to ansible/inventory/group_vars/seed-hypervisor/ansible-user
diff --git a/ansible/group_vars/seed-hypervisor/firewall b/ansible/inventory/group_vars/seed-hypervisor/firewall
similarity index 100%
rename from ansible/group_vars/seed-hypervisor/firewall
rename to ansible/inventory/group_vars/seed-hypervisor/firewall
diff --git a/ansible/group_vars/seed-hypervisor/luks b/ansible/inventory/group_vars/seed-hypervisor/luks
similarity index 100%
rename from ansible/group_vars/seed-hypervisor/luks
rename to ansible/inventory/group_vars/seed-hypervisor/luks
diff --git a/ansible/group_vars/seed-hypervisor/lvm b/ansible/inventory/group_vars/seed-hypervisor/lvm
similarity index 100%
rename from ansible/group_vars/seed-hypervisor/lvm
rename to ansible/inventory/group_vars/seed-hypervisor/lvm
diff --git a/ansible/group_vars/seed-hypervisor/mdadm b/ansible/inventory/group_vars/seed-hypervisor/mdadm
similarity index 100%
rename from ansible/group_vars/seed-hypervisor/mdadm
rename to ansible/inventory/group_vars/seed-hypervisor/mdadm
diff --git a/ansible/group_vars/seed-hypervisor/network b/ansible/inventory/group_vars/seed-hypervisor/network
similarity index 100%
rename from ansible/group_vars/seed-hypervisor/network
rename to ansible/inventory/group_vars/seed-hypervisor/network
diff --git a/ansible/group_vars/seed-hypervisor/snat b/ansible/inventory/group_vars/seed-hypervisor/snat
similarity index 100%
rename from ansible/group_vars/seed-hypervisor/snat
rename to ansible/inventory/group_vars/seed-hypervisor/snat
diff --git a/ansible/group_vars/seed-hypervisor/sysctl b/ansible/inventory/group_vars/seed-hypervisor/sysctl
similarity index 100%
rename from ansible/group_vars/seed-hypervisor/sysctl
rename to ansible/inventory/group_vars/seed-hypervisor/sysctl
diff --git a/ansible/group_vars/seed-hypervisor/tuned b/ansible/inventory/group_vars/seed-hypervisor/tuned
similarity index 100%
rename from ansible/group_vars/seed-hypervisor/tuned
rename to ansible/inventory/group_vars/seed-hypervisor/tuned
diff --git a/ansible/group_vars/seed-hypervisor/users b/ansible/inventory/group_vars/seed-hypervisor/users
similarity index 100%
rename from ansible/group_vars/seed-hypervisor/users
rename to ansible/inventory/group_vars/seed-hypervisor/users
diff --git a/ansible/group_vars/seed/ansible-host b/ansible/inventory/group_vars/seed/ansible-host
similarity index 100%
rename from ansible/group_vars/seed/ansible-host
rename to ansible/inventory/group_vars/seed/ansible-host
diff --git a/ansible/group_vars/seed/ansible-user b/ansible/inventory/group_vars/seed/ansible-user
similarity index 100%
rename from ansible/group_vars/seed/ansible-user
rename to ansible/inventory/group_vars/seed/ansible-user
diff --git a/ansible/group_vars/seed/firewall b/ansible/inventory/group_vars/seed/firewall
similarity index 100%
rename from ansible/group_vars/seed/firewall
rename to ansible/inventory/group_vars/seed/firewall
diff --git a/ansible/group_vars/seed/luks b/ansible/inventory/group_vars/seed/luks
similarity index 100%
rename from ansible/group_vars/seed/luks
rename to ansible/inventory/group_vars/seed/luks
diff --git a/ansible/group_vars/seed/lvm b/ansible/inventory/group_vars/seed/lvm
similarity index 100%
rename from ansible/group_vars/seed/lvm
rename to ansible/inventory/group_vars/seed/lvm
diff --git a/ansible/group_vars/seed/mdadm b/ansible/inventory/group_vars/seed/mdadm
similarity index 100%
rename from ansible/group_vars/seed/mdadm
rename to ansible/inventory/group_vars/seed/mdadm
diff --git a/ansible/group_vars/seed/network b/ansible/inventory/group_vars/seed/network
similarity index 100%
rename from ansible/group_vars/seed/network
rename to ansible/inventory/group_vars/seed/network
diff --git a/ansible/group_vars/seed/snat b/ansible/inventory/group_vars/seed/snat
similarity index 100%
rename from ansible/group_vars/seed/snat
rename to ansible/inventory/group_vars/seed/snat
diff --git a/ansible/group_vars/seed/sysctl b/ansible/inventory/group_vars/seed/sysctl
similarity index 100%
rename from ansible/group_vars/seed/sysctl
rename to ansible/inventory/group_vars/seed/sysctl
diff --git a/ansible/group_vars/seed/tuned b/ansible/inventory/group_vars/seed/tuned
similarity index 100%
rename from ansible/group_vars/seed/tuned
rename to ansible/inventory/group_vars/seed/tuned
diff --git a/ansible/group_vars/seed/users b/ansible/inventory/group_vars/seed/users
similarity index 100%
rename from ansible/group_vars/seed/users
rename to ansible/inventory/group_vars/seed/users
diff --git a/ansible/group_vars/storage/ansible-user b/ansible/inventory/group_vars/storage/ansible-user
similarity index 100%
rename from ansible/group_vars/storage/ansible-user
rename to ansible/inventory/group_vars/storage/ansible-user
diff --git a/ansible/group_vars/storage/bios b/ansible/inventory/group_vars/storage/bios
similarity index 100%
rename from ansible/group_vars/storage/bios
rename to ansible/inventory/group_vars/storage/bios
diff --git a/ansible/group_vars/storage/firewall b/ansible/inventory/group_vars/storage/firewall
similarity index 100%
rename from ansible/group_vars/storage/firewall
rename to ansible/inventory/group_vars/storage/firewall
diff --git a/ansible/group_vars/storage/luks b/ansible/inventory/group_vars/storage/luks
similarity index 100%
rename from ansible/group_vars/storage/luks
rename to ansible/inventory/group_vars/storage/luks
diff --git a/ansible/group_vars/storage/lvm b/ansible/inventory/group_vars/storage/lvm
similarity index 100%
rename from ansible/group_vars/storage/lvm
rename to ansible/inventory/group_vars/storage/lvm
diff --git a/ansible/group_vars/storage/mdadm b/ansible/inventory/group_vars/storage/mdadm
similarity index 100%
rename from ansible/group_vars/storage/mdadm
rename to ansible/inventory/group_vars/storage/mdadm
diff --git a/ansible/group_vars/storage/network b/ansible/inventory/group_vars/storage/network
similarity index 100%
rename from ansible/group_vars/storage/network
rename to ansible/inventory/group_vars/storage/network
diff --git a/ansible/group_vars/storage/raid b/ansible/inventory/group_vars/storage/raid
similarity index 100%
rename from ansible/group_vars/storage/raid
rename to ansible/inventory/group_vars/storage/raid
diff --git a/ansible/group_vars/storage/sysctl b/ansible/inventory/group_vars/storage/sysctl
similarity index 100%
rename from ansible/group_vars/storage/sysctl
rename to ansible/inventory/group_vars/storage/sysctl
diff --git a/ansible/group_vars/storage/tuned b/ansible/inventory/group_vars/storage/tuned
similarity index 100%
rename from ansible/group_vars/storage/tuned
rename to ansible/inventory/group_vars/storage/tuned
diff --git a/ansible/group_vars/storage/users b/ansible/inventory/group_vars/storage/users
similarity index 100%
rename from ansible/group_vars/storage/users
rename to ansible/inventory/group_vars/storage/users
diff --git a/doc/source/configuration/reference/infra-vms.rst b/doc/source/configuration/reference/infra-vms.rst
index baa46faca..0fd8e6013 100644
--- a/doc/source/configuration/reference/infra-vms.rst
+++ b/doc/source/configuration/reference/infra-vms.rst
@@ -39,7 +39,7 @@ can be added by setting ``infra_vm_network_interfaces_extra``.
 List of Kayobe applied defaults to required docker_container variables.
 Any of these variables can be overridden with a ``host_var``.
 
-.. literalinclude:: ../../../../ansible/group_vars/all/infra-vms
+.. literalinclude:: ../../../../ansible/inventory/group_vars/all/infra-vms
     :language: yaml
 
 Customisations
diff --git a/doc/source/configuration/reference/kayobe.rst b/doc/source/configuration/reference/kayobe.rst
index f478fbdfe..c442f90d0 100644
--- a/doc/source/configuration/reference/kayobe.rst
+++ b/doc/source/configuration/reference/kayobe.rst
@@ -44,19 +44,21 @@ and provide a mechanism we can use for providing site localisation and
 customisation of OpenStack in combination with some reasonable default values.
 For global configuration options, Kayobe typically uses the following patterns:
 
-- Playbook group variables for the *all* group in
-  ``<kayobe repo>/ansible/group_vars/all/*`` set **global defaults**.  These
-  files should not be modified.
-- Playbook group variables for other groups in
-  ``<kayobe repo>/ansible/group_vars/<group>/*`` set **defaults for some subsets
-  of hosts**.  These files should not be modified.
+- Inventory group variables for the *all* group in
+  ``<kayobe repo>/ansible/inventory/group_vars/all/*`` set **global defaults**.
+  These files should not be modified.
+- Inventory group variables for other groups in
+  ``<kayobe repo>/ansible/inventory/group_vars/<group>/*`` set **defaults for
+  some subsets of hosts**.  These files should not be modified.
 - Extra-vars files in ``${KAYOBE_CONFIG_PATH}/*.yml`` set **custom values
   for global variables** and should be used to apply global site localisation
   and customisation.  By default these variables are commented out.
 
-Additionally, variables can be set on a per-host basis using inventory host
-variables files in ``${KAYOBE_CONFIG_PATH}/inventory/host_vars/*``.  It should
-be noted that variables set in extra-vars files take precedence over per-host
+Additionally, variables can be set on a per-group or per-host basis using
+inventory group or host variables files in
+``${KAYOBE_CONFIG_PATH}/inventory/group_vars/*`` or
+``${KAYOBE_CONFIG_PATH}/inventory/host_vars/*`` respectively.  It should be
+noted that variables set in extra-vars files take precedence over per-host
 variables.
 
 .. _configuring-kayobe:
diff --git a/doc/source/configuration/reference/kolla.rst b/doc/source/configuration/reference/kolla.rst
index 5a35196cf..a4b4e4f4c 100644
--- a/doc/source/configuration/reference/kolla.rst
+++ b/doc/source/configuration/reference/kolla.rst
@@ -153,7 +153,7 @@ images that will be built:
 
 If a required image is not built when the corresponding flag is set, check the
 image sets defined in ``overcloud_container_image_sets`` in
-``ansible/group_vars/all/kolla``.
+``ansible/inventory/group_vars/all/kolla``.
 
 Image Customisation
 ===================
diff --git a/doc/source/contributor/development.rst b/doc/source/contributor/development.rst
index 6aede7401..e65f630e5 100644
--- a/doc/source/contributor/development.rst
+++ b/doc/source/contributor/development.rst
@@ -31,7 +31,7 @@ Kayobe's Ansible playbooks live in `ansible/*.yml
 typically execute roles in `ansible/roles/
 <https://opendev.org/openstack/kayobe/src/branch/master/ansible/roles>`__.
 Global variable defaults are defined in group variable files in
-`ansible/group_vars/all/
+`ansible/inventory/group_vars/all/
 <https://opendev.org/openstack/kayobe/src/branch/master/ansible/group_vars/>`__
 and these typically map to commented out variables in the configuration files
 in `etc/kayobe/*.yml
diff --git a/doc/source/control-plane-service-placement.rst b/doc/source/control-plane-service-placement.rst
index fa634a22a..401c5adb9 100644
--- a/doc/source/control-plane-service-placement.rst
+++ b/doc/source/control-plane-service-placement.rst
@@ -46,10 +46,10 @@ Variables For Custom Server Roles
 Certain variables must be defined for hosts in the ``overcloud`` group.  For
 hosts in the ``controllers`` group, many variables are mapped to other
 variables with a ``controller_`` prefix in files under
-``ansible/group_vars/controllers/``. This is done in order that they may be set
-in a global extra variables file, typically ``controllers.yml``, with defaults
-set in ``ansible/group_vars/all/controllers``.  A similar scheme is used for
-hosts in the ``monitoring`` group.
+``ansible/inventory/group_vars/controllers/``. This is done in order that they
+may be set in a global extra variables file, typically ``controllers.yml``,
+with defaults set in ``ansible/inventory/group_vars/all/controllers``.  A
+similar scheme is used for hosts in the ``monitoring`` group.
 
 .. table:: Overcloud host variables
 
diff --git a/doc/source/custom-ansible-playbooks.rst b/doc/source/custom-ansible-playbooks.rst
index 7941a0f79..0c6179367 100644
--- a/doc/source/custom-ansible-playbooks.rst
+++ b/doc/source/custom-ansible-playbooks.rst
@@ -61,7 +61,6 @@ plugins:
 
    cd ${KAYOBE_CONFIG_PATH}/ansible/
    ln -s ../../../../kayobe/ansible/filter_plugins/ filter_plugins
-   ln -s ../../../../kayobe/ansible/group_vars/ group_vars
    ln -s ../../../../kayobe/ansible/test_plugins/ test_plugins
 
 These symlinks can even be committed to the kayobe-config Git repository.
diff --git a/kayobe/ansible.py b/kayobe/ansible.py
index d8dd80054..9d47a9243 100644
--- a/kayobe/ansible.py
+++ b/kayobe/ansible.py
@@ -91,10 +91,11 @@ def _get_kayobe_environment_path(parsed_args):
 
 def _get_inventories_paths(parsed_args, env_path):
     """Return the paths to the Kayobe inventories."""
+    default_inventory = utils.get_data_files_path("ansible", "inventory")
+    inventories = [default_inventory]
     if parsed_args.inventory:
-        return parsed_args.inventory
+        inventories.extend(parsed_args.inventory)
     else:
-        inventories = []
         shared_inventory = os.path.join(parsed_args.config_path, "inventory")
         if env_path:
             if os.path.exists(shared_inventory):
@@ -106,7 +107,7 @@ def _get_inventories_paths(parsed_args, env_path):
             # Preserve existing behaviour: don't check if an inventory
             # directory exists when no environment is specified
             inventories.append(shared_inventory)
-        return inventories
+    return inventories
 
 
 def _validate_args(parsed_args, playbooks):
diff --git a/kayobe/tests/unit/test_ansible.py b/kayobe/tests/unit/test_ansible.py
index 5656ac378..7da686379 100644
--- a/kayobe/tests/unit/test_ansible.py
+++ b/kayobe/tests/unit/test_ansible.py
@@ -45,6 +45,7 @@ class TestCase(unittest.TestCase):
         ansible.run_playbooks(parsed_args, ["playbook1.yml", "playbook2.yml"])
         expected_cmd = [
             "ansible-playbook",
+            "--inventory", utils.get_data_files_path("ansible", "inventory"),
             "--inventory", "/etc/kayobe/inventory",
             "-e", "@/etc/kayobe/vars-file1.yml",
             "-e", "@/etc/kayobe/vars-file2.yaml",
@@ -85,6 +86,7 @@ class TestCase(unittest.TestCase):
             "ansible-playbook",
             "-vv",
             "--list-tasks",
+            "--inventory", utils.get_data_files_path("ansible", "inventory"),
             "--inventory", "/path/to/inventory",
             "-e", "@/path/to/config/vars-file1.yml",
             "-e", "@/path/to/config/vars-file2.yaml",
@@ -137,6 +139,7 @@ class TestCase(unittest.TestCase):
             "ansible-playbook",
             "--list-tasks",
             "--vault-password-file", "/path/to/kayobe-vault-password-helper",
+            "--inventory", utils.get_data_files_path("ansible", "inventory"),
             "--inventory", "/path/to/inventory",
             "-e", "@/path/to/config/vars-file1.yml",
             "-e", "@/path/to/config/vars-file2.yaml",
@@ -182,6 +185,7 @@ class TestCase(unittest.TestCase):
         expected_cmd = [
             "ansible-playbook",
             "--vault-password-file", "/path/to/vault/pw",
+            "--inventory", utils.get_data_files_path("ansible", "inventory"),
             "--inventory", "/etc/kayobe/inventory",
             "playbook1.yml",
         ]
@@ -211,6 +215,7 @@ class TestCase(unittest.TestCase):
         expected_cmd = [
             "ansible-playbook",
             "--vault-password-file", "/path/to/kayobe-vault-password-helper",
+            "--inventory", utils.get_data_files_path("ansible", "inventory"),
             "--inventory", "/etc/kayobe/inventory",
             "playbook1.yml",
         ]
@@ -261,6 +266,7 @@ class TestCase(unittest.TestCase):
                               **kwargs)
         expected_cmd = [
             "ansible-playbook",
+            "--inventory", utils.get_data_files_path("ansible", "inventory"),
             "--inventory", "/etc/kayobe/inventory",
             "-e", "@/etc/kayobe/vars-file1.yml",
             "-e", "@/etc/kayobe/vars-file2.yaml",
@@ -296,6 +302,7 @@ class TestCase(unittest.TestCase):
                               limit="foo", ignore_limit=True)
         expected_cmd = [
             "ansible-playbook",
+            "--inventory", utils.get_data_files_path("ansible", "inventory"),
             "--inventory", "/etc/kayobe/inventory",
             "-e", "@/etc/kayobe/vars-file1.yml",
             "-e", "@/etc/kayobe/vars-file2.yaml",
@@ -327,6 +334,7 @@ class TestCase(unittest.TestCase):
                               **kwargs)
         expected_cmd = [
             "ansible-playbook",
+            "--inventory", utils.get_data_files_path("ansible", "inventory"),
             "--inventory", "/etc/kayobe/inventory",
             "playbook1.yml",
             "playbook2.yml",
@@ -351,6 +359,7 @@ class TestCase(unittest.TestCase):
         ansible.run_playbooks(parsed_args, ["playbook1.yml"])
         expected_cmd = [
             "ansible-playbook",
+            "--inventory", utils.get_data_files_path("ansible", "inventory"),
             "--inventory", "/etc/kayobe/inventory",
             "playbook1.yml",
         ]
@@ -379,6 +388,7 @@ class TestCase(unittest.TestCase):
         ansible.run_playbooks(parsed_args, ["playbook1.yml"])
         expected_cmd = [
             "ansible-playbook",
+            "--inventory", utils.get_data_files_path("ansible", "inventory"),
             "--inventory", "/etc/kayobe/inventory",
             "playbook1.yml",
         ]
@@ -673,6 +683,7 @@ class TestCase(unittest.TestCase):
         ansible.run_playbooks(parsed_args, ["playbook1.yml", "playbook2.yml"])
         expected_cmd = [
             "ansible-playbook",
+            "--inventory", utils.get_data_files_path("ansible", "inventory"),
             "--inventory", "/etc/kayobe/inventory",
             "--inventory", "/etc/kayobe/environments/foobar/inventory",
             "playbook1.yml",
@@ -705,6 +716,7 @@ class TestCase(unittest.TestCase):
         ansible.run_playbooks(parsed_args, ["playbook1.yml", "playbook2.yml"])
         expected_cmd = [
             "ansible-playbook",
+            "--inventory", utils.get_data_files_path("ansible", "inventory"),
             "--inventory", "/etc/kayobe/inventory",
             "--inventory", "/etc/kayobe/environments/test-env/inventory",
             "playbook1.yml",
@@ -745,6 +757,7 @@ class TestCase(unittest.TestCase):
         ansible.run_playbooks(parsed_args, ["playbook1.yml", "playbook2.yml"])
         expected_cmd = [
             "ansible-playbook",
+            "--inventory", utils.get_data_files_path("ansible", "inventory"),
             "--inventory", "/etc/kayobe/inventory",
             "playbook1.yml",
             "playbook2.yml",
@@ -784,6 +797,7 @@ class TestCase(unittest.TestCase):
         ansible.run_playbooks(parsed_args, ["playbook1.yml", "playbook2.yml"])
         expected_cmd = [
             "ansible-playbook",
+            "--inventory", utils.get_data_files_path("ansible", "inventory"),
             "--inventory", "/etc/kayobe/environments/test-env/inventory",
             "playbook1.yml",
             "playbook2.yml",
diff --git a/releasenotes/notes/inventory-group-vars-cef39cb6f3803ee7.yaml b/releasenotes/notes/inventory-group-vars-cef39cb6f3803ee7.yaml
new file mode 100644
index 000000000..e43ce0306
--- /dev/null
+++ b/releasenotes/notes/inventory-group-vars-cef39cb6f3803ee7.yaml
@@ -0,0 +1,18 @@
+---
+upgrade:
+  - |
+    Changes the Kayobe playbook group variables in ``ansible/group_vars/`` to
+    be inventory group variables in ``ansible/inventory/group_vars``. This has
+    two important consequences:
+
+    1. Inventory group variables have a lower precedence than playbook group
+       variables. This means that these variables can now be overridden by
+       group variables in the Kayobe configuration inventory.
+
+    2. The new inventory group variables are automatically used by all Kayobe
+       commands, and do not need to be in the same directory as the playbook
+       being executed. This means that the `previous workaround
+       <https://docs.openstack.org/kayobe/yoga/custom-ansible-playbooks.html#packaging-custom-playbooks-with-configuration>`_
+       for custom playbooks involving symlinking to the group_vars directory
+       from the directory containing the custom playbook is no longer
+       necessary.
diff --git a/tools/test-ansible.sh b/tools/test-ansible.sh
index 62f1904cf..35daa9300 100755
--- a/tools/test-ansible.sh
+++ b/tools/test-ansible.sh
@@ -10,9 +10,9 @@ export ANSIBLE_ACTION_PLUGINS="kayobe/plugins/action:~/.ansible/plugins/action:/
 for playbook in ansible/roles/*/tests/main.yml; do
     # We declare extra variables to install the {{ openstack_branch }} version
     # of kolla-ansible. We should use {{ kolla_ansible_source_version }}, but
-    # adding ansible/group_vars/all/kolla would in turn require other
+    # adding ansible/inventory/group_vars/all/kolla would in turn require other
     # extra-vars files (like pip) and may cause unintended side effects.
-    if ! ansible-playbook --connection=local $playbook $* -e @ansible/group_vars/all/openstack; then
+    if ! ansible-playbook --connection=local $playbook $* -e @ansible/inventory/group_vars/all/openstack; then
         failed=$((failed + 1))
     fi
 done