metalsmith/metalsmith_ansible/ansible_plugins/modules/metalsmith_deployment_defaults.py
Steve Baker 22a4e4071c Add metalsmith_instances instance option config_drive
This has sub-options ``cloud_config` and ``meta_data`` and allows
customization of data packaged in the config-drive to be consumed by
cloud-init.

This is needed by TripleO to provide an equivalent to the current
heat/nova based firstboot customization support.

Change-Id: Ie384292a3310cb06e908dd9027e9300ca108e7dd
2020-11-11 09:15:24 +13:00

139 lines
4.4 KiB
Python

# Copyright 2020 Red Hat, Inc.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import os
from ansible.module_utils.basic import AnsibleModule
import yaml
DOCUMENTATION = '''
---
module: metalsmith_deployment_defaults
short_description: Transform instances list data for metalsmith_instances
author: "Steve Baker (@stevebaker)"
description:
- Takes a list of instances from the metalsmith_deployment role
and a dict of defaults and transforms that to the format required
by the metalsmith_instances module.
options:
instances:
description:
- List of node description dicts to perform operations on (in the
metalsmith_deployment instances format)
type: list
default: []
elements: dict
defaults:
description:
- Dict of defaults to use for missing values. Keys correspond to the
metalsmith_deployment instances format.
type: dict
'''
def transform(module, instances, defaults):
mi = []
def value(src, key, dest, to_key=None):
if not to_key:
to_key = key
value = src.get(key, defaults.get(key))
if value:
dest[to_key] = value
for src in instances:
dest = {'image': {}}
value(src, 'hostname', dest)
value(src, 'candidates', dest)
value(src, 'nics', dest)
value(src, 'netboot', dest)
value(src, 'root_size', dest, 'root_size_gb')
value(src, 'swap_size', dest, 'swap_size_mb')
value(src, 'capabilities', dest)
value(src, 'traits', dest)
value(src, 'resource_class', dest)
value(src, 'conductor_group', dest)
value(src, 'user_name', dest)
image = dest['image']
value(src, 'image', image, 'href')
value(src, 'image_checksum', image, 'checksum')
value(src, 'image_kernel', image, 'kernel')
value(src, 'image_ramdisk', image, 'ramdisk')
value(src, 'config_drive', dest)
# keys in metalsmith_instances not currently in metalsmith_deployment:
# passwordless_sudo
# keys in metalsmith_deployment not currently in metalsmith_instances:
# extra_args (CLI args cannot translate to the python lib,
# but they are mainly for auth and output formatting apart
# from --dry-run)
if 'extra_args' in src:
module.fail_json(
changed=False,
msg="extra_args is no longer supported"
)
# state (metalsmith_instances has a single state attribute for every
# instance)
if 'state' in src:
module.fail_json(
changed=False,
msg="Per-instance state is no longer supported, "
"use variable metalsmith_state"
)
# source keys could be a string or a list of strings
# and the strings could be a path to a public key or the key contents.
# Normalize this to a list of key contents
keys = []
source_keys = src.get('ssh_public_keys')
if source_keys:
if isinstance(source_keys, str):
source_keys = [source_keys]
for source_key in source_keys:
if os.path.isfile(source_key):
with open(source_key) as f:
source_key = f.read()
keys.append(source_key)
if keys:
dest['ssh_public_keys'] = keys
mi.append(dest)
module.exit_json(
changed=False,
msg="{} instances transformed".format(len(mi)),
instances=mi
)
return mi
def main():
module = AnsibleModule(
argument_spec=yaml.safe_load(DOCUMENTATION)['options'],
supports_check_mode=False,
)
instances = module.params['instances']
defaults = module.params['defaults']
transform(module, instances, defaults)
if __name__ == '__main__':
main()