Enable passing optional first-boot user-data
authorSteven Hardy <shardy@redhat.com>
Thu, 2 Apr 2015 13:52:18 +0000 (09:52 -0400)
committerSteven Hardy <shardy@redhat.com>
Fri, 24 Apr 2015 09:18:31 +0000 (10:18 +0100)
Currently all the OS::Nova::Server resource created don't pass any
user-data.  It's possible to pass user-data as well as using heat
SoftwareConfig/SoftwareDeployment resources, and this can be useful
when you have simple "first boot" tasks which are possible either via
cloud-init, or via simple run-once scripts.

This enables passing such data by implementing a new provider resource
OS::TripleO::NodeUserData, which defaults to passing an empty mime
archive (thus it's a no-op).  An example of non no-op usage is also
provided.

Change-Id: Id0caba69768630e3a10439ba1fc2547a609c0cfe

15 files changed:
ceph-storage.yaml
cinder-storage.yaml
compute.yaml
controller.yaml
firstboot/userdata_default.yaml [new file with mode: 0644]
firstboot/userdata_example.yaml [new file with mode: 0644]
nagios3.yaml
overcloud-resource-registry-puppet.yaml
overcloud-resource-registry.yaml
puppet/ceph-storage-puppet.yaml
puppet/cinder-storage-puppet.yaml
puppet/compute-puppet.yaml
puppet/controller-puppet.yaml
puppet/swift-storage-puppet.yaml
swift-storage.yaml

index d047488..93b4deb 100644 (file)
@@ -36,9 +36,14 @@ resources:
         {get_param: Image}
       flavor: {get_param: OvercloudCephStorageFlavor}
       key_name: {get_param: KeyName}
-      user_data_format: SOFTWARE_CONFIG
       networks:
         - network: ctlplane
+      user_data_format: SOFTWARE_CONFIG
+      user_data: {get_resource: NodeUserData}
+
+  NodeUserData:
+    type: OS::TripleO::NodeUserData
+
   CephStorageDeployment:
     type: OS::Heat::StructuredDeployment
     properties:
index 7eab89a..2473911 100644 (file)
@@ -103,9 +103,14 @@ resources:
         {get_param: Image}
       flavor: {get_param: Flavor}
       key_name: {get_param: KeyName}
-      user_data_format: SOFTWARE_CONFIG
       networks:
         - network: ctlplane
+      user_data_format: SOFTWARE_CONFIG
+      user_data: {get_resource: NodeUserData}
+
+  NodeUserData:
+    type: OS::TripleO::NodeUserData
+
   BlockStorageDeployment:
     type: OS::Heat::StructuredDeployment
     properties:
index 3723169..a419089 100644 (file)
@@ -259,6 +259,10 @@ resources:
       networks:
         - network: ctlplane
       user_data_format: SOFTWARE_CONFIG
+      user_data: {get_resource: NodeUserData}
+
+  NodeUserData:
+    type: OS::TripleO::NodeUserData
 
   NetworkConfig:
     type: OS::TripleO::Net::SoftwareConfig
index 483ecc8..37c0deb 100644 (file)
@@ -418,6 +418,10 @@ resources:
       networks:
         - network: ctlplane
       user_data_format: SOFTWARE_CONFIG
+      user_data: {get_resource: NodeUserData}
+
+  NodeUserData:
+    type: OS::TripleO::NodeUserData
 
   NetworkConfig:
     type: OS::TripleO::Net::SoftwareConfig
diff --git a/firstboot/userdata_default.yaml b/firstboot/userdata_default.yaml
new file mode 100644 (file)
index 0000000..140d2bf
--- /dev/null
@@ -0,0 +1,20 @@
+heat_template_version: 2014-10-16
+
+description: >
+  This is a default no-op template which provides empty user-data
+  which can be passed to the OS::Nova::Server resources.
+  This template can be replaced with a different implementation via
+  the resource registry, such that deployers may customize their
+  first-boot configuration.
+
+resources:
+  userdata:
+    type: OS::Heat::MultipartMime
+
+outputs:
+  # This means get_resource from the parent template will get the userdata, see:
+  # http://docs.openstack.org/developer/heat/template_guide/composition.html#making-your-template-resource-more-transparent
+  # Note this is new-for-kilo, an alternative is returning a value then using
+  # get_attr in the parent template instead.
+  OS::stack_id:
+    value: {get_resource: userdata}
diff --git a/firstboot/userdata_example.yaml b/firstboot/userdata_example.yaml
new file mode 100644 (file)
index 0000000..a0d8c7a
--- /dev/null
@@ -0,0 +1,60 @@
+heat_template_version: 2014-10-16
+
+# NOTE: You don't need to pass the parameter explicitly from the
+# parent template, it can be specified via the parameter_defaults
+# in the resource_registry instead, if you want to override the default
+# and/or share values with other templates in the tree.
+parameters:
+  extra_username:
+    type: string
+    default: extrauser
+
+description: >
+  This is an example showing how you can do firstboot configuration
+  of the nodes via cloud-init.  To enable this, replace the default
+  mapping of OS::TripleO::NodeUserData in ../overcloud_resource_registry*
+
+resources:
+  userdata:
+    type: OS::Heat::MultipartMime
+    properties:
+      parts:
+      - config: {get_resource: user_config}
+      - config: {get_resource: ssh_config}
+
+  # Get cloud-init to create an extra user, in addition to the default for the
+  # distro.  Note there are various options, including configuring ssh keys,
+  # but atm I can only see how to specify the keys explicitly, not via metadata
+  user_config:
+    type: OS::Heat::CloudConfig
+    properties:
+      cloud_config:
+        users:
+        - default
+        - name: {get_param: extra_username}
+
+  # Setup ssh key for the extra user to match the key installed for the default
+  # user, e.g that provided via the nova keypair on instance boot
+  ssh_config:
+    type: OS::Heat::SoftwareConfig
+    properties:
+      config:
+        str_replace:
+          template: |
+            #!/bin/bash
+            curl http://169.254.169.254/openstack/2012-08-10/meta_data.json -o /root/meta_data.json
+            mkdir -p /home/$user/.ssh
+            chmod 700 /home/$user/.ssh
+            cat /root/meta_data.json | jq -r ".keys[0].data" > /home/$user/.ssh/authorized_keys
+            chmod 600 /home/$user/.ssh/authorized_keys
+            chown -R $user:$user /home/$user/.ssh
+          params:
+            $user: {get_param: extra_username}
+
+outputs:
+  # This means get_resource from the parent template will get the userdata, see:
+  # http://docs.openstack.org/developer/heat/template_guide/composition.html#making-your-template-resource-more-transparent
+  # Note this is new-for-kilo, an alternative is returning a value then using
+  # get_attr in the parent template instead.
+  OS::stack_id:
+    value: {get_resource: userdata}
index 0db22b8..e2ba8cc 100644 (file)
@@ -105,10 +105,15 @@ resources:
       flavor: { get_param: flavor }
       image: { get_param: image }
       key_name: { get_param: key_name }
-      user_data_format: SOFTWARE_CONFIG
       networks:
         - network: { get_param: server_network }
           port: { get_resource: nagios_net_port }
+      user_data_format: SOFTWARE_CONFIG
+      user_data: {get_resource: NodeUserData}
+
+  NodeUserData:
+    type: OS::TripleO::NodeUserData
+
   nagios_floating_ip:
     type: OS::Neutron::FloatingIP
     properties:
index c64cb49..2536053 100644 (file)
@@ -15,6 +15,7 @@ resource_registry:
   OS::TripleO::CephClusterConfig::SoftwareConfig: puppet/ceph-cluster-config.yaml
   OS::TripleO::AllNodes::SoftwareConfig: puppet/all-nodes-config.yaml
   OS::TripleO::BootstrapNode::SoftwareConfig: puppet/bootstrap-config.yaml
+  OS::TripleO::NodeUserData: firstboot/userdata_default.yaml
 
 parameter_defaults:
   EnablePackageInstall: false
index d4f75e0..aba2212 100644 (file)
@@ -15,3 +15,4 @@ resource_registry:
   OS::TripleO::CephClusterConfig::SoftwareConfig: ceph-cluster-config.yaml
   OS::TripleO::AllNodes::SoftwareConfig: all-nodes-config.yaml
   OS::TripleO::BootstrapNode::SoftwareConfig: bootstrap-config.yaml
+  OS::TripleO::NodeUserData: firstboot/userdata_default.yaml
index e9f82c2..4ce1622 100644 (file)
@@ -40,6 +40,11 @@ resources:
       networks:
         - network: ctlplane
       user_data_format: SOFTWARE_CONFIG
+      user_data: {get_resource: NodeUserData}
+
+  NodeUserData:
+    type: OS::TripleO::NodeUserData
+
   CephStorageDeployment:
     type: OS::Heat::StructuredDeployment
     properties:
index ecea763..3e55ec8 100644 (file)
@@ -115,9 +115,13 @@ resources:
         {get_param: Image}
       flavor: {get_param: Flavor}
       key_name: {get_param: KeyName}
-      user_data_format: SOFTWARE_CONFIG
       networks:
         - network: ctlplane
+      user_data_format: SOFTWARE_CONFIG
+      user_data: {get_resource: NodeUserData}
+
+  NodeUserData:
+    type: OS::TripleO::NodeUserData
 
   BlockStorageDeployment:
     type: OS::Heat::StructuredDeployment
index 382a6b5..11910d7 100644 (file)
@@ -262,6 +262,10 @@ resources:
       networks:
         - network: ctlplane
       user_data_format: SOFTWARE_CONFIG
+      user_data: {get_resource: NodeUserData}
+
+  NodeUserData:
+    type: OS::TripleO::NodeUserData
 
   NetworkConfig:
     type: OS::TripleO::Net::SoftwareConfig
index d395546..a904e04 100644 (file)
@@ -425,6 +425,10 @@ resources:
       networks:
         - network: ctlplane
       user_data_format: SOFTWARE_CONFIG
+      user_data: {get_resource: NodeUserData}
+
+  NodeUserData:
+    type: OS::TripleO::NodeUserData
 
   NetworkConfig:
     type: OS::TripleO::Net::SoftwareConfig
index eba44e6..6f861d8 100644 (file)
@@ -60,9 +60,13 @@ resources:
       image: {get_param: Image}
       flavor: {get_param: Flavor}
       key_name: {get_param: KeyName}
-      user_data_format: SOFTWARE_CONFIG
       networks:
         - network: ctlplane
+      user_data_format: SOFTWARE_CONFIG
+      user_data: {get_resource: NodeUserData}
+
+  NodeUserData:
+    type: OS::TripleO::NodeUserData
 
   SwiftStorageHieraConfig:
     type: OS::Heat::StructuredConfig
index 42a7866..db8ff5d 100644 (file)
@@ -108,9 +108,14 @@ resources:
       image: {get_param: Image}
       flavor: {get_param: Flavor}
       key_name: {get_param: KeyName}
-      user_data_format: SOFTWARE_CONFIG
       networks:
         - network: ctlplane
+      user_data_format: SOFTWARE_CONFIG
+      user_data: {get_resource: NodeUserData}
+
+  NodeUserData:
+    type: OS::TripleO::NodeUserData
+
   SwiftStorageDeploy:
     type: OS::Heat::StructuredDeployment
     properties: