mirror of
https://github.com/ansible-collections/community.docker.git
synced 2026-07-29 11:55:04 +00:00
Add inventory filter capability (#698)
* Add inventory filter capability. * Use community.library_inventory_filtering_v1 collection. * Bump dependency to 1.0.0. * Mention the new dependency in the changelog.
This commit is contained in:
@@ -21,6 +21,7 @@ author:
|
||||
extends_documentation_fragment:
|
||||
- ansible.builtin.constructed
|
||||
- community.docker.docker.api_documentation
|
||||
- community.library_inventory_filtering_v1.inventory_filter
|
||||
description:
|
||||
- Reads inventories from the Docker API.
|
||||
- Uses a YAML configuration file that ends with C(docker.[yml|yaml]).
|
||||
@@ -101,6 +102,9 @@ options:
|
||||
See the examples for how to do that.
|
||||
type: bool
|
||||
default: false
|
||||
|
||||
filters:
|
||||
version_added: 3.5.0
|
||||
'''
|
||||
|
||||
EXAMPLES = '''
|
||||
@@ -144,6 +148,18 @@ connection_type: ssh
|
||||
compose:
|
||||
ansible_ssh_host: ansible_ssh_host | default(docker_name[1:], true)
|
||||
ansible_ssh_port: ansible_ssh_port | default(22, true)
|
||||
|
||||
# Only consider containers which have a label 'foo', or whose name starts with 'a'
|
||||
plugin: community.docker.docker_containers
|
||||
filters:
|
||||
# Accept all containers which have a label called 'foo'
|
||||
- include: >-
|
||||
"foo" in docker_config.Labels
|
||||
# Next accept all containers whose inventory_hostname starts with 'a'
|
||||
- include: >-
|
||||
inventory_hostname.startswith("a")
|
||||
# Exclude all containers that didn't match any of the above filters
|
||||
- exclude: true
|
||||
'''
|
||||
|
||||
import re
|
||||
@@ -163,6 +179,7 @@ from ansible_collections.community.docker.plugins.plugin_utils.common_api import
|
||||
)
|
||||
|
||||
from ansible_collections.community.docker.plugins.module_utils._api.errors import APIError, DockerException
|
||||
from ansible_collections.community.library_inventory_filtering_v1.plugins.plugin_utils.inventory_filter import parse_filters, filter_host
|
||||
|
||||
MIN_DOCKER_API = None
|
||||
|
||||
@@ -209,6 +226,7 @@ class InventoryModule(BaseInventoryPlugin, Constructable):
|
||||
if value is not None:
|
||||
extra_facts[var_name] = value
|
||||
|
||||
filters = parse_filters(self.get_option('filters'))
|
||||
for container in containers:
|
||||
id = container.get('Id')
|
||||
short_id = id[:13]
|
||||
@@ -220,7 +238,6 @@ class InventoryModule(BaseInventoryPlugin, Constructable):
|
||||
name = short_id
|
||||
full_name = id
|
||||
|
||||
self.inventory.add_host(name)
|
||||
facts = dict(
|
||||
docker_name=name,
|
||||
docker_short_id=short_id
|
||||
@@ -238,25 +255,24 @@ class InventoryModule(BaseInventoryPlugin, Constructable):
|
||||
|
||||
running = state.get('Running')
|
||||
|
||||
groups = []
|
||||
|
||||
# Add container to groups
|
||||
image_name = config.get('Image')
|
||||
if image_name and add_legacy_groups:
|
||||
self.inventory.add_group('image_{0}'.format(image_name))
|
||||
self.inventory.add_host(name, group='image_{0}'.format(image_name))
|
||||
groups.append('image_{0}'.format(image_name))
|
||||
|
||||
stack_name = labels.get('com.docker.stack.namespace')
|
||||
if stack_name:
|
||||
full_facts['docker_stack'] = stack_name
|
||||
if add_legacy_groups:
|
||||
self.inventory.add_group('stack_{0}'.format(stack_name))
|
||||
self.inventory.add_host(name, group='stack_{0}'.format(stack_name))
|
||||
groups.append('stack_{0}'.format(stack_name))
|
||||
|
||||
service_name = labels.get('com.docker.swarm.service.name')
|
||||
if service_name:
|
||||
full_facts['docker_service'] = service_name
|
||||
if add_legacy_groups:
|
||||
self.inventory.add_group('service_{0}'.format(service_name))
|
||||
self.inventory.add_host(name, group='service_{0}'.format(service_name))
|
||||
groups.append('service_{0}'.format(service_name))
|
||||
|
||||
if connection_type == 'ssh':
|
||||
# Figure out ssh IP and Port
|
||||
@@ -294,9 +310,17 @@ class InventoryModule(BaseInventoryPlugin, Constructable):
|
||||
fact_key = self._slugify(key)
|
||||
full_facts[fact_key] = value
|
||||
|
||||
if not filter_host(self, name, full_facts, filters):
|
||||
continue
|
||||
|
||||
if verbose_output:
|
||||
facts.update(full_facts)
|
||||
|
||||
self.inventory.add_host(name)
|
||||
for group in groups:
|
||||
self.inventory.add_group(group)
|
||||
self.inventory.add_host(name, group=group)
|
||||
|
||||
for key, value in facts.items():
|
||||
self.inventory.set_variable(name, key, value)
|
||||
|
||||
|
||||
@@ -13,7 +13,8 @@ DOCUMENTATION = '''
|
||||
requirements:
|
||||
- L(Docker Machine,https://docs.docker.com/machine/)
|
||||
extends_documentation_fragment:
|
||||
- constructed
|
||||
- ansible.builtin.constructed
|
||||
- community.library_inventory_filtering_v1.inventory_filter
|
||||
description:
|
||||
- Get inventory hosts from Docker Machine.
|
||||
- Uses a YAML configuration file that ends with docker_machine.(yml|yaml).
|
||||
@@ -53,6 +54,8 @@ DOCUMENTATION = '''
|
||||
named C(docker_machine_node_attributes).
|
||||
type: bool
|
||||
default: true
|
||||
filters:
|
||||
version_added: 3.5.0
|
||||
'''
|
||||
|
||||
EXAMPLES = '''
|
||||
@@ -94,6 +97,8 @@ from ansible.module_utils.common.process import get_bin_path
|
||||
from ansible.plugins.inventory import BaseInventoryPlugin, Constructable, Cacheable
|
||||
from ansible.utils.display import Display
|
||||
|
||||
from ansible_collections.community.library_inventory_filtering_v1.plugins.plugin_utils.inventory_filter import parse_filters, filter_host
|
||||
|
||||
import json
|
||||
import re
|
||||
import subprocess
|
||||
@@ -201,6 +206,7 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
|
||||
|
||||
def _populate(self):
|
||||
daemon_env = self.get_option('daemon_env')
|
||||
filters = parse_filters(self.get_option('filters'))
|
||||
try:
|
||||
for self.node in self._get_machine_names():
|
||||
self.node_attrs = self._inspect_docker_machine_host(self.node)
|
||||
@@ -208,6 +214,8 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
|
||||
continue
|
||||
|
||||
machine_name = self.node_attrs['Driver']['MachineName']
|
||||
if not filter_host(self, machine_name, self.node_attrs, filters):
|
||||
continue
|
||||
|
||||
# query `docker-machine env` to obtain remote Docker daemon connection settings in the form of commands
|
||||
# that could be used to set environment variables to influence a local Docker client:
|
||||
|
||||
@@ -17,7 +17,8 @@ DOCUMENTATION = '''
|
||||
- python >= 2.7
|
||||
- L(Docker SDK for Python,https://docker-py.readthedocs.io/en/stable/) >= 1.10.0
|
||||
extends_documentation_fragment:
|
||||
- constructed
|
||||
- ansible.builtin.constructed
|
||||
- community.library_inventory_filtering_v1.inventory_filter
|
||||
description:
|
||||
- Reads inventories from the Docker swarm API.
|
||||
- Uses a YAML configuration file docker_swarm.[yml|yaml].
|
||||
@@ -108,6 +109,8 @@ DOCUMENTATION = '''
|
||||
include_host_uri_port:
|
||||
description: Override the detected port number included in C(ansible_host_uri).
|
||||
type: int
|
||||
filters:
|
||||
version_added: 3.5.0
|
||||
'''
|
||||
|
||||
EXAMPLES = '''
|
||||
@@ -157,6 +160,8 @@ from ansible_collections.community.docker.plugins.module_utils.util import updat
|
||||
from ansible.plugins.inventory import BaseInventoryPlugin, Constructable
|
||||
from ansible.parsing.utils.addresses import parse_address
|
||||
|
||||
from ansible_collections.community.library_inventory_filtering_v1.plugins.plugin_utils.inventory_filter import parse_filters, filter_host
|
||||
|
||||
try:
|
||||
import docker
|
||||
HAS_DOCKER = True
|
||||
@@ -196,6 +201,8 @@ class InventoryModule(BaseInventoryPlugin, Constructable):
|
||||
self.inventory.add_group('leader')
|
||||
self.inventory.add_group('nonleaders')
|
||||
|
||||
filters = parse_filters(self.get_option('filters'))
|
||||
|
||||
if self.get_option('include_host_uri'):
|
||||
if self.get_option('include_host_uri_port'):
|
||||
host_uri_port = str(self.get_option('include_host_uri_port'))
|
||||
@@ -208,6 +215,8 @@ class InventoryModule(BaseInventoryPlugin, Constructable):
|
||||
self.nodes = self.client.nodes.list()
|
||||
for self.node in self.nodes:
|
||||
self.node_attrs = self.client.nodes.get(self.node.id).attrs
|
||||
if not filter_host(self, self.node_attrs['ID'], self.node_attrs, filters):
|
||||
continue
|
||||
self.inventory.add_host(self.node_attrs['ID'])
|
||||
self.inventory.add_host(self.node_attrs['ID'], group=self.node_attrs['Spec']['Role'])
|
||||
self.inventory.set_variable(self.node_attrs['ID'], 'ansible_host',
|
||||
|
||||
Reference in New Issue
Block a user