Configure /etc/hosts via os-collect-config script
authorDan Prince <dprince@redhat.com>
Mon, 21 Nov 2016 13:43:01 +0000 (08:43 -0500)
committerDan Prince <dprince@redhat.com>
Wed, 30 Nov 2016 19:22:36 +0000 (14:22 -0500)
This patch moves the t-i-e element code for hosts configuration
into a t-h-t shell script that gets driven by a os-collect-config
script hook.

This helps accomplish several goals:

 - moves us away from t-i-e

 - gives us better signal handling in the error case (where the
   previous element relied on 99-refresh-completed

 - Allows the t-h-t undercloud installer to more easily consume this
   since it doesn't rely on the old os-apply-config metadata (which
   that installer doesn't support).

Change-Id: I73c3d4818ef531a3559fab272521f44519e2f486

hosts-config.yaml
overcloud.j2.yaml
scripts/hosts-config.sh [new file with mode: 0755]

index b5a22b7..a24b9bb 100644 (file)
@@ -8,11 +8,18 @@ parameters:
 resources:
 
   hostsConfigImpl:
-    type: OS::Heat::StructuredConfig
+    type: OS::Heat::SoftwareConfig
     properties:
-      group: os-apply-config
-      config:
-        hosts: {get_param: hosts}
+      group: script
+      inputs:
+        - name: hosts
+          default:
+            list_join:
+              - ' '
+              - str_split:
+                - '\n'
+                - {get_param: hosts}
+      config: {get_file: scripts/hosts-config.sh}
 
 outputs:
   config_id:
@@ -25,3 +32,6 @@ outputs:
       hostname-based access to the deployed nodes (useful for testing without
       setting up a DNS).
     value: {get_attr: [hostsConfigImpl, config, hosts]}
+  OS::stack_id:
+    description: The ID of the hostsConfigImpl resource.
+    value: {get_resource: hostsConfigImpl}
index ba1c6b3..6146a48 100644 (file)
@@ -187,7 +187,7 @@ resources:
       type: string
       value:
         list_join:
-        - '\n'
+        - "\n"
         - - str_replace:
               template: IP  HOST
               params:
@@ -370,7 +370,7 @@ resources:
     properties:
       hosts:
         list_join:
-        - '\n'
+        - "\n"
         - - if:
             - add_vips_to_etc_hosts
             - {get_attr: [VipHosts, value]}
@@ -378,7 +378,7 @@ resources:
         -
 {% for role in roles %}
           - list_join:
-            - '\n'
+            - "\n"
             - {get_attr: [{{role.name}}, hosts_entry]}
 {% endfor %}
 
diff --git a/scripts/hosts-config.sh b/scripts/hosts-config.sh
new file mode 100755 (executable)
index 0000000..4826d61
--- /dev/null
@@ -0,0 +1,47 @@
+#!/bin/bash
+set -eux
+set -o pipefail
+
+write_entries() {
+    local file="$1"
+    local entries="$2"
+
+    # Don't do anything if the file isn't there
+    if [ ! -f "$file" ]; then
+        return
+    fi
+
+    if grep -q "^# HEAT_HOSTS_START" "$file"; then
+        temp=$(mktemp)
+        awk -v v="$entries" '/^# HEAT_HOSTS_START/ {
+            print $0
+            print v
+            f=1
+            }f &&!/^# HEAT_HOSTS_END$/{next}/^# HEAT_HOSTS_END$/{f=0}!f' "$file" > "$temp"
+            echo "INFO: Updating hosts file $file, check below for changes"
+            diff "$file" "$temp" || true
+            cat "$temp" > "$file"
+    else
+        echo -ne "\n# HEAT_HOSTS_START - Do not edit manually within this section!\n" >> "$file"
+        echo "$entries" >> "$file"
+        echo -ne "# HEAT_HOSTS_END\n\n" >> "$file"
+    fi
+
+}
+
+if [ ! -z "$hosts" ]; then
+    # cloud-init files are /etc/cloud/templates/hosts.OSNAME.tmpl
+    DIST=$(lsb_release -is | tr -s [A-Z] [a-z])
+    case $DIST in
+        fedora|redhatenterpriseserver)
+            name="redhat"
+            ;;
+        *)
+            name="$DIST"
+            ;;
+    esac
+    write_entries "/etc/cloud/templates/hosts.${name}.tmpl" "$hosts"
+    write_entries "/etc/hosts" "$hosts"
+else
+    echo "No hosts in Heat, nothing written."
+fi