MNAIO: Make the galera image prep more robust

Unfortunately guestfish may error out silently (no return code
of 1), making hunting down the error a bit obscure. To combat
this we add a bunch of stdout output to the script, and look
for that final step to validate success. To make this work, we
need to copy the script over and execute it with the command
module, because the script module puts everything into stderr.

Change-Id: I8e514ceb2462870721745c9445ec149864a45f4d
This commit is contained in:
Jesse Pretorius 2018-09-04 19:19:50 +01:00
parent b48b97b115
commit 4e9c1c5fd8
2 changed files with 31 additions and 7 deletions

View File

@ -138,8 +138,23 @@
- hostvars[item]['server_vm'] | default(false) | bool
with_items: "{{ groups['pxe_servers'] }}"
- name: Copy over prepare-image-galera.sh
copy:
src: kvm/prepare-image-galera.sh
dest: /opt/prepare-image-galera.sh
mode: "0755"
- name: Prepare the galera containers for startup
script: kvm/prepare-image-galera.sh
command: /opt/prepare-image-galera.sh
register: _galera_prepare
# guestfissh does not always give a return code which indicates
# failure, so we look for our final stdout output as an indicator
- name: Fail if the preparation script did not complete
fail:
msg: "The galera container preparation failed."
when:
- "'Image preparation completed.' not in _galera_prepare.stdout_lines"
- name: Wait for guest capabilities to appear
command: "virsh capabilities"

21
multi-node-aio/playbooks/kvm/prepare-image-galera.sh Normal file → Executable file
View File

@ -1,5 +1,8 @@
#!/bin/bash -ex
# clean up from any previous attempts
rm -rf /tmp/*galera* /tmp/gvw*
# provide default images to inspect
infra_images="/data/images/infra1.img /data/images/infra2.img /data/images/infra3.img"
@ -12,7 +15,7 @@ declare -A uuid_map
# at this stage, no galera container is the master
master_cnt=""
# get the list of galera container names
echo "Getting the list of galera container names."
for img in ${infra_images}; do
image_map[${img}]="$(virt-ls --add ${img} --mount /dev/vmvg00/openstack00 / | grep galera_container)"
done
@ -22,6 +25,7 @@ done
# as the container
for img in ${infra_images}; do
mkdir -p /tmp/${image_map[$img]}
echo "Copying *.dat from ${img} into /tmp/${image_map[$img]}/"
guestfish --ro --add ${img} --mount /dev/vmvg00/openstack00 glob copy-out /${image_map[$img]}/*.dat /tmp/${image_map[$img]}/
done
@ -31,9 +35,11 @@ done
for cnt in $(ls -1 /tmp | grep galera_container); do
gvwstate_path="/tmp/${cnt}/gvwstate.dat"
if [[ -e ${gvwstate_path} ]]; then
echo "Found ${gvwstate_path}, extracting my_uuid/view_id."
my_uuid=$(awk '/^my_uuid:/ { print $2 }' ${gvwstate_path})
view_id=$(awk '/^view_id:/ { print $3 }' ${gvwstate_path})
if [[ "${my_uuid}" == "${view_id}" ]]; then
echo "Found galera master in ${gvwstate_path}."
master_gvwstate_path=${gvwstate_path}
master_cnt=${cnt}
fi
@ -45,26 +51,29 @@ for cnt in $(ls -1 /tmp | grep galera_container); do
fi
done
# prepare a new master in a temporary location
echo "Prepare a new master gvwstate.dat in a temporary location."
tmp_gvwstate="/tmp/gvwstate.dat"
cp ${master_gvwstate_path} ${tmp_gvwstate}
member_num=$(awk '/^member: '${my_uuid}'/ {print $3}' ${tmp_gvwstate})
# clear the existing members
echo "Clearing the existing members."
sed -i.bak '/^member:/d' ${tmp_gvwstate}
# insert the new set of members
echo "Inserting the new set of members."
for cnt_uuid in "${uuid_map[@]}"; do
sed -i.bak "/^#vwend$/i \\
member: ${cnt_uuid} ${member_num}" ${tmp_gvwstate}
done
# copy the new version to each location
echo "Copying the new gvwstate.dat version to each working location."
for cnt in "${!uuid_map[@]}"; do
sed "s/my_uuid: .*/my_uuid: ${uuid_map[$cnt]}/" ${tmp_gvwstate} > /tmp/${cnt}/gvwstate.dat
done
# put the gvwstate.dat files back into the image
echo "Putting the gvwstate.dat files back into the images."
for img in ${infra_images}; do
echo "Copying /tmp/${image_map[$img]}/gvwstate.dat into ${img}."
guestfish --rw --add ${img} --mount /dev/vmvg00/openstack00 copy-in /tmp/${image_map[$img]}/gvwstate.dat /${image_map[$img]}/
done
echo "Image preparation completed."