summaryrefslogtreecommitdiff
path: root/roles/raspios/image/tasks/main.yml
blob: e7e0cbba275f412c8be7ee6245e4ce0708efed96 (plain) (blame)
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
---
- name: check if host is member of the raspios group
  assert:
    msg: "please add the host to the group 'raspios'"
    that:
    - "'raspios' in group_names"

- name: fetch os list from download server
  check_mode: no
  uri:
    url: "{{ raspios_download_url }}/os_list_v3.json"
    body_format: json
  register: raspios_os_list

- set_fact:
    raspios_download_base_url: "{{ raspios_os_list.json.os_list | raspios_extract_download_base_url(raspios_variant, raspios_codename, raspios_arch) }}"

- name: fetch base image
  run_once: true
  import_tasks: fetch.yml

- name: build the image
  block:
  - name: create the output directory for built images
    file:
      path: "{{ raspios_output_dir }}"
      state: directory

  - name: extract image
    decompress:
      src: "{{ raspios_download_dir }}/{{ raspios_download_image_base_name }}"
      dest: "{{ raspios_output_dir }}"
      force: yes
    register: raspios_image_extract

  - set_fact:
      raspios_output_image_base_name: "{{ raspios_image_extract.files | first | basename }}"

  - name: read partition layout from image
    command: "sfdisk -q -r -J '{{ raspios_output_dir }}/{{ raspios_output_image_base_name }}'"
    register: raspios_image_sfdisk

  - set_fact:
      raspios_image_partitions: "{{ (raspios_image_sfdisk.stdout | from_json)['partitiontable']['partitions'] }}"

  - name: bind loop device for boot partition
    command: "udisksctl loop-setup --no-user-interaction -o {{ raspios_image_partitions[0].start * 512 }} -s {{ raspios_image_partitions[0].size * 512 }} -f '{{ raspios_output_dir }}/{{ raspios_output_image_base_name }}'"
    register: raspios_image_loop_setup

  - set_fact:
      raspios_image_loop_device: "{{ raspios_image_loop_setup.stdout | regex_search('as (/dev/loop[0-9]+)\\.$', '\\1') | first }}"

  - name: mount boot partition
    command: "udisksctl mount --no-user-interaction -b '{{ raspios_image_loop_device }}'"
    register: raspios_image_mount

  - set_fact:
      raspios_image_mount_point: "{{ raspios_image_mount.stdout | regex_search('at (/media/.+)\\.$', '\\1') | first }}"

  - name: edit boot/config.txt
    when: raspios_boot_config is defined
    loop: "{{ raspios_boot_config }}"
    loop_control:
      label: "{{ item.line }}"
    lineinfile:
      path: "{{ raspios_image_mount_point }}/config.txt"
      regexp: "{{ item.regexp }}"
      line: "{{ item.line }}"

  - name: Generate authorized_keys file
    authorized_key:
      user: root
      manage_dir: no
      path: "{{ raspios_image_mount_point }}/firstrun.authorized_keys"
      key: "{{ ssh_keys_root | join('\n') }}"

  - name: install firstrun.sh script
    template:
      src: firstrun.sh.j2
      dest: "{{ raspios_image_mount_point }}/firstrun.sh"
      mode: 0755

  - name: edit boot/cmdline.txt
    lineinfile:
      path: "{{ raspios_image_mount_point }}/cmdline.txt"
      regexp: '^(.*)( systemd.run=/boot/firstrun.sh systemd.run_success_action=reboot systemd.unit=kernel-command-line.target)?(.*?)$'
      backrefs: yes
      line: '\1 systemd.run=/boot/firstrun.sh systemd.run_success_action=reboot systemd.unit=kernel-command-line.target \3'

  always:
  - name: unmount image
    when:
    - not raspios_keep_boot_dir_mounted
    - raspios_image_mount_point is defined
    - raspios_image_mount_point is mount
    command: "udisksctl unmount --no-user-interaction -b '{{ raspios_image_loop_device }}'"

  - name: delete loop_device
    when:
    - not raspios_keep_boot_dir_mounted
    - raspios_image_loop_device is defined
    command: "udisksctl loop-delete --no-user-interaction -b '{{ raspios_image_loop_device }}'"

  - name: print temporary build directory information
    when:
    - raspios_keep_boot_dir_mounted
    debug:
      msg: "As per request the boot partition of the image is still mounted to: {{ raspios_image_mount_point }}"

- name: set output image names
  set_fact:
    output_images:
    - "{{ (raspios_output_dir, raspios_output_image_base_name) | path_join | realpath }}"