cars/v1/x_pack/base/config.py (77 lines of code) (raw):

# Licensed to Elasticsearch B.V. under one or more contributor # license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright # ownership. Elasticsearch B.V. licenses this file to you 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 logging import os import tempfile from esrally.utils import process, io from esrally import exceptions LOGGER_NAME="rally.provisioner.security" # Used for automatically create a certificate for the current Rally node. instances_yml_template = """ instances: - name: "{node_name}" ip: - "{node_ip}" """ def resolve_binary(install_root, binary_name): return os.path.join(install_root, "bin", binary_name) def install_certificates(config_names, variables, **kwargs): if "x-pack-security" not in config_names: return False logger = logging.getLogger(LOGGER_NAME) cert_binary = "elasticsearch-certutil" node_name = variables["node_name"] node_ip = variables["node_ip"] install_root = variables["install_root_path"] bundled_ca_path = os.path.join(os.path.dirname(__file__), "ca") x_pack_config_path = os.path.join(install_root, "config", "x-pack") logger.info("Installing certificates for node [%s].", node_name) instances_yml = os.path.join(tempfile.mkdtemp(), "instances.yml") with open(instances_yml, "w") as f: f.write(instances_yml_template.format(node_name=node_name, node_ip=node_ip)) # Generate instance certificates based on a CA that is pre-bundled with Rally certutil = resolve_binary(install_root, cert_binary) cert_bundle = os.path.join(install_root, "node-cert.zip") return_code = process.run_subprocess_with_logging( '{certutil} cert --silent --in "{instances_yml}" --out="{cert_bundle}" --ca-cert="{ca_path}/ca.crt" ' '--ca-key="{ca_path}/ca.key" --pass ""'.format( certutil=certutil, ca_path=bundled_ca_path, instances_yml=instances_yml, cert_bundle=cert_bundle), env=kwargs.get("env")) if return_code != 0: logger.error("%s has exited with code [%d]", cert_binary, return_code) raise exceptions.SystemSetupError( "Could not create certificate bundle for node [{}]. Please see the log for details.".format(node_name)) io.decompress(cert_bundle, x_pack_config_path) # Success return True def add_rally_user(config_names, variables, **kwargs): if "x-pack-security" not in config_names: return False logger = logging.getLogger(LOGGER_NAME) users_binary = "elasticsearch-users" user_name = variables.get("xpack_security_user_name", "rally") user_password = variables.get("xpack_security_user_password", "rally-password") user_role = variables.get("xpack_security_user_role", "superuser") install_root = variables["install_root_path"] logger.info("Adding user '%s'.",user_name) users = resolve_binary(install_root, users_binary) return_code = process.run_subprocess_with_logging( '{users} useradd {user_name} -p "{user_password}"'.format( users=users, user_name=user_name, user_password=user_password ), env=kwargs.get("env")) if return_code != 0: logger.error("%s has exited with code [%d]", users_binary, return_code) raise exceptions.SystemSetupError("Could not add user '{}'. Please see the log for details.".format(user_name)) return_code = process.run_subprocess_with_logging( '{users} roles {user_name} -a {user_role}'.format( users=users, user_name=user_name, user_role=user_role ), env=kwargs.get("env")) if return_code != 0: logger.error("%s has exited with code [%d]", users_binary, return_code) raise exceptions.SystemSetupError( "Could not add role '{user_role}' for user '{user_name}'. Please see the log for details.".format( user_role=user_role, user_name=user_name )) return True def register(registry): registry.register("post_install", install_certificates) registry.register("post_install", add_rally_user)