Updated the hostname generation

The change simply adds a more complete hostname within the
"/etc/hosts" file for all nodes within inventory which
ensures all hosts are reachable and have a proper host entry
for itself and all other hosts. Additionally the hostname
insert script has been made idempotent and tests have been
added to ensure functionality.

Partial-Bug: #1577245
Change-Id: Ib1e3b6f02758906e3ec7ab35737c1a58fcbca216
Signed-off-by: Kevin Carter <kevin.carter@rackspace.com>
This commit is contained in:
Kevin Carter 2016-05-31 01:53:50 -05:00
parent 339fff1d8c
commit ae02667b84
No known key found for this signature in database
GPG Key ID: 69FEFFC5E2D9273F
7 changed files with 96 additions and 4 deletions

View File

@ -68,3 +68,7 @@ openstack_kernel_options:
- { key: 'net.ipv6.neigh.default.gc_interval', value: 60 }
- { key: 'net.ipv6.neigh.default.gc_stale_time', value: 120 }
- { key: 'fs.aio-max-nr', value: 131072 }
# Set the openstack domain name
openstack_domain: openstack.local

22
manual-test.rc Normal file
View File

@ -0,0 +1,22 @@
export VIRTUAL_ENV=$(pwd)
export ANSIBLE_HOST_KEY_CHECKING=False
export ANSIBLE_SSH_CONTROL_PATH=/tmp/%%h-%%r
# TODO (odyssey4me) These are only here as they are non-standard folder
# names for Ansible 1.9.x. We are using the standard folder names for
# Ansible v2.x. We can remove this when we move to Ansible 2.x.
export ANSIBLE_ACTION_PLUGINS=${HOME}/.ansible/plugins/action
export ANSIBLE_CALLBACK_PLUGINS=${HOME}/.ansible/plugins/callback
export ANSIBLE_FILTER_PLUGINS=${HOME}/.ansible/plugins/filter
export ANSIBLE_LOOKUP_PLUGINS=${HOME}/.ansible/plugins/lookup
# This is required as the default is the current path or a path specified
# in ansible.cfg
export ANSIBLE_LIBRARY=${HOME}/.ansible/plugins/library
# This is required as the default is '/etc/ansible/roles' or a path
# specified in ansible.cfg
export ANSIBLE_ROLES_PATH=${HOME}/.ansible/roles:$(pwd)/..
echo "Run manual functional tests by executing the following:"
echo "# ./.tox/functional/bin/ansible-playbook -i tests/inventory tests/test.yml -e \"rolename=$(pwd)\""

View File

@ -0,0 +1,8 @@
---
features:
- The option ``openstack_domain`` has been added to the
**openstack_hosts** role. This option is used to setup
proper hostname entries for all hosts within a given
OpenStack deployment.
- The **openstack_hosts** role will setup an RFC1034/5
hostname and create an alias for all hosts in inventory.

View File

@ -19,5 +19,12 @@
dest: "/usr/local/bin/openstack-host-hostfile-setup.sh"
mode: "0755"
- name: Stat host file
stat:
path: /etc/hosts
register: stat_hosts
- name: Update hosts file
command: "/usr/local/bin/openstack-host-hostfile-setup.sh"
register: update_hosts
changed_when: stat_hosts.stat.md5 | string != update_hosts.stdout | string

View File

