Configure /etc/hosts via os-collect-config script

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
This commit is contained in:
Dan Prince 2016-11-21 08:43:01 -05:00
parent 6df32707e9
commit f02742a981
3 changed files with 64 additions and 7 deletions

View File

@ -8,11 +8,18 @@ parameters:
resources: resources:
hostsConfigImpl: hostsConfigImpl:
type: OS::Heat::StructuredConfig type: OS::Heat::SoftwareConfig
properties: properties:
group: os-apply-config group: script
config: inputs:
hosts: {get_param: hosts} - name: hosts
default:
list_join:
- ' '
- str_split:
- '\n'
- {get_param: hosts}
config: {get_file: scripts/hosts-config.sh}
outputs: outputs:
config_id: config_id:
@ -25,3 +32,6 @@ outputs:
hostname-based access to the deployed nodes (useful for testing without hostname-based access to the deployed nodes (useful for testing without
setting up a DNS). setting up a DNS).
value: {get_attr: [hostsConfigImpl, config, hosts]} value: {get_attr: [hostsConfigImpl, config, hosts]}
OS::stack_id:
description: The ID of the hostsConfigImpl resource.
value: {get_resource: hostsConfigImpl}

View File

@ -187,7 +187,7 @@ resources:
type: string type: string
value: value:
list_join: list_join:
- '\n' - "\n"
- - str_replace: - - str_replace:
template: IP HOST template: IP HOST
params: params:
@ -370,7 +370,7 @@ resources:
properties: properties:
hosts: hosts:
list_join: list_join:
- '\n' - "\n"
- - if: - - if:
- add_vips_to_etc_hosts - add_vips_to_etc_hosts
- {get_attr: [VipHosts, value]} - {get_attr: [VipHosts, value]}
@ -378,7 +378,7 @@ resources:
- -
{% for role in roles %} {% for role in roles %}
- list_join: - list_join:
- '\n' - "\n"
- {get_attr: [{{role.name}}, hosts_entry]} - {get_attr: [{{role.name}}, hosts_entry]}
{% endfor %} {% endfor %}

47
scripts/hosts-config.sh Executable file
View File

@ -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