summaryrefslogtreecommitdiffstats
path: root/roles/bootstrap
diff options
context:
space:
mode:
authorAhmed Abdelhalim <[email protected]>2025-08-11 00:33:32 +0200
committerAhmed Abdelhalim <[email protected]>2025-08-11 00:33:32 +0200
commit75b3aaf26bd67d75a6aeb5e6331ff896482acfef (patch)
treeee694ce857fbc4a80ae68c86b0d1253adaa98e32 /roles/bootstrap
parente47ae78cfe17371ce240e134fd66f01ed120ffee (diff)
Add bootstrap debian ubuntu support
Diffstat (limited to 'roles/bootstrap')
-rw-r--r--roles/bootstrap/meta/argument_specs.yml4
-rw-r--r--roles/bootstrap/meta/main.yml3
-rw-r--r--roles/bootstrap/tasks/install-debian.yml118
-rw-r--r--roles/bootstrap/tasks/main.yml4
-rw-r--r--roles/bootstrap/templates/ubuntu.conf.j24
-rw-r--r--roles/bootstrap/vars/ubuntu.yml22
6 files changed, 153 insertions, 2 deletions
diff --git a/roles/bootstrap/meta/argument_specs.yml b/roles/bootstrap/meta/argument_specs.yml
index e391e65..ba63a46 100644
--- a/roles/bootstrap/meta/argument_specs.yml
+++ b/roles/bootstrap/meta/argument_specs.yml
@@ -9,8 +9,8 @@ argument_specs:
partition_boot:
type: "dict"
required: true
- description: "Check partition_boot argument in role: partition"
+ description: "Check partition_root argument in role: partition, required options: mount_path"
partition_root:
type: "dict"
required: true
- description: "Check partition_root argument in role: partition"
+ description: "Check partition_root argument in role: partition, required options: mount_path"
diff --git a/roles/bootstrap/meta/main.yml b/roles/bootstrap/meta/main.yml
index 0e12b9a..0e6a4ce 100644
--- a/roles/bootstrap/meta/main.yml
+++ b/roles/bootstrap/meta/main.yml
@@ -12,3 +12,6 @@ galaxy_info:
- name: ArchLinux
versions:
- all
+ - name: Ubuntu
+ versions:
+ - noble
diff --git a/roles/bootstrap/tasks/install-debian.yml b/roles/bootstrap/tasks/install-debian.yml
new file mode 100644
index 0000000..05d84e9
--- /dev/null
+++ b/roles/bootstrap/tasks/install-debian.yml
@@ -0,0 +1,118 @@
+---
+- name: "Include distribution vars"
+ ansible.builtin.include_vars: "{{ ansible_distribution | lower }}.yml"
+
+- name: "Ensure install dependencies are installed on live environment"
+ ansible.builtin.apt:
+ state: "present"
+ update_cache: true
+ pkg:
+ - "debootstrap"
+ - "arch-install-scripts"
+ - "bash"
+
+- name: "Run debootstrap"
+ ansible.builtin.command:
+ cmd: "debootstrap
+ {{ bootstrap_opts }}
+ {{ bootstrap_distro.name }}
+ {{ mnt_root_path }}
+ {{ bootstrap_distro.mirror_url }}"
+ register: bootstrap_result
+ changed_when: true
+
+- name: "Display bootstrap output"
+ ansible.builtin.debug:
+ var: bootstrap_result.stdout_lines
+ verbosity: 1
+
+- name: "Generate fstab"
+ ansible.builtin.shell:
+ cmd: "genfstab -t PARTLABEL {{ mnt_root_path }} > {{ mnt_root_path }}/etc/fstab"
+ changed_when: true
+
+- name: "Configure apt in chroot"
+ ansible.builtin.copy:
+ dest: "{{ item.dest }}"
+ mode: "0640"
+ content: "{{ item.content }}"
+ with_items:
+ - dest: "{{ mnt_root_path }}/etc/apt/preferences.d/ignored-package"
+ content: "{{ bootstrap_apt_ignored_preferences }}"
+ - dest: "{{ mnt_root_path }}/etc/apt/sources.list"
+ content: "{{ bootstrap_apt_sources }}"
+
+- name: "Configure system in chroot"
+ ansible.builtin.command:
+ cmd: "arch-chroot {{ mnt_root_path }} {{ item }}"
+ changed_when: true
+ with_items:
+ - "apt-get update"
+ - "apt-get install -y {{ bootstrap_distro.kernel_packages | join(' ') }}"
+ - "apt-get install -y systemd-boot systemd-boot-efi"
+
+- name: "Run bootclt"
+ ansible.builtin.command:
+ cmd: "arch-chroot {{ mnt_root_path }} bootctl install"
+ changed_when: true
+
+- name: "Get machine-id"
+ ansible.builtin.command:
+ cmd: "cat {{ mnt_root_path }}/etc/machine-id"
+ changed_when: false
+ register: bootstrap_machine_id
+
+- name: "Get Kernel version"
+ ansible.builtin.shell: |
+ set -eo pipefail
+ ls {{ mnt_root_path }}/boot/vmlinuz-* | sed 's/.*vmlinuz-//'
+ args:
+ executable: /usr/bin/bash
+ changed_when: false
+ register: bootstrap_kernel_version
+
+- name: "Create distro kernel directory"
+ ansible.builtin.file:
+ path: "{{ mnt_boot_path }}/{{ ansible_distribution | lower }}"
+ state: "directory"
+ mode: "0700"
+
+- name: "Copy kernel to efi partition"
+ ansible.builtin.copy:
+ src: "{{ item }}"
+ dest: "{{ mnt_boot_path }}/{{ ansible_distribution | lower }}"
+ remote_src: true
+ mode: "0644"
+ with_items:
+ - "{{ mnt_root_path }}/boot/vmlinuz-{{ bootstrap_kernel_version.stdout }}"
+ - "{{ mnt_root_path }}/boot/initrd.img-{{ bootstrap_kernel_version.stdout }}"
+
+- name: "Template systemd-boot files"
+ ansible.builtin.template:
+ src: "{{ item.src }}"
+ dest: "{{ item.dest }}"
+ mode: "0644"
+ with_items:
+ - src: "loader.conf.j2"
+ dest: "{{ mnt_boot_path }}/loader/loader.conf"
+ - src: "{{ ansible_distribution | lower }}.conf.j2"
+ dest: "{{ mnt_boot_path }}/loader/entries/{{ ansible_distribution | lower }}.conf"
+
+- name: "Clean up debian kernel install"
+ ansible.builtin.file:
+ path: "{{ item }}"
+ state: "absent"
+ with_items:
+ - "{{ mnt_boot_path }}/{{ bootstrap_machine_id.stdout }}"
+ - "{{ mnt_boot_path }}/loader/entries/{{ bootstrap_machine_id.stdout }}-{{ bootstrap_kernel_version.stdout }}.conf"
+
+- name: "Configure hostname in chroot"
+ ansible.builtin.copy:
+ dest: "{{ mnt_root_path }}/etc/hostname"
+ mode: "0644"
+ content: "{{ hostname }}"
+
+- name: "Ensure ansible dependencies are installed in chroot"
+ ansible.builtin.command:
+ cmd: "arch-chroot {{ mnt_root_path }} apt-get install -y python3"
+ changed_when: true
diff --git a/roles/bootstrap/tasks/main.yml b/roles/bootstrap/tasks/main.yml
index fb9653f..af5dc49 100644
--- a/roles/bootstrap/tasks/main.yml
+++ b/roles/bootstrap/tasks/main.yml
@@ -8,3 +8,7 @@
- name: "Install archlinux"
ansible.builtin.include_tasks: "install-archlinux.yml"
when: ansible_os_family == "Archlinux"
+
+- name: "Install debian"
+ ansible.builtin.include_tasks: "install-debian.yml"
+ when: ansible_os_family == "Debian"
diff --git a/roles/bootstrap/templates/ubuntu.conf.j2 b/roles/bootstrap/templates/ubuntu.conf.j2
new file mode 100644
index 0000000..4c8afa8
--- /dev/null
+++ b/roles/bootstrap/templates/ubuntu.conf.j2
@@ -0,0 +1,4 @@
+title Ubuntu 24.04
+linux /ubuntu/vmlinuz-{{ bootstrap_kernel_version.stdout }}
+initrd /ubuntu/initrd.img-{{ bootstrap_kernel_version.stdout }}
+options root=PARTLABEL={{ partition_root.name }} rw queit splash
diff --git a/roles/bootstrap/vars/ubuntu.yml b/roles/bootstrap/vars/ubuntu.yml
new file mode 100644
index 0000000..829ecae
--- /dev/null
+++ b/roles/bootstrap/vars/ubuntu.yml
@@ -0,0 +1,22 @@
+---
+bootstrap_distro:
+ name: "noble" # => Ubuntu 24.04
+ mirror_url: "http://archive.ubuntu.com/ubuntu/"
+ kernel_packages:
+ - "linux-generic-hwe-24.04"
+
+bootstrap_opts: ""
+
+bootstrap_apt_ignored_preferences: |
+ Package: grub-common grub2-common grub-pc grub-pc-bin grub-gfxpayload-lists
+ Pin: release *
+ Pin-Priority: -1
+
+ Package: snapd cloud-init landscape-common popularity-contest ubuntu-advantage-tools
+ Pin: release *
+ Pin-Priority: -1
+
+bootstrap_apt_sources: |
+ deb http://archive.ubuntu.com/ubuntu {{ bootstrap_distro.name }} main universe
+ deb http://archive.ubuntu.com/ubuntu {{ bootstrap_distro.name }}-security main universe
+ deb http://archive.ubuntu.com/ubuntu {{ bootstrap_distro.name }}-updates main universe