Add "AllNodes" ExtraConfig interface

Adds hook to enable additional "AllNodes" config to be performed prior
to applying puppet - this is useful when you need to build
configuration data which requires knowledge of all nodes in a cluster,
or of the entire deployment.

As an example, there is a sample config template which collects the
hostname and mac addresses for all nodes in the deployment then writes
the data to all Controller nodes.  Something similar to this may be
required to enable creation of the nexus_config in
https://review.openstack.org/#/c/198754/

There's also another, simpler, example which shows how you could share
the output of an OS::Heat::RandomString between nodes.

Change-Id: I8342a238f50142d8c7426f2b96f4ef1635775509
This commit is contained in:
Steven Hardy 2015-08-19 19:06:46 +01:00
parent 6d0cec55ce
commit 196e6f3ff6
6 changed files with 244 additions and 6 deletions

View File

@ -0,0 +1,27 @@
heat_template_version: 2014-10-16
description: >
Noop extra config for allnodes extra cluster config
# Parameters passed from the parent template - note if you maintain
# out-of-tree templates they may require additional parameters if the
# in-tree templates add a new role.
parameters:
controller_servers:
type: json
compute_servers:
type: json
blockstorage_servers:
type: json
objectstorage_servers:
type: json
cephstorage_servers:
type: json
# Note extra parameters can be defined, then passed data via the
# environment parameter_defaults, without modifying the parent template
outputs:
# This value should change if the configuration data has changed
# It is used to e.g re-apply puppet after hieradata values change.
config_identifier:
value: none

View File

@ -0,0 +1,116 @@
heat_template_version: 2014-10-16
description: >
Example extra config for cluster config
this example collects the hostname and MAC addresses for each node in
the deployment, then distributes that info to all Controller nodes.
# Parameters passed from the parent template - note if you maintain
# out-of-tree templates they may require additional parameters if the
# in-tree templates add a new role.
parameters:
controller_servers:
type: json
compute_servers:
type: json
blockstorage_servers:
type: json
objectstorage_servers:
type: json
cephstorage_servers:
type: json
# Note extra parameters can be defined, then passed data via the
# environment parameter_defaults, without modifying the parent template
resources:
CollectMacConfig:
type: OS::Heat::SoftwareConfig
properties:
group: script
config: |
#!/bin/sh
MACS=$(ifconfig | grep ether | awk '{print $2}' | tr "\n" " ")
HOSTNAME=$(hostname -s)
echo "$HOSTNAME $MACS"
# FIXME(shardy): Long term it'd be better if Heat SoftwareDeployments accepted
# list instead of a map, then we could join the lists of servers into one
# deployment instead of requiring one deployment per-role.
CollectMacDeploymentsController:
type: OS::Heat::SoftwareDeployments
properties:
servers: {get_param: controller_servers}
config: {get_resource: CollectMacConfig}
actions: ['CREATE'] # Only do this on CREATE
CollectMacDeploymentsCompute:
type: OS::Heat::SoftwareDeployments
properties:
servers: {get_param: compute_servers}
config: {get_resource: CollectMacConfig}
actions: ['CREATE'] # Only do this on CREATE
CollectMacDeploymentsBlockStorage:
type: OS::Heat::SoftwareDeployments
properties:
servers: {get_param: blockstorage_servers}
config: {get_resource: CollectMacConfig}
actions: ['CREATE'] # Only do this on CREATE
CollectMacDeploymentsObjectStorage:
type: OS::Heat::SoftwareDeployments
properties:
servers: {get_param: objectstorage_servers}
config: {get_resource: CollectMacConfig}
actions: ['CREATE'] # Only do this on CREATE
CollectMacDeploymentsCephStorage:
type: OS::Heat::SoftwareDeployments
properties:
servers: {get_param: cephstorage_servers}
config: {get_resource: CollectMacConfig}
actions: ['CREATE'] # Only do this on CREATE
# Now we distribute all-the-macs to all nodes
DistributeMacConfig:
type: OS::Heat::SoftwareConfig
properties:
group: script
inputs:
- name: controller_mappings
- name: compute_mappings
- name: blockstorage_mappings
- name: objectstorage_mappings
- name: cephstorage_mappings
config: |
#!/bin/sh
echo $controller_mappings > /root/controller_mappings
echo $compute_mappings > /root/compute_mappings
echo $blockstorage_mappings > /root/blockstorage_mappings
echo $objectstorage_mappings > /root/objectstorage_mappings
echo $cephstorage_mappings > /root/cephstorage_mappings
echo "mappings = $(cat /root/*_mappings)"
DistributeMacDeploymentsController:
type: OS::Heat::SoftwareDeployments
properties:
servers: {get_param: controller_servers}
config: {get_resource: DistributeMacConfig}
input_values:
# FIXME(shardy): It'd be more convenient if we could join these
# items together but because the returned format is a map (not a list)
# we can't use list_join or str_replace. Possible Heat TODO.
controller_mappings: {get_attr: [CollectMacDeploymentsController, deploy_stdouts]}
compute_mappings: {get_attr: [CollectMacDeploymentsCompute, deploy_stdouts]}
blockstorage_mappings: {get_attr: [CollectMacDeploymentsBlockStorage, deploy_stdouts]}
objectstorage_mappings: {get_attr: [CollectMacDeploymentsObjectStorage, deploy_stdouts]}
cephstorage_mappings: {get_attr: [CollectMacDeploymentsCephStorage, deploy_stdouts]}
actions: ['CREATE'] # Only do this on CREATE
outputs:
# This value should change if the configuration data has changed
# It is used to e.g re-apply puppet after hieradata values change.
config_identifier:
value: {get_attr: [DistributeMacDeploymentsController, deploy_stdouts]}