@ -3,7 +3,52 @@
set -x
function insert_host_entry {
ENTRY=$1
ADDR=$2
if ! grep -q -o "^${ENTRY}$" /etc/hosts; then
echo "${ENTRY}" | tee -a /etc/hosts
elif ! grep -q -o "^${ADDR}\b" /etc/hosts; then
sed -i "s|^${ADDR}\b\ .*|${ENTRY}|" /etc/hosts
elif [[ "$(grep -o "^${ADDR}\b" /etc/hosts | wc -l)" -ge "2" ]]; then
sed -i "/^${IPADDR}\b/d" /etc/hosts
echo "${ENTRY}" | tee -a /etc/hosts
fi
}
function host_update {
ANSHOSTNAME=$1
RFCHOSTNAME=$2
INVHOSTNAME=$3
IPADDR=$4
DOMAINNAME=$5
if [[ "${ANSHOSTNAME}" != "${RFCHOSTNAME}" ]] && [[ "${RFCHOSTNAME}" != "${INVHOSTNAME}" ]]; then
insert_host_entry "${IPADDR} ${RFCHOSTNAME}.${DOMAINNAME} ${RFCHOSTNAME} ${INVHOSTNAME} ${ANSHOSTNAME}" "${IPADDR}"
elif [[ "${ANSHOSTNAME}" != "${RFCHOSTNAME}" ]] && [[ "${RFCHOSTNAME}" == "${INVHOSTNAME}" ]]; then
insert_host_entry "${IPADDR} ${RFCHOSTNAME}.${DOMAINNAME} ${RFCHOSTNAME} ${ANSHOSTNAME}" "${IPADDR}"
elif [[ "${ANSHOSTNAME}" == "${RFCHOSTNAME}" ]] && [[ "${RFCHOSTNAME}" == "${INVHOSTNAME}" ]]; then
insert_host_entry "${IPADDR} ${RFCHOSTNAME}.${DOMAINNAME} ${RFCHOSTNAME}" "${IPADDR}"
else
insert_host_entry "${IPADDR} ${RFCHOSTNAME}.${DOMAINNAME} ${RFCHOSTNAME} ${INVHOSTNAME}" "${IPADDR}"
fi
}
{% set host_rfc_1034_1035_name = inventory_hostname|replace('_', '-') %}
host_update "{{ ansible_hostname|default(host_rfc_1034_1035_name) }}" \
"{{ host_rfc_1034_1035_name }}" \
"{{ inventory_hostname }}" \
"127.0.1.1" \
"{{ openstack_domain }}"
{% for item in groups['all'] %}
sed -i '/^{{ hostvars[item]["ansible_ssh_host"] }} .*/d' /etc/hosts
echo '{{ hostvars[item]["ansible_ssh_host"] }} {{ item }}' | tee -a /etc/hosts
{% set target_rfc_1034_1035_name = item|replace('_', '-') %}
host_update "{{ hostvars[item]['ansible_hostname']|default(target_rfc_1034_1035_name) }}" \
"{{ target_rfc_1034_1035_name }}" \
"{{ item }}" \
"{{ hostvars[item]['ansible_ssh_host'] }}" \
"{{ openstack_domain }}"
{% endfor %}
md5sum /etc/hosts|awk '{print $1}'

View File

@ -67,8 +67,9 @@
that:
- "'dm_multipath' in modules_content"
- "'vm.swappiness' in sysctl_content"
- "'127.111.111.101 test1' in hosts_content"
- "'127.111.111.102 test2' in hosts_content"
- "'127.111.111.101 test1.openstack.local test1' in hosts_content"
- "'127.111.111.102 test2.openstack.local test2' in hosts_content"
- "'127.0.1.1 localhost.openstack.local localhost' in hosts_content"
- "release_file.stat.exists"
- "systat_file.stat.exists"
- "'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' in environment_content"

View File

@ -15,6 +15,7 @@ whitelist_externals =
bash
git
rm
wget
setenv =
VIRTUAL_ENV={envdir}
ANSIBLE_HOST_KEY_CHECKING = False
@ -108,12 +109,16 @@ commands =
rm -rf {homedir}/.ansible
git clone https://git.openstack.org/openstack/openstack-ansible-plugins \
{homedir}/.ansible/plugins
# This plugin makes the ansible-playbook output easier to read
wget -O {homedir}/.ansible/plugins/callback/human_log.py \
https://gist.githubusercontent.com/cliffano/9868180/raw/f360f306b3c6d689734a6aa8773a00edf16a0054/human_log.py
ansible-galaxy install \
--role-file={toxinidir}/tests/ansible-role-requirements.yml \
--ignore-errors \
--force
ansible-playbook -i {toxinidir}/tests/inventory \
-e "rolename={toxinidir}" \
-vv \
{toxinidir}/tests/test.yml