summaryrefslogtreecommitdiff
path: root/roles/qemu/tasks/build_image.yml
blob: 135d8de1cab44e09139d20ce994ee5f8d2992b95 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
- name: Create the target disk image
  command: qemu-img create -f raw "{{ vyos_raw_img }}" 1G

- name: Find loopback
  shell: losetup -f 
  register: loopback

- name: Loopback attach
  command: "losetup {{ loopback.stdout }} {{ vyos_raw_img }}"

- name: Partition the target drive
  parted:
    device: "{{ loopback.stdout }}"
    state: present
    label: msdos
    number: 1
    part_type: primary
    part_start: 0%
    part_end: 100%
    align: optimal
    flags: [boot]

- name: Create a filesystem on root partition
  filesystem:
    fstype: "{{ ROOT_FSTYPE }}"
    device: "{{ loopback.stdout }}"
    opts: "-L persistence"

- name: Mount root partition
  mount:
    name: "{{ WRITE_ROOT }}"
    src: "{{ loopback.stdout }}"
    fstype: "{{ ROOT_FSTYPE }}"
    state: mounted

# ---- Install image from ISO ----
- name: Create {{ WRITE_ROOT }} directories
  file:
    path: "{{ WRITE_ROOT }}/boot/{{ version_string.stdout }}/rw"
    state: directory
  register: RW_DIR

- name: Create the work directory
  file:
    path: "{{ WRITE_ROOT }}/boot/{{ version_string.stdout }}/work/work"
    state: directory

- name: Copy squashfs image from ISO to root partition
  command: cp -p {{ SQUASHFS_IMAGE }} {{ WRITE_ROOT }}/boot/{{ version_string.stdout }}/{{ version_string.stdout }}.squashfs
  args:
   creates: "{{ WRITE_ROOT }}/boot/{{ version_string.stdout }}/{{ version_string.stdout }}.squashfs"

- name: Copy boot files (kernel and initrd images) from ISO to root partition
  shell: find {{ CD_SQUASH_ROOT }}/boot -maxdepth 1  \( -type f -o -type l \) -print -exec cp -dp {} {{ WRITE_ROOT }}/boot/{{ version_string.stdout }}/ \;
  args:
    creates: "{{ WRITE_ROOT }}/boot/{{ version_string.stdout }}/vmlinuz"

- name: Mount squashfs image from root partition
  mount:
    name: "{{ READ_ROOT }}"
    src: "{{ WRITE_ROOT }}/boot/{{ version_string.stdout }}/{{ version_string.stdout }}.squashfs"
    fstype: squashfs
    opts: loop,ro
    state: mounted

- name: Set up union root for post installation tasks
  mount:
    name: "{{ INSTALL_ROOT }}"
    src: none
    fstype: aufs
    opts: "noatime,dirs={{ RW_DIR.path }}=rw:{{ READ_ROOT }}=rr"
    state: mounted

# ---- Post image installation tasks ----

## ---- VyOS configuration ----
- name: Make sure that config partition marker exists
  file:
    path: "{{ INSTALL_ROOT }}/opt/vyatta/etc/config/.vyatta_config"
    state: touch

- name: Copy the default config for QEMU to the installed image
  copy:
    src: files/config.boot
    dest: "{{ INSTALL_ROOT }}/opt/vyatta/etc/config/config.boot"
    mode: 0755

## ---- Install GRUB boot loader ----
- name: Create GRUB directory
  file:
    path: "{{ WRITE_ROOT }}/boot/grub"
    state: directory

# It is necessary to mount and bind /dev, /proc, /sys and /boot in order to execute grub-install
# and install GRUB correctly within the {{ volume_drive }} using chroot

# XXX: ansible mount module requires fstype so it cannot be used for binding an already
# mounted location, we get to use mount directly at least for /boot
- name: Mount and bind /dev /proc /sys and {{ WRITE_ROOT }}/boot to {{ INSTALL_ROOT }}
  shell: mount --bind /dev {{ INSTALL_ROOT }}/dev &&
         mount --bind /proc {{ INSTALL_ROOT }}/proc &&
         mount --bind /sys {{ INSTALL_ROOT }}/sys &&
         mount --bind {{ WRITE_ROOT }} {{ INSTALL_ROOT }}/boot
  args:
    warn: no

- name: Install GRUB in the boot sector of {{ loopback.stdout }}
  command: chroot {{ INSTALL_ROOT }} grub-install --no-floppy --root-directory=/boot {{ loopback.stdout }} --force
  args:
    creates: "{{ INSTALL_ROOT }}/boot/grub/grubenv"

- name: Configure GRUB
  template:
    src: templates/boot/grub/grub.cfg.j2
    dest: "{{ WRITE_ROOT }}/boot/grub/grub.cfg"
    mode: 0644

- name: Create the persistence config
  copy:
    src: files/persistence.conf
    dest: "{{ WRITE_ROOT }}/persistence.conf"
    mode: 0644