Add ansible scripts to deploy Kubernetes
[yardstick.git] / ansible / build_yardstick_image.yml
index 9a65d3a..495a547 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 ---
-- hosts: localhost
+- hosts: jumphost
 
   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 }}"
+    image_filename:
+      'xenial': "{{ release }}-server-cloudimg-{{ YARD_IMG_ARCH }}-{{ boot_mode }}.img"
+      'bionic': "{{ release }}-server-cloudimg-{{ YARD_IMG_ARCH }}.img"
+    image_path: "{{ release }}/current/{{ image_filename[release] }}"
     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 }}"
+    image_dest: "{{ workspace }}/{{ image_filename[release] }}"
     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 }}"
+    growpart_package:
+      RedHat: cloud-utils-growpart
+      Debian: cloud-guest-utils
   environment:
-    PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/bin
+    - PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/bin
+    - "{{ proxy_env }}"
 
   tasks:
     - group_by:
         key: image_builder
 
     - package: name=parted state=present
+    - package: name=kpartx state=present
+    - package: name="{{ growpart_package[ansible_os_family] }}" state=present
+
+    - set_fact:
+        imgfile: "{{ normal_image_file }}"
+      when: img_property == "normal"
+
+    - set_fact:
+        imgfile: "{{ nsb_image_file }}"
+      when: img_property == "nsb"
+
+    - set_fact:
+        mountdir: "{{ lookup('env', 'mountdir')|default('/mnt/yardstick', true) }}"
+
+    - set_fact:
+        raw_imgfile: "{{ workspace }}/{{ raw_imgfile_basename }}"
 
-  # cleanup non-lxd
+    # cleanup non-lxd
     - name: unmount all old mount points
       mount:
         name: "{{ item }}"
       command: kpartx -dv "{{ raw_imgfile }}"
       ignore_errors: true
 
+    - name: Debug dump loop devices
+      command: losetup -a
+      ignore_errors: true
+
+    - name: delete loop devices for image file
+      # use this because kpartx -dv will fail if raw_imgfile was delete
+      # but in theory we could have deleted file still attached to loopback device?
+      # use grep because of // and awk
+      shell: losetup -O NAME,BACK-FILE | grep "{{ raw_imgfile_basename }}" | awk '{ print $1 }' | xargs -l1 losetup -v -d
+      ignore_errors: true
+
+    - name: Debug dump loop devices again
+      command: losetup -a
+      ignore_errors: true
+
     - name: delete {{ raw_imgfile }}
       file:
         path: "{{ raw_imgfile }}"
         state: absent
 
     # download-common
-
     - name: remove {{ workspace }}
       file:
         path: "{{ workspace }}"
         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 }}"
 
+    - name: resize image to allow for more VNFs
+      command: "qemu-img resize -f raw {{ raw_imgfile }} +2G"
 
-    # 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: resize parition to allow for more VNFs
+      # use growpart because maybe it handles GPT better than parted
+      command: growpart {{ raw_imgfile }}  1
 
     - name: create mknod devices in chroot
       command: "mknod -m 0660 /dev/loop{{ item }} b 7 {{ 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
 
 
     - 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
 
 
     - set_fact:
         image_fs_type: "{{ blkid_res.stdout.strip() }}"
+    - fail:
+        msg: "We only support ext4 image filesystems because we have to resize"
+      when: image_fs_type != "ext4"
+
+    - name: fsck the image filesystem
+      command: "e2fsck -y -f {{ image_first_partition_device  }}"
+
+    - name: resize filesystem to full partition size
+      command: resize2fs {{ image_first_partition_device }}
+
+    - name: fsck the image filesystem
+      command: "e2fsck -y -f {{ image_first_partition_device  }}"
 
     - name: make tmp disposable fstab
-      command: mktemp fake_fstab.XXXXXXXXXX
+      command: mktemp --tmpdir fake_fstab.XXXXXXXXXX
       register: mktemp_res
 
     - set_fact:
         name: "{{ mountdir }}"
         # fstype is required
         fstype: "{{ image_fs_type }}"
-        #fstab: "{{ fake_fstab }}"
+        # !!!!!!! this is required otherwise we add entries to /etc/fstab
+        # and prevent the system from booting
+        fstab: "{{ fake_fstab }}"
         state: mounted
 
     - name: mount chroot /proc
         src: none
         name: "{{ mountdir }}/proc"
         fstype: proc
-        #fstab: "{{ fake_fstab }}"
+        # !!!!!!! this is required otherwise we add entries to /etc/fstab
+        # and prevent the system from booting
+        fstab: "{{ fake_fstab }}"
         state: mounted
 
     - name: if arm copy qemu-aarch64-static into chroot
         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' }}"
         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 }}"
         ansible_python_interpreter: /usr/bin/python3
         # set this host variable here
         nameserver_ip: "{{ ansible_dns.nameservers[0] }}"
+        image_type: vm
 
-- name: include {{ img_modify_playbook }}
-  include: "{{ img_modify_playbook }}"
+- name: include ubuntu_server_cloudimg_modify.yml
+  include: ubuntu_server_cloudimg_modify.yml
+  when: img_property == "normal"
+
+- name: include ubuntu_server_cloudimg_modify_samplevnfs.yml
+  include: ubuntu_server_cloudimg_modify_samplevnfs.yml
+  when: img_property == "nsb"
+
+- hosts: localhost
+  tasks:
+    - name: convert image to image file
+      command: "qemu-img convert -c -o compat=0.10 -O qcow2 {{ raw_imgfile }} {{ imgfile }}"
 
 - name: run post build tasks
   include: post_build_yardstick_image.yml
+
+- hosts: localhost
+
+  tasks:
+    - debug:
+        msg: "yardstick image = {{ imgfile }}"