From 718c13bdf2447d22a961c9023c8b73f98dd7b5f4 Mon Sep 17 00:00:00 2001 From: Monty Taylor Date: Thu, 28 May 2015 16:14:20 -0400 Subject: [PATCH 1/3] Add OpenStack Client Config module All of the ansible OpenStack modules are driven by a clouds.yaml config file which is processed by os-client-config. Expose the data returned by that library to enable playbooks to iterate over available clouds. --- cloud/openstack/os_client_config.py | 70 +++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 cloud/openstack/os_client_config.py diff --git a/cloud/openstack/os_client_config.py b/cloud/openstack/os_client_config.py new file mode 100644 index 00000000000..9ee7d3ef394 --- /dev/null +++ b/cloud/openstack/os_client_config.py @@ -0,0 +1,70 @@ +#!/usr/bin/python + +# Copyright (c) 2015 Hewlett-Packard Development Company, L.P. +# +# This module is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This software is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this software. If not, see . + +import os_client_config +from os_client_config import exceptions + +DOCUMENTATION = ''' +--- +module: os_client_config +short_description: Get OpenStack Client config +description: + - Get I(openstack) client config data from clouds.yaml or environment +options: + regions: + description: + - Include regions in the returned data + required: false + default: 'yes' +version_added: "2.0" +requirements: [ os-client-config ] +author: Monty Taylor +''' + +EXAMPLES = ''' +# Inject facts about OpenStack clouds +- os-client-config +''' + + +def main(): + module = AnsibleModule( + argument_spec=dict( + regions = dict(default=True, required=False, type='bool'), + action = dict(default='list', choices=['list']), + ), + ) + p = module.params + + try: + config = os_client_config.OpenStackConfig() + clouds = {} + for cloud in config.get_all_clouds(): + if p['regions']: + cloud_region = clouds.get(cloud.name, {}) + cloud_region[cloud.region] = cloud.config + clouds[cloud.name] = cloud_region + else: + clouds[cloud.name] = cloud.config + module.exit_json(clouds=clouds) + except exceptions.OpenStackConfigException as e: + module.fail_json(msg=str(e)) + +# import module snippets +from ansible.module_utils.basic import * + +main() From ce556a053edab5d9a51d73a9054b9396e48e87e2 Mon Sep 17 00:00:00 2001 From: Monty Taylor Date: Mon, 1 Jun 2015 11:01:17 -0500 Subject: [PATCH 2/3] Return a list of OpenStack clouds The main use of this is to feed jinja templating, so structure the data returned slightly better for that purpose. --- cloud/openstack/os_client_config.py | 31 +++++++++-------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/cloud/openstack/os_client_config.py b/cloud/openstack/os_client_config.py index 9ee7d3ef394..09a9e713210 100644 --- a/cloud/openstack/os_client_config.py +++ b/cloud/openstack/os_client_config.py @@ -24,43 +24,30 @@ module: os_client_config short_description: Get OpenStack Client config description: - Get I(openstack) client config data from clouds.yaml or environment -options: - regions: - description: - - Include regions in the returned data - required: false - default: 'yes' version_added: "2.0" requirements: [ os-client-config ] author: Monty Taylor ''' EXAMPLES = ''' -# Inject facts about OpenStack clouds -- os-client-config +# Get list of clouds that do not support security groups +- os-client-config: +- debug: var={{ item }} + with_items: "{{ openstack.clouds|rejectattr('secgroup_source', 'none')|list() }}" ''' def main(): - module = AnsibleModule( - argument_spec=dict( - regions = dict(default=True, required=False, type='bool'), - action = dict(default='list', choices=['list']), - ), - ) + module = AnsibleModule() p = module.params try: config = os_client_config.OpenStackConfig() - clouds = {} + clouds = [] for cloud in config.get_all_clouds(): - if p['regions']: - cloud_region = clouds.get(cloud.name, {}) - cloud_region[cloud.region] = cloud.config - clouds[cloud.name] = cloud_region - else: - clouds[cloud.name] = cloud.config - module.exit_json(clouds=clouds) + cloud.config['name'] = cloud.name + clouds.append(cloud.config) + module.exit_json(ansible_facts=dict(openstack=dict(clouds=clouds))) except exceptions.OpenStackConfigException as e: module.fail_json(msg=str(e)) From 9e56b42574fbfe02258569bc496d484e02fc9a74 Mon Sep 17 00:00:00 2001 From: Monty Taylor Date: Thu, 4 Jun 2015 11:42:39 -0400 Subject: [PATCH 3/3] AnsibleModule takes a dict as a param --- cloud/openstack/os_client_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloud/openstack/os_client_config.py b/cloud/openstack/os_client_config.py index 09a9e713210..281bad49621 100644 --- a/cloud/openstack/os_client_config.py +++ b/cloud/openstack/os_client_config.py @@ -38,7 +38,7 @@ EXAMPLES = ''' def main(): - module = AnsibleModule() + module = AnsibleModule({}) p = module.params try: