# Copyright (c) 2015 Hewlett-Packard Development Company, L.P. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. --- - name: "Extract the raw disk image" command: qemu-img convert -O raw "{{ deploy_image }}" "{{ deploy_image }}.raw" - name: "Copy image however with 32k of empty space at the beginning of the file." command: dd if="{{ deploy_image }}.raw" of="{{ deploy_image }}.bootimg" seek=64 - name: "Create partition table lining up with the copied file's contents." shell: echo '32;' | sfdisk "{{ deploy_image }}.bootimg" -uB -f # noqa 306 - name: "Allocate one of two loopbacks" command: losetup -f register: stored_value_loopback_alpha - name: "Create loopback connetion to new image file" command: losetup "{{ stored_value_loopback_alpha.stdout }}" "{{ deploy_image }}.bootimg" - name: "Force partition table to be re-read" command: kpartx -v -a "{{ stored_value_loopback_alpha.stdout }}" # Using second loopback as for some reason /dev/mapper does not translate into a chroot cleanly when devfs is mounted - name: "Allocate second loopback pointing to the initial partition" command: losetup -f register: stored_value_loopback_beta - name: "Bind second loopback to the first partition" shell: | set -o pipefail losetup "{{ stored_value_loopback_beta.stdout }}" /dev/mapper/$(echo "{{ stored_value_loopback_alpha.stdout }}" | cut -f3 -d '/')p1 executable: /bin/bash # TODO parameterize folder name/location - name: "Ensure we have a location to mount the disk to" file: path=/mnt/bootimg state=directory # NOTE(dtantsur): skipping ansible-lint 303 because the mount module does not # support temporary mounts: https://github.com/ansible-collections/ansible.posix/issues/84 - name: "Mount volume on /mnt/bootimg" command: mount "{{ stored_value_loopback_beta.stdout }}" /mnt/bootimg # noqa 303 - name: "Bind /sys into /mnt/bootimg/sys" command: mount -t sysfs sysfs /mnt/bootimg/sys # noqa 303 - name: "Bind /proc into /mnt/bootimg/proc" command: mount -t proc proc /mnt/bootimg/proc # noqa 303 - name: "Bind /dev into /mnt/bootimg/dev" command: mount --bind /dev /mnt/bootimg/dev # noqa 303 - name: "Disable Grub Prober" shell: echo "GRUB_DISABLE_OS_PROBER=true" >>/etc/default/grub - name: "Disable Grub Prober" shell: echo 'GRUB_TERMINAL="serial console"' >>/etc/default/grub - name: "Run the grub-install tool" command: chroot /mnt/bootimg grub-install --boot-directory=/boot --modules="biosdisk part_msdos" "{{ stored_value_loopback_alpha.stdout }}" - name: "Unlink /dev/bootimg/dev" command: umount /mnt/bootimg/dev - name: "Unlink /dev/bootimg/proc" command: umount /mnt/bootimg/proc - name: "Unlink /dev/bootimg/sys" command: umount /mnt/bootimg/sys - name: "Unmount image" command: umount /mnt/bootimg - name: "Detach second loop device" command: losetup -d "{{ stored_value_loopback_beta.stdout }}" - name: "Remove partition map" command: kpartx -v -d "{{ stored_value_loopback_alpha.stdout }}" - name: "Detach first loop device" command: losetup -d "{{ stored_value_loopback_alpha.stdout }}" - name: "Move image to .oldimg" command: mv "{{ deploy_image }}" "{{ deploy_image }}.oldimg" - name: "Move new image into place" command: mv "{{ deploy_image }}.bootimg" "{{ deploy_image }}"