# Copyright (c) 2017 Intel Corporation. # # 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. --- - hosts: localhost vars: boot_modes: 'amd64': disk1 'arm64': uefi1 boot_mode: "{{ boot_modes[YARD_IMG_ARCH] }}" image_filename: "{{ release }}-server-cloudimg-{{ YARD_IMG_ARCH }}-{{ boot_mode }}.img" image_path: "{{ release }}/current/{{ image_filename }}" host: "{{ lookup('env', 'HOST')|default('cloud-images.ubuntu.com', true)}}" image_url: "{{ lookup('env', 'IMAGE_URL')|default('https://' ~ host ~ '/' ~ image_path, true) }}" image_dest: "{{ workspace }}/{{ image_filename }}" sha256sums_path: "{{ release }}/current/SHA256SUMS" sha256sums_filename: "{{ sha256sums_path|basename }}" sha256sums_url: "{{ lookup('env', 'SHA256SUMS_URL')|default('https://' ~ host ~ '/' ~ sha256sums_path, true) }}" mountdir: "{{ lookup('env', 'mountdir')|default('/mnt/yardstick', true) }}" workspace: "{{ lookup('env', 'workspace')|default('/tmp/workspace/yardstick', true) }}" imgfile: "{{ workspace }}/yardstick-image.img" raw_imgfile_basename: "yardstick-{{ release }}-server.raw" raw_imgfile: "{{ workspace }}/{{ raw_imgfile_basename }}" environment: PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/bin tasks: - group_by: key: image_builder - package: name=parted state=present # cleanup non-lxd - name: unmount all old mount points mount: name: "{{ item }}" state: unmounted with_items: # order matters - "{{ mountdir }}/proc" - "{{ mountdir }}" - "/mnt/{{ release }}" - name: kpartx -dv to delete all image partition device nodes command: kpartx -dv "{{ raw_imgfile }}" ignore_errors: true - name: delete {{ raw_imgfile }} file: path: "{{ raw_imgfile }}" state: absent # common - name: remove {{ mountdir }} file: path: "{{ mountdir }}" state: absent # download-common - name: remove {{ workspace }} file: path: "{{ workspace }}" state: directory - name: "fetch {{ image_url }} and verify " fetch_url_and_verify: url: "{{ image_url }}" sha256url: "{{ sha256sums_url }}" dest: "{{ image_dest }}" # - get_url: # url: "{{ sha256sums_url }}" # force: yes # dest: "{{ workspace }}/{{ sha256sums_filename }}" # must use wget to workaround ubuntu cloud SSL certs checking failures # - command: "curl -sS -o {{ workspace }}/{{ sha256sums_filename }} {{ sha256sums_url }}" # - command: cat "{{ workspace }}/{{ sha256sums_filename }}" # register: sha256sum_file # # - set_fact: # image_sha256: "{{ sha256sum_file.stdout|regex_search('^([a-f0-9]+).*' ~ img ~ '$', '\\1', multiline=True) }}" # - get_url: # url: "{{ image_url }}" # force: yes # dest: "{{ workspace }}/{{ image_filename }}" # checksum: "sha256:{{ image_sha256 }}" # register: fetch_image_status # timeout: 300 # retries: 2 # until: fetch_image_status|succeeded # - name: "Fetch {{ image_url }}" # - command: "curl -sS -o {{ workspace }}/{{ image_filename }} {{ image_url }}" # register: fetch_image_status # timeout: 300 # retries: 2 # until: fetch_image_status|succeeded # - name: Verify sha256sum of downloaded image # - command: "sha256sum -c --ignore-missing {{ workspace }}/{{ sha256sums_filename }}" # - name: create loop devices # command: "mknod -m 660 /dev/loop{{ item }} b 7 {{ item }}" # args: # creates: "/dev/loop{{ item }}" # with_seq: # - # download non-lxd - name: convert image to raw command: "qemu-img convert {{ image_dest }} {{ raw_imgfile }}" # setup non-lxd # - shell: echo -e "d\\nn\\np\\n1\\n\\n\\nw" | parted -l "{{ raw_imgfile }}" # - parted: # device: "{{ raw_imgfile }}" # number: 1 # state: present - name: create mknod devices in chroot command: "mknod -m 0660 /dev/loop{{ item }} b 7 {{ item }}" args: creates: "/dev/loop{{ item }}" with_sequence: start=0 end=9 tags: mknod_devices # - command: losetup --show --partscan --find "{{ raw_imgfile }}" # register: loop_device_res # # - debug: # var: loop_device_res # verbosity: 2 # # - set_fact: # loop_device: "{{ loop_device_res.stdout.strip() }}" # # - wait_for: # path: "{{ loop_device }}" # state: present # # - command: losetup # - command: dmsetup ls - name: find first partition device # command: kpartx -l "{{ loop_device }}" command: kpartx -l "{{ raw_imgfile }}" register: kpartx_res - set_fact: image_first_partition: "{{ kpartx_res.stdout_lines[0].split()[0] }}" - set_fact: # assume / is the first partition image_first_partition_device: "/dev/mapper/{{ image_first_partition }}" - name: use kpartx to create device nodes for the raw image loop device # operate on the loop device to avoid /dev namespace missing devices # command: kpartx -avs "{{ loop_device }}" command: kpartx -avs "{{ raw_imgfile }}" - name: parted dump raw image # command: parted "{{ loop_device }}" print command: parted "{{ raw_imgfile }}" print register: parted_res - debug: var: parted_res verbosity: 2 - name: use blkid to find filesystem type of first partition device command: blkid -o value -s TYPE {{ image_first_partition_device }} register: blkid_res - set_fact: image_fs_type: "{{ blkid_res.stdout.strip() }}" - name: make tmp disposable fstab command: mktemp fake_fstab.XXXXXXXXXX register: mktemp_res - set_fact: fake_fstab: "{{ mktemp_res.stdout.strip() }}" - name: mount first parition on image device mount: src: "{{ image_first_partition_device }}" name: "{{ mountdir }}" # fstype is required fstype: "{{ image_fs_type }}" #fstab: "{{ fake_fstab }}" state: mounted - name: mount chroot /proc mount: src: none name: "{{ mountdir }}/proc" fstype: proc #fstab: "{{ fake_fstab }}" state: mounted - name: if arm copy qemu-aarch64-static into chroot copy: src: /usr/bin/qemu-aarch64-static dest: "{{ mountdir }}/usr/bin" when: 'YARD_IMG_ARCH == "arm64"' # setup lxd # - file: "path={{ mountdir }} state=directory" # # - unarchive: # src: "{{ image_filename }}" # dest: "{{ mountdir }}" # remote_src: yes # end setup lxd # modify - name: create ubuntu policy-rc.d workaround copy: content: "{{ '#!/bin/sh\nexit 101\n' }}" dest: "{{ mountdir }}/usr/sbin/policy-rc.d" mode: 0755 when: "target_os == 'Ubuntu'" - name: set img_modify_playbook set_fact: img_modify_playbook: ubuntu_server_cloudimg_modify.yml - debug: var: img_modify_playbook verbosity: 2 - name: add chroot as host add_host: name: "{{ mountdir }}" groups: chroot_image,image_builder connection: chroot ansible_python_interpreter: /usr/bin/python3 # set this host variable here nameserver_ip: "{{ ansible_dns.nameservers[0] }}" - name: include {{ img_modify_playbook }} include: "{{ img_modify_playbook }}" - name: run post build tasks include: post_build_yardstick_image.yml