From 18c8a90e267dd06c587229066544d39e91656a0b Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Mon, 5 Sep 2022 00:04:25 +0200 Subject: raspios: image customization works now --- roles/raspios/image/tasks/main.yml | 119 +++++++++++++++++++++++-------------- 1 file changed, 75 insertions(+), 44 deletions(-) (limited to 'roles/raspios/image/tasks/main.yml') diff --git a/roles/raspios/image/tasks/main.yml b/roles/raspios/image/tasks/main.yml index 24c7c821..7baf2b35 100644 --- a/roles/raspios/image/tasks/main.yml +++ b/roles/raspios/image/tasks/main.yml @@ -20,63 +20,94 @@ path: "{{ raspios_output_dir }}" state: directory - - name: Create temporary build directory - tempfile: - state: directory - register: tmpdir - - name: extract image decompress: src: "{{ raspios_download_dir }}/{{ raspios_download_image_base_name }}" - dest: "{{ tmpdir.path }}" - register: raspios_image_extract_result + dest: "{{ raspios_output_dir }}" + force: yes + register: raspios_image_extract - set_fact: - raspios_output_image_base_name: "{{ raspios_image_extract_result.files | first | basename }}" + raspios_output_image_base_name: "{{ raspios_image_extract.files | first | basename }}" - name: read partition layout from image - command: "sfdisk -q -r -J '{{ tmpdir.path }}/{{ raspios_output_image_base_name }}'" - register: sfdisk_result + 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 }}" - - debug: - var: sfdisk_result.stdout | from_json + - name: mount boot partition + command: "udisksctl mount --no-user-interaction -b '{{ raspios_image_loop_device }}'" + register: raspios_image_mount - ## TODO: - # udisksctl loop-setup -o {{ partitions[1].start * 512 }} -s {{ partitions[1].start * 512 }} -f '{{ tmpdir.path }}/{{ raspios_download_image_base_name }}.img' - # udisksctl mount -b /dev/loop??? - # - # do customizations.... (needs root?) + - 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: install firstrun.sh script + template: + src: firstrun.sh.j2 + dest: "{{ raspios_image_mount_point }}/firstrun.sh" + mode: 0755 + + - 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: copy newly built raspios image - copy: - src: "{{ tmpdir.path }}/{{ raspios_output_image_base_name }}" - dest: "{{ raspios_output_dir }}/{{ raspios_output_image_base_name }}" + - name: install firstrun.sh script + template: + src: firstrun.sh.j2 + dest: "{{ raspios_image_mount_point }}/firstrun.sh" + mode: 0755 - - name: set output image names - set_fact: - output_images: - - "{{ (raspios_output_dir, raspios_output_image_base_name) | path_join | realpath }}" + - 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: save stdout build-log to output directory - when: raspios_build is defined - copy: - content: "{{ raspios_build.stdout }}\n" - dest: "{{ raspios_output_dir }}/build-stdout.log" - - - name: save stderr build-log to output directory - when: raspios_build is defined - copy: - content: "{{ raspios_build.stderr }}\n" - dest: "{{ raspios_output_dir }}/build-stderr.log" - - - name: delete the temporary build directory - when: not raspios_keep_temporary_build_dir - file: - path: "{{ tmpdir.path }}" - state: absent + - 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_temporary_build_dir + when: + - raspios_keep_boot_dir_mounted debug: - msg: "The temporary build directory has not been deleted, the path to the directory is: {{ tmpdir.path }}" + 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 }}" -- cgit v1.2.3