Merge "Add command to remove IPs from inventory"
This commit is contained in:
commit
143e01bfcd
@ -147,7 +147,13 @@ Inspecting and Managing the Inventory
|
|||||||
The file ``scripts/inventory-manage.py`` is used to produce human readable
|
The file ``scripts/inventory-manage.py`` is used to produce human readable
|
||||||
output based on the ``/etc/openstack_deploy/openstack_inventory.json`` file.
|
output based on the ``/etc/openstack_deploy/openstack_inventory.json`` file.
|
||||||
|
|
||||||
The same script can be used to safely remove hosts from the inventory.
|
The same script can be used to safely remove hosts from the inventory, export
|
||||||
|
the inventory based on hosts, and clear IP addresses from containers within
|
||||||
|
the inventory files.
|
||||||
|
|
||||||
|
Operations taken by this script only affect the
|
||||||
|
``/etc/opentstack_deploy/openstack_inventory.json`` file; any new or removed
|
||||||
|
information must be set by running playbooks.
|
||||||
|
|
||||||
Viewing the Inventory
|
Viewing the Inventory
|
||||||
^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
@ -184,6 +190,19 @@ This JSON output has two top-level keys: ``hosts`` and ``all``.
|
|||||||
``all`` contains global network information such as the load balancer IPs and
|
``all`` contains global network information such as the load balancer IPs and
|
||||||
provider network metadata.
|
provider network metadata.
|
||||||
|
|
||||||
|
Clearing Existing Container IP Addresses
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
The ``--clear-ips`` parameter can be used to remove all container IP address
|
||||||
|
information from the ``openstack_inventory.json`` file. Baremetal hosts will
|
||||||
|
not be changed.
|
||||||
|
|
||||||
|
This will *not* change the LXC configuration until the associated playbooks
|
||||||
|
are run and the containers restarted, which will result in API downtime.
|
||||||
|
|
||||||
|
Any changes to the containers must also be reflected in the deployment's load
|
||||||
|
balancer.
|
||||||
|
|
||||||
The lxc_hosts Group
|
The lxc_hosts Group
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
|
@ -120,6 +120,15 @@ def args():
|
|||||||
default=False
|
default=False
|
||||||
)
|
)
|
||||||
|
|
||||||
|
exclusive_action.add_argument(
|
||||||
|
'--clear-ips',
|
||||||
|
help=('Clears IPs from the existing inventory, but leaves ',
|
||||||
|
'all other information intact. LXC interface files and '
|
||||||
|
'load balancers will *not* be modified.'),
|
||||||
|
action='store_true',
|
||||||
|
default=False
|
||||||
|
)
|
||||||
|
|
||||||
return vars(parser.parse_args())
|
return vars(parser.parse_args())
|
||||||
|
|
||||||
|
|
||||||
@ -305,6 +314,25 @@ def export_host_info(inventory):
|
|||||||
return export_info
|
return export_info
|
||||||
|
|
||||||
|
|
||||||
|
def remove_ip_addresses(inventory):
|
||||||
|
"""Removes container IP address information from the inventory dictionary
|
||||||
|
|
||||||
|
All container_networks information for containers will be deleted.
|
||||||
|
"""
|
||||||
|
hostvars = inventory['_meta']['hostvars']
|
||||||
|
|
||||||
|
for host, variables in hostvars.items():
|
||||||
|
if variables.get('is_metal', False):
|
||||||
|
continue
|
||||||
|
|
||||||
|
ip_vars = ['container_networks', 'container_address',
|
||||||
|
'ansible_host', 'ansible_ssh_host']
|
||||||
|
|
||||||
|
# Don't raise a KeyError if the entries have already been removed.
|
||||||
|
for ip_var in ip_vars:
|
||||||
|
variables.pop(ip_var, None)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
"""Run the main application."""
|
"""Run the main application."""
|
||||||
# Parse user args
|
# Parse user args
|
||||||
@ -329,6 +357,11 @@ def main():
|
|||||||
print(print_containers_per_group(inventory))
|
print(print_containers_per_group(inventory))
|
||||||
elif user_args['export'] is True:
|
elif user_args['export'] is True:
|
||||||
print(json.dumps(export_host_info(inventory), indent=2))
|
print(json.dumps(export_host_info(inventory), indent=2))
|
||||||
|
elif user_args['clear_ips'] is True:
|
||||||
|
remove_ip_addresses(inventory)
|
||||||
|
with open(environment_file, 'wb') as f_handle:
|
||||||
|
f_handle.write(json.dumps(inventory, indent=2))
|
||||||
|
print('Success. . .')
|
||||||
else:
|
else:
|
||||||
recursive_dict_removal(inventory, user_args['remove_item'])
|
recursive_dict_removal(inventory, user_args['remove_item'])
|
||||||
with open(environment_file, 'wb') as f_handle:
|
with open(environment_file, 'wb') as f_handle:
|
||||||
|
@ -57,5 +57,48 @@ class TestExportFunction(unittest.TestCase):
|
|||||||
all_info['internal_lb_vip_address'])
|
all_info['internal_lb_vip_address'])
|
||||||
|
|
||||||
|
|
||||||
|
class TestRemoveIpfunction(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.inv = test_inventory.get_inventory()
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
test_inventory.cleanup()
|
||||||
|
|
||||||
|
def test_ips_removed(self):
|
||||||
|
mi.remove_ip_addresses(self.inv)
|
||||||
|
hostvars = self.inv['_meta']['hostvars']
|
||||||
|
|
||||||
|
for host, variables in hostvars.items():
|
||||||
|
has_networks = 'container_networks' in variables
|
||||||
|
if variables.get('is_metal', False):
|
||||||
|
continue
|
||||||
|
self.assertFalse(has_networks)
|
||||||
|
|
||||||
|
def test_metal_ips_kept(self):
|
||||||
|
mi.remove_ip_addresses(self.inv)
|
||||||
|
hostvars = self.inv['_meta']['hostvars']
|
||||||
|
|
||||||
|
for host, variables in hostvars.items():
|
||||||
|
has_networks = 'container_networks' in variables
|
||||||
|
if not variables.get('is_metal', False):
|
||||||
|
continue
|
||||||
|
self.assertTrue(has_networks)
|
||||||
|
|
||||||
|
def test_ansible_host_vars_removed(self):
|
||||||
|
mi.remove_ip_addresses(self.inv)
|
||||||
|
hostvars = self.inv['_meta']['hostvars']
|
||||||
|
|
||||||
|
for host, variables in hostvars.items():
|
||||||
|
has_host = 'ansible_host' in variables
|
||||||
|
if variables.get('is_metal', False):
|
||||||
|
continue
|
||||||
|
self.assertFalse(has_host)
|
||||||
|
|
||||||
|
def test_multiple_calls(self):
|
||||||
|
"""Removal should fail silently if keys are absent."""
|
||||||
|
mi.remove_ip_addresses(self.inv)
|
||||||
|
mi.remove_ip_addresses(self.inv)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user