View File

@ -0,0 +1,63 @@
heat_template_version: 2014-10-16
description: >
Example extra config for cluster config
this example deploys a random string to all controller and compute
nodes, showing how data may be shared amongst nodes, vs the
other ExtraConfig interfaces which act only on individual nodes.
# Parameters passed from the parent template - note if you maintain
# out-of-tree templates they may require additional parameters if the
# in-tree templates add a new role.
parameters:
controller_servers:
type: json
compute_servers:
type: json
blockstorage_servers:
type: json
objectstorage_servers:
type: json
cephstorage_servers:
type: json
# Note extra parameters can be defined, then passed data via the
# environment parameter_defaults, without modifying the parent template
resources:
Random:
type: OS::Heat::RandomString
RandomConfig:
type: OS::Heat::SoftwareConfig
properties:
group: script
inputs:
- name: random_value
config: |
#!/bin/sh
echo $random_value > /root/random_value
RandomDeploymentsController:
type: OS::Heat::SoftwareDeployments
properties:
servers: {get_param: controller_servers}
config: {get_resource: RandomConfig}
actions: ['CREATE'] # Only do this on CREATE
input_values:
random_value: {get_attr: [Random, value]}
RandomDeploymentsCompute:
type: OS::Heat::SoftwareDeployments
properties:
servers: {get_param: compute_servers}
config: {get_resource: RandomConfig}
actions: ['CREATE'] # Only do this on CREATE
input_values:
random_value: {get_attr: [Random, value]}
outputs:
# This value should change if the configuration data has changed
# It is used to e.g re-apply puppet after hieradata values change.
config_identifier:
value: {get_attr: [Random, value]}

View File

@ -36,6 +36,12 @@ resource_registry:
OS::TripleO::ComputeExtraConfigPre: puppet/extraconfig/pre_deploy/default.yaml
OS::TripleO::NodeExtraConfigPost: extraconfig/post_deploy/default.yaml
# "AllNodes" Extra cluster config, runs on all nodes prior to the post_deploy
# phase, e.g when puppet is applied, but after the pre_deploy phase. Useful when
# configuration with knowledge of all nodes in the cluster is required vs single
# node configuration in the pre_deploy step.
OS::TripleO::AllNodesExtraConfig: extraconfig/all_nodes/default.yaml
# TripleO overcloud networks
OS::TripleO::Network: network/networks.yaml
OS::TripleO::VipConfig: puppet/vip-config.yaml

View File

@ -23,6 +23,12 @@ resource_registry:
OS::TripleO::NodeExtraConfigPost: extraconfig/post_deploy/default.yaml
OS::TripleO::Tasks::PackageUpdate: extraconfig/tasks/yum_update.yaml
# "AllNodes" Extra cluster config, runs on all nodes prior to the post_deploy
# phase, e.g when puppet is applied, but after the pre_deploy phase. Useful when
# configuration with knowledge of all nodes in the cluster is required vs single
# node configuration in the pre_deploy step.
OS::TripleO::AllNodesExtraConfig: extraconfig/all_nodes/default.yaml
# TripleO overcloud networks
OS::TripleO::Network: network/networks.yaml
OS::TripleO::VipConfig: vip-config.yaml

View File

@ -1301,42 +1301,62 @@ resources:
config: {get_resource: AllNodesValidationConfig}
servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
# Optional ExtraConfig for all nodes - all roles are passed in here, but
# the nested template may configure each role differently (or not at all)
AllNodesExtraConfig:
type: OS::TripleO::AllNodesExtraConfig
properties:
controller_servers: {get_attr: [Controller, attributes, nova_server_resource]}
compute_servers: {get_attr: [Compute, attributes, nova_server_resource]}
blockstorage_servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
objectstorage_servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
cephstorage_servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
# Nested stack deployment runs after all other controller deployments
ControllerNodesPostDeployment:
type: OS::TripleO::ControllerPostDeployment
depends_on: [ControllerBootstrapNodeDeployment, ControllerAllNodesDeployment, ControllerSwiftDeployment, ControllerCephDeployment]
properties:
servers: {get_attr: [Controller, attributes, nova_server_resource]}
NodeConfigIdentifiers: {get_attr: [Controller, attributes, config_identifier]}
NodeConfigIdentifiers:
allnodes_extra: {get_attr: [AllNodesExtraConfig, config_identifier]}
controller_config: {get_attr: [Controller, attributes, config_identifier]}
ComputeNodesPostDeployment:
type: OS::TripleO::ComputePostDeployment
depends_on: [ComputeAllNodesDeployment, ComputeCephDeployment]
properties:
servers: {get_attr: [Compute, attributes, nova_server_resource]}
NodeConfigIdentifiers: {get_attr: [Compute, attributes, config_identifier]}
NodeConfigIdentifiers:
allnodes_extra: {get_attr: [AllNodesExtraConfig, config_identifier]}
compute_config: {get_attr: [Compute, attributes, config_identifier]}
ObjectStorageNodesPostDeployment:
type: OS::TripleO::ObjectStoragePostDeployment
depends_on: [ObjectStorageSwiftDeployment, ObjectStorageAllNodesDeployment]
properties:
servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
NodeConfigIdentifiers: {get_attr: [ObjectStorage, attributes, config_identifier]}
NodeConfigIdentifiers:
allnodes_extra: {get_attr: [AllNodesExtraConfig, config_identifier]}
objectstorage_config: {get_attr: [ObjectStorage, attributes, config_identifier]}
BlockStorageNodesPostDeployment:
type: OS::TripleO::BlockStoragePostDeployment
depends_on: [ControllerNodesPostDeployment, BlockStorageAllNodesDeployment]
properties:
servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
NodeConfigIdentifiers: {get_attr: [BlockStorage, attributes, config_identifier]}
NodeConfigIdentifiers:
allnodes_extra: {get_attr: [AllNodesExtraConfig, config_identifier]}
blockstorage_config: {get_attr: [BlockStorage, attributes, config_identifier]}
CephStorageNodesPostDeployment:
type: OS::TripleO::CephStoragePostDeployment
depends_on: [ControllerNodesPostDeployment, CephStorageCephDeployment, CephStorageAllNodesDeployment]
properties:
servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
NodeConfigIdentifiers: {get_attr: [CephStorage, attributes, config_identifier]}
NodeConfigIdentifiers:
allnodes_extra: {get_attr: [AllNodesExtraConfig, config_identifier]}
cephstorage_config: {get_attr: [CephStorage, attributes, config_identifier]}
outputs:
KeystoneURL: