aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Hardy <shardy@redhat.com>2015-08-19 19:06:46 +0100
committerSteven Hardy <shardy@redhat.com>2015-09-17 15:50:35 +0100
commit196e6f3ff6cb9d261d8c8f872d43deb129b1a2e8 (patch)
treebd39ed21ca4ba9646334fa96d93a8e5a8a45fdda
parent6d0cec55ce50a54ede405c465f26fe87bb68af4e (diff)
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
-rw-r--r--extraconfig/all_nodes/default.yaml27
-rw-r--r--extraconfig/all_nodes/mac_hostname.yaml116
-rw-r--r--extraconfig/all_nodes/random_string.yaml63
-rw-r--r--overcloud-resource-registry-puppet.yaml6
-rw-r--r--overcloud-resource-registry.yaml6
-rw-r--r--overcloud-without-mergepy.yaml32
6 files changed, 244 insertions, 6 deletions
diff --git a/extraconfig/all_nodes/default.yaml b/extraconfig/all_nodes/default.yaml
new file mode 100644
index 00000000..68f9eadd
--- /dev/null
+++ b/extraconfig/all_nodes/default.yaml
@@ -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
diff --git a/extraconfig/all_nodes/mac_hostname.yaml b/extraconfig/all_nodes/mac_hostname.yaml
new file mode 100644
index 00000000..739cbf0a
--- /dev/null
+++ b/extraconfig/all_nodes/mac_hostname.yaml
@@ -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]}
+
diff --git a/extraconfig/all_nodes/random_string.yaml b/extraconfig/all_nodes/random_string.yaml
new file mode 100644
index 00000000..b4b30274
--- /dev/null
+++ b/extraconfig/all_nodes/random_string.yaml
@@ -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]}
diff --git a/overcloud-resource-registry-puppet.yaml b/overcloud-resource-registry-puppet.yaml
index 7680192f..cdf626ea 100644
--- a/overcloud-resource-registry-puppet.yaml
+++ b/overcloud-resource-registry-puppet.yaml
@@ -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
diff --git a/overcloud-resource-registry.yaml b/overcloud-resource-registry.yaml
index eaedf790..dd7e1a1c 100644
--- a/overcloud-resource-registry.yaml
+++ b/overcloud-resource-registry.yaml
@@ -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
diff --git a/overcloud-without-mergepy.yaml b/overcloud-without-mergepy.yaml
index 260952b3..e7c4dfc7 100644
--- a/overcloud-without-mergepy.yaml
+++ b/overcloud-without-mergepy.yaml
@@ -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: