mirror of
https://github.com/ansible/awx.git
synced 2026-01-17 20:51:21 -03:30
Bump keystone auth to resolve problem with openstack script Clarify code path, routing to template vs. managed injector behavior is also now reflected in test data files Refactor test data layout for inventory injector logic Add developer docs for inventory plugins transition Memoize only get_ansible_version with no parameters Make inventory plugin injector enablement a separate concept from the initial_version switch tests to look for plugin_name as well Add plugin injectors for tower and foreman. Add jinja2 native types compat feature move tower source license compare logic to management command introduce inventory source compat mode pin jinja2 for native Ansible types Add parent group keys, and additional translations manual dash sanitization for un-region-like ec2 groups nest zones under regions using Ansible core feature just merged implement conditionally only with BOTH group_by options Make compat mode default be true in API models, UI add and edit controllers Add several additional hostvars to translation Add Azure tags null case translation Make Azure group_by key off source_vars to be consistent with the script support top-level ec2 boto_profile setting
182 lines
7.9 KiB
Markdown
182 lines
7.9 KiB
Markdown
# Transition to Ansible Inventory Plugins
|
|
Inventory updates change from using scripts which are vendored as executable
|
|
python scripts in the AWX folder `awx/plugins/inventory` (taken originally from
|
|
Ansible folder `contrib/inventory`) to using dynamically-generated
|
|
YAML files which conform to the specifications of the `auto` inventory plugin
|
|
which are then parsed by their respective inventory plugin.
|
|
|
|
The major organizational change is that the inventory plugins are
|
|
part of the Ansible core distribution, whereas the same logic used to
|
|
be a part of AWX source.
|
|
|
|
## Prior Background for Transition
|
|
|
|
AWX used to maintain logic that parsed `.ini` inventory file contents,
|
|
in addition to interpreting the JSON output of scripts, re-calling with
|
|
the `--host` option in the case the `_meta.hostvars` key was not provided.
|
|
|
|
### Switch to Ansible Inventory
|
|
|
|
The CLI entry point `ansible-inventory` was introduced in Ansible 2.4.
|
|
In Tower 3.2, inventory imports began running this command
|
|
as an intermediary between the inventory and
|
|
the import's logic to save content to database. Using `ansible-inventory`
|
|
eliminates the need to maintain source-specific logic,
|
|
relying on Ansible's code instead. This also allows us to
|
|
count on a consistent data structure outputted from `ansible-inventory`.
|
|
There are many valid structures that a script can provide, but the output
|
|
from `ansible-inventory` will always be the same,
|
|
thus the AWX logic to parse the content is simplified.
|
|
This is why even scripts must be ran through the `ansible-inventory` CLI.
|
|
|
|
Along with this switchover, a backported version of
|
|
`ansible-inventory` was provided that supported Ansible versions 2.2 and 2.3.
|
|
|
|
### Removal of Backport
|
|
|
|
In AWX 3.0.0 (and Tower 3.5), the backport of `ansible-inventory`
|
|
was removed, and support for using custom virtual environments was added.
|
|
This set the minimum version of Ansible necessary to run _any_
|
|
inventory update to 2.4.
|
|
|
|
## Inventory Plugin Versioning
|
|
|
|
Beginning in Ansible 2.5, inventory sources in Ansible started migrating
|
|
away from "contrib" scripts (meaning they lived in the contrib folder)
|
|
to the inventory plugin model.
|
|
|
|
In AWX 4.0.0 (and Tower 3.5) inventory source types start to switchover
|
|
to plugins, provided that sufficient compatibility is in place for
|
|
the version of Ansible present in the local virtualenv.
|
|
|
|
To see what version the plugin transition will happen, see
|
|
`awx/main/models/inventory.py` and look for the source name as a
|
|
subclass of `PluginFileInjector`, and there should be an `initial_version`
|
|
which is the first version that testing deemed to have sufficient parity
|
|
in the content its inventory plugin returns. For example, `openstack` will
|
|
begin using the inventory plugin in Ansible version 2.8.
|
|
If you run an openstack inventory update with Ansible
|
|
2.7.x or lower, it will use the script.
|
|
|
|
### Sunsetting the scripts
|
|
|
|
Eventually, it is intended that all source types will have moved to
|
|
plugins. For any given source, after the `initial_version` for plugin use
|
|
is higher than the lowest supported Ansible version, the script can be
|
|
removed and the logic for script credential injection will also be removed.
|
|
|
|
For example, after AWX no longer supports Ansible 2.7, the script
|
|
`awx/plugins/openstack_inventory.py` will be removed.
|
|
|
|
## Changes to Expect in Imports
|
|
|
|
An effort was made to keep imports working in the exact same way after
|
|
the switchover. However, the inventory plugins are a fundamental rewrite
|
|
and many elements of default behavior has changed. Because of that,
|
|
a `compatibility_mode` toggle was added. This defaults to True.
|
|
|
|
Turning off compatibility mode will be more future-proof.
|
|
Keeping it on, will be more stable and consistent.
|
|
|
|
### Changes with Compatibility Mode Off
|
|
|
|
The set of `hostvars` will be almost completely different, using new names
|
|
for data which is mostly the same content. You can see the jinja2 keyed_groups
|
|
construction used in compatibility mode to help get a sense of what
|
|
new names replace old names.
|
|
|
|
If you turn compatibility mode off or downgrade Ansible, you should
|
|
consider turning on `overwrite` and `overwrite_vars` to get rid of stale
|
|
variables (and potentially groups) no longer returned by the import.
|
|
|
|
In many cases, the host names will change. In all cases, accurate host
|
|
tracking will still be maintained via the host `instance_id`.
|
|
(after: https://github.com/ansible/awx/pull/3362)
|
|
|
|
Group names will be sanitized with compatibility mode turned off.
|
|
That means that characters such as "-" will
|
|
be replaced by underscores "\_". In some cases, this means that a large
|
|
fraction of groups get renamed as you move from scripts to plugins.
|
|
This will become the default Ansible behavior on the CLI eventually.
|
|
|
|
### Changes with Compatibility Mode On
|
|
|
|
Programatically-generated examples of inventory file syntax used in
|
|
updates (with dummy data) can be found in `awx/main/tests/data/inventory/scripts`,
|
|
these demonstrate the inventory file syntax used to restore old behavior
|
|
from the inventory scripts.
|
|
|
|
#### hostvar keys and values
|
|
|
|
More hostvars will appear if the inventory plugins are used with compatibility
|
|
mode on. To maintain backward compatibility,
|
|
the old names are added back where they have the same meaning as a
|
|
variable returned by the plugin. New names are not removed.
|
|
|
|
Some hostvars will be lost, because of general deprecation needs.
|
|
|
|
- ec2, see https://github.com/ansible/ansible/issues/52358
|
|
- gce (see https://github.com/ansible/ansible/issues/51884)
|
|
- `gce_uuid` this came from libcloud and isn't a true GCP field
|
|
inventory plugins have moved away from libcloud
|
|
|
|
The syntax of some hostvars, for some values, will change.
|
|
|
|
- ec2
|
|
- old: "ec2_block_devices": {"sda1": "vol-xxxxxx"}
|
|
- new: "ec2_block_devices": {"/dev/sda1": "vol-xxxxxx"}
|
|
|
|
#### Host names
|
|
|
|
Host names might change, but tracking host identity via `instance_id`
|
|
will still be reliable.
|
|
|
|
## How do I write my own Inventory File?
|
|
|
|
If you do not want any of this compatibility-related functionality, then
|
|
you can add an SCM inventory source that points to your own file.
|
|
You can also apply a credential of a `managed_by_tower` type to that inventory
|
|
source that matches the credential you are using, as long as that is
|
|
not `gce` or `openstack`.
|
|
|
|
All other sources provide _secrets_ via environment variables, so this
|
|
can be re-used without any problems for SCM-based inventory, and your
|
|
inventory file can be used securely to specify non-sensitive configuration
|
|
details such as the keyed_groups to provide, or hostvars to construct.
|
|
|
|
## Notes on Technical Implementation of Injectors
|
|
|
|
For an inventory source with a given value of the `source` field that is
|
|
of the built-in sources, a credential of the corresponding
|
|
credential type is required in most cases (exception being ec2 IAM roles).
|
|
This privileged credential is obtained by the method `get_cloud_credential`.
|
|
|
|
The `inputs` for this credential constitute one source of data for running
|
|
inventory updates. The following fields from the
|
|
`InventoryUpdate` model are also data sources, including:
|
|
|
|
- `source_vars`
|
|
- `source_regions`
|
|
- `instance_filters`
|
|
- `group_by`
|
|
|
|
The way these data are applied to the environment (including files and
|
|
environment vars) is highly dependent on the specific source.
|
|
|
|
With plugins, the inventory file may reference files that contain secrets
|
|
from the credential. With scripts, typically an environment variable
|
|
will reference a filename that contains a ConfigParser format file with
|
|
parameters for the update, and possibly including fields from the credential.
|
|
|
|
Caution: Please do not put secrets from the credential into the
|
|
inventory file for the plugin. Right now there appears to be no need to do
|
|
this, and by using environment variables to specify secrets, this keeps
|
|
open the possibility of showing the inventory file contents to the user
|
|
as a latter enhancement.
|
|
|
|
Logic for setup for inventory updates using both plugins and scripts live
|
|
inventory injector class, specific to the source type.
|
|
|
|
Any credentials which are not source-specific will use the generic
|
|
injection logic which is also used in playbook runs.
|