Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add more consistent extension matching for inventory plugins #46786

Merged
merged 2 commits into from
Oct 11, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions docs/docsite/rst/dev_guide/developing_inventory.rst
Original file line number Diff line number Diff line change
Expand Up @@ -102,11 +102,11 @@ This method is used by Ansible to make a quick determination if the inventory so
valid = False
if super(InventoryModule, self).verify_file(path):
# base class verifies that file exists and is readable by current user
if path.endswith(('.vbox.yaml', '.vbox.yml')):
if path.endswith(('virtualbox.yaml', 'virtualbox.yml', 'vbox.yaml', 'vbox.yml')):
valid = True
return valid

In this case, from the :ref:`virtualbox inventory plugin <virtualbox_inventory>`, we screen for specific file name patterns to avoid attempting to consume any valid yaml file. You can add any type of condition here, but the most common one is 'extension matching'
In this case, from the :ref:`virtualbox inventory plugin <virtualbox_inventory>`, we screen for specific file name patterns to avoid attempting to consume any valid yaml file. You can add any type of condition here, but the most common one is 'extension matching'. If you implement extension matching for YAML configuration files the path suffix <plugin_name>.<yml|yaml> should be accepted. All valid extensions should be documented in the plugin description.

Another example that actually does not use a 'file' but the inventory source string itself,
from the :ref:`host list <host_list_inventory>` plugin:
Expand Down
6 changes: 3 additions & 3 deletions lib/ansible/plugins/inventory/aws_ec2.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
- constructed
description:
- Get inventory hosts from Amazon Web Services EC2.
- Uses a <name>.aws_ec2.yaml (or <name>.aws_ec2.yml) YAML configuration file.
- Uses a YAML configuration file that ends with aws_ec2.(yml|yaml).
options:
plugin:
description: token that ensures this is a source file for the 'aws_ec2' plugin.
Expand Down Expand Up @@ -509,9 +509,9 @@ def verify_file(self, path):
:return the contents of the config file
'''
if super(InventoryModule, self).verify_file(path):
if path.endswith('.aws_ec2.yml') or path.endswith('.aws_ec2.yaml'):
if path.endswith(('aws_ec2.yml', 'aws_ec2.yaml')):
return True
display.debug("aws_ec2 inventory filename must end with '*.aws_ec2.yml' or '*.aws_ec2.yaml'")
display.debug("aws_ec2 inventory filename must end with 'aws_ec2.yml' or 'aws_ec2.yaml'")
return False

def _get_query_options(self, config_data):
Expand Down
4 changes: 2 additions & 2 deletions lib/ansible/plugins/inventory/aws_rds.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
short_description: rds instance source
description:
- Get instances and clusters from Amazon Web Services RDS.
- Uses a <name>.aws_rds.yaml (or <name>.aws_rds.yml) YAML configuration file.
- Uses a YAML configuration file that ends with aws_rds.(yml|yaml).
options:
boto_profile:
description: The boto profile to use. The plugin will look for an instance role if no credentials
Expand Down Expand Up @@ -301,7 +301,7 @@ def verify_file(self, path):
:return the contents of the config file
'''
if super(InventoryModule, self).verify_file(path):
if path.endswith('.aws_rds.yml') or path.endswith('.aws_rds.yaml'):
if path.endswith(('aws_rds.yml', 'aws_rds.yaml')):
return True
return False

Expand Down
6 changes: 3 additions & 3 deletions lib/ansible/plugins/inventory/azure_rm.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
- azure
description:
- Query VM details from Azure Resource Manager
- Requires a YAML configuration file whose name ends with '.azure_rm.yaml'
- Requires a YAML configuration file whose name ends with 'azure_rm.(yml|yaml)'
- By default, sets C(ansible_host) to the first public IP address found (preferring the primary NIC). If no
public IPs are found, the first private IP (also preferring the primary NIC). The default may be overridden
via C(hostvar_expressions); see examples.
Expand Down Expand Up @@ -216,9 +216,9 @@ def verify_file(self, path):
:return the contents of the config file
'''
if super(InventoryModule, self).verify_file(path):
if re.match(r'.+\.azure_rm\.y(a)?ml$', path):
if re.match(r'.{0,}azure_rm\.y(a)?ml$', path):
return True
# display.debug("azure_rm inventory filename must match '*.azure_rm.yml' or '*.azure_rm.yaml'")
# display.debug("azure_rm inventory filename must end with 'azure_rm.yml' or 'azure_rm.yaml'")
return False

def parse(self, inventory, loader, path, cache=True):
Expand Down
2 changes: 1 addition & 1 deletion lib/ansible/plugins/inventory/foreman.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ def verify_file(self, path):

valid = False
if super(InventoryModule, self).verify_file(path):
if path.endswith('.foreman.yaml') or path.endswith('.foreman.yml'):
if path.endswith(('foreman.yaml', 'foreman.yml')):
valid = True
return valid

Expand Down
9 changes: 4 additions & 5 deletions lib/ansible/plugins/inventory/gcp_compute.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
- inventory_cache
description:
- Get inventory hosts from Google Cloud Platform GCE.
- Uses a <name>.gcp.yaml (or <name>.gcp.yml) YAML configuration file.
- Uses a YAML configuration file that ends with gcp_compute.(yml|yaml) or gcp.(yml|yaml).
options:
plugin:
description: token that ensures this is a source file for the 'gcp_compute' plugin.
Expand Down Expand Up @@ -120,9 +120,9 @@ def verify_file(self, path):
:return the contents of the config file
'''
if super(InventoryModule, self).verify_file(path):
if path.endswith('.gcp.yml') or path.endswith('.gcp.yaml'):
if path.endswith(('gcp.yml', 'gcp.yaml')):
return True
elif path.endswith('.gcp_compute.yml') or path.endswith('.gcp_compute.yaml'):
elif path.endswith(('gcp_compute.yml', 'gcp_compute.yaml')):
return True
return False

Expand Down Expand Up @@ -317,8 +317,7 @@ def parse(self, inventory, loader, path, cache=True):
super(InventoryModule, self).parse(inventory, loader, path)

config_data = {}
if self.verify_file(path):
config_data = self._read_config_data(path)
config_data = self._read_config_data(path)

# get user specifications
if 'zones' in config_data:
Expand Down
4 changes: 2 additions & 2 deletions lib/ansible/plugins/inventory/linode.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
- linode_api4 >= 2.0.0
description:
- Reads inventories from the Linode API v4.
- Uses a C(<name>.linode.yaml) (or C(<name>.linode.yml)) YAML configuration file.
- Uses a YAML configuration file that ends with linode.(yml|yaml).
- Linode labels are used by default as the hostnames.
- The inventory groups are built from groups and not tags.
options:
Expand Down Expand Up @@ -186,7 +186,7 @@ def _get_query_options(self, config_data):
def verify_file(self, path):
"""Verify the Linode configuration file."""
if super(InventoryModule, self).verify_file(path):
endings = ('.linode.yaml', '.linode.yml')
endings = ('linode.yaml', 'linode.yml')
if any((path.endswith(ending) for ending in endings)):
return True
return False
Expand Down
4 changes: 2 additions & 2 deletions lib/ansible/plugins/inventory/tower.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
description:
- Reads inventories from Ansible Tower.
- Supports reading configuration from both YAML config file and environment variables.
- If reading from the YAML file, the file name must end with tower_inventory.(yml|yaml),
- If reading from the YAML file, the file name must end with tower.(yml|yaml) or tower_inventory.(yml|yaml),
the path in the command would be /path/to/tower_inventory.(yml|yaml). If some arguments in the config file
are missing, this plugin will try to fill in missing arguments by reading from environment variables.
- If reading configurations from environment variables, the path in the command must be @tower_inventory.
Expand Down Expand Up @@ -143,7 +143,7 @@ def verify_file(self, path):
self.no_config_file_supplied = True
return True
elif super(InventoryModule, self).verify_file(path):
return path.endswith('tower_inventory.yml') or path.endswith('tower_inventory.yaml')
return path.endswith(('tower_inventory.yml', 'tower_inventory.yaml', 'tower.yml', 'tower.yaml'))
else:
return False

Expand Down
4 changes: 2 additions & 2 deletions lib/ansible/plugins/inventory/virtualbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
short_description: virtualbox inventory source
description:
- Get inventory hosts from the local virtualbox installation.
- Uses a <name>.vbox.yaml (or .vbox.yml) YAML configuration file.
- Uses a YAML configuration file that ends with virtualbox.(yml|yaml) or vbox.(yml|yaml).
- The inventory_hostname is always the 'Name' of the virtualbox instance.
extends_documentation_fragment:
- constructed
Expand Down Expand Up @@ -210,7 +210,7 @@ def verify_file(self, path):

valid = False
if super(InventoryModule, self).verify_file(path):
if path.endswith(('.vbox.yaml', '.vbox.yml')):
if path.endswith(('virtualbox.yaml', 'virtualbox.yml', 'vbox.yaml', 'vbox.yml')):
valid = True
return valid

Expand Down