# 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 - 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: losetup "{{stored_value_loopback_beta.stdout}}" /dev/mapper/$(echo "{{stored_value_loopback_alpha.stdout}}"|cut -f3 -d '/')p1 # TODO parameterize folder name/location - name: "Ensure we have a location to mount the disk to" file: path=/mnt/bootimg state=directory - name: "Mount volume on /mnt/bootimg" command: mount "{{stored_value_loopback_beta.stdout}}" /mnt/bootimg - name: "Bind /sys into /mnt/bootimg/sys" command: mount -t sysfs sysfs /mnt/bootimg/sys - name: "Bind /proc into /mnt/bootimg/proc" command: mount -t proc proc /mnt/bootimg/proc - name: "Bind /dev into /mnt/bootimg/dev" command: mount --bind /dev /mnt/bootimg/dev - 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}}"