diff options
Diffstat (limited to 'ansible/build_yardstick_image.yml')
-rw-r--r-- | ansible/build_yardstick_image.yml | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/ansible/build_yardstick_image.yml b/ansible/build_yardstick_image.yml new file mode 100644 index 000000000..9a65d3ae0 --- /dev/null +++ b/ansible/build_yardstick_image.yml @@ -0,0 +1,268 @@ +# 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 |