Skip to content

Commit 07869f5

Browse files
dkrucesmcgrof
authored andcommitted
bootlinux: fix GRUB kernel selection variable scoping
The GRUB detection tasks were running outside the conditional blocks where kernel_release_file variables are available, causing the tasks to be skipped due to undefined variables. Move GRUB detection logic inside the source tree block where kernel_release_file is properly set and accessible. This ensures the correct kernel is selected as the GRUB default boot entry during 'make linux' execution. Generated-by: Claude AI Signed-off-by: Daniel Gomez <[email protected]> Signed-off-by: Luis Chamberlain <[email protected]>
1 parent 049e645 commit 07869f5

File tree

1 file changed

+63
-91
lines changed

1 file changed

+63
-91
lines changed

playbooks/roles/bootlinux/tasks/update-grub/install.yml

Lines changed: 63 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,69 @@
123123
when:
124124
- kernel_release_file.stat.exists
125125

126+
# GRUB detection logic - must be inside the block where kernel_release_file is available
127+
- name: Construct the command line to determine the default boot entry (source tree)
128+
tags:
129+
- saved
130+
ansible.builtin.set_fact:
131+
determine_default_kernel_id: >-
132+
awk -F\' '/menuentry / {print $2}' /boot/grub/grub.cfg |
133+
awk '{print NR-1" ... "$0}' |
134+
grep {{ kernelrelease }} |
135+
head -1 |
136+
awk '{print $1}'
137+
when:
138+
- kernel_release_file.stat.exists
139+
- kernelrelease is defined
140+
- kernelrelease != "unknown"
141+
- ansible_facts['os_family']|lower == 'debian'
142+
143+
- name: Determine the target kernel's GRUB boot entry number (source tree)
144+
tags:
145+
- saved
146+
become: true
147+
become_flags: "su - -c"
148+
become_method: ansible.builtin.sudo
149+
ansible.builtin.shell:
150+
cmd: "{{ determine_default_kernel_id }}"
151+
register: grub_boot_number_cmd
152+
changed_when: false
153+
when:
154+
- kernel_release_file.stat.exists
155+
- kernelrelease is defined
156+
- kernelrelease != "unknown"
157+
- determine_default_kernel_id is defined
158+
159+
- name: Set the target kernel to be booted by default (source tree)
160+
become: true
161+
become_flags: "su - -c"
162+
become_method: sudo
163+
ansible.builtin.command:
164+
cmd: "/usr/sbin/grub-set-default \"{{ grub_boot_number_cmd.stdout_lines.0 }}\""
165+
tags: ["saved"]
166+
when:
167+
- grub_boot_number_cmd is defined
168+
- grub_boot_number_cmd.rc is defined
169+
- grub_boot_number_cmd.rc == 0
170+
- grub_boot_number_cmd.stdout is defined
171+
- grub_boot_number_cmd.stdout != ""
172+
173+
- name: Itemize kernel and GRUB entry selected (source tree)
174+
ansible.builtin.debug:
175+
msg: >-
176+
{{ target_kernel }} determined to be {{ grub_boot_number_cmd.stdout_lines.0 }}
177+
on the GRUB2 flat menu.
178+
Ran: grub-set-default {{ grub_boot_number_cmd.stdout_lines.0 }}
179+
vars:
180+
target_kernel: "{{ target_linux_ref | replace('v', '') }}"
181+
tags: ["saved"]
182+
when:
183+
- grub_boot_number_cmd is defined
184+
- grub_boot_number_cmd.rc is defined
185+
- grub_boot_number_cmd.rc == 0
186+
- grub_boot_number_cmd.stdout is defined
187+
- grub_boot_number_cmd.stdout != ""
188+
126189
- name: Set default kernelrelease if not determined
127190
ansible.builtin.set_fact:
128191
kernelrelease: "unknown"
@@ -149,94 +212,3 @@
149212
when:
150213
- kernel_release_file.stat.exists
151214

152-
- name: Construct the command line to determine the default boot entry
153-
tags:
154-
- saved
155-
ansible.builtin.set_fact:
156-
determine_default_kernel_id: >-
157-
awk -F\' '/menuentry / {print $2}'
158-
/boot/grub/grub.cfg | awk '{print NR-1" ... "$0}' |
159-
grep {{ kernelrelease }} | head -1 | awk '{print $1}'
160-
when:
161-
- kernel_release_file is defined
162-
- kernel_release_file.stat is defined
163-
- kernel_release_file.stat.exists
164-
- kernelrelease is defined
165-
- kernelrelease != "unknown"
166-
- ansible_os_family != "RedHat" or ansible_distribution_major_version | int < 8
167-
168-
- name: Construct the command line to determine default boot entry for RHEL >= 8
169-
tags:
170-
- saved
171-
ansible.builtin.set_fact:
172-
determine_default_kernel_id: >-
173-
for f in $(ls -1 /boot/loader/entries/*.conf); do
174-
cat $f;
175-
done | grep title | awk '{ gsub("title ", "", $0); print }' | grep '{{ kernelrelease }}';
176-
when:
177-
- kernel_release_file is defined
178-
- kernel_release_file.stat is defined
179-
- kernel_release_file.stat.exists
180-
- kernelrelease is defined
181-
- kernelrelease != "unknown"
182-
- ansible_os_family == "RedHat"
183-
- ansible_distribution_major_version | int >= 8
184-
185-
# If this fails then grub-set-default won't be run, and the assumption here
186-
# is either you do the work to enhance the heuristic or live happy with the
187-
# assumption that grub2's default of picking the latest kernel is the best
188-
# option.
189-
- name: Determine the target kernel's GRUB boot entry number
190-
# noqa: command-instead-of-shell
191-
tags:
192-
- saved
193-
become: true
194-
become_flags: "su - -c"
195-
become_method: ansible.builtin.sudo
196-
ansible.builtin.shell:
197-
cmd: "{{ determine_default_kernel_id }}"
198-
register: grub_boot_number_cmd
199-
changed_when: false
200-
when:
201-
- kernel_release_file is defined
202-
- kernel_release_file.stat is defined
203-
- kernel_release_file.stat.exists
204-
205-
- name: Obtain command to set default kernel to boot
206-
ansible.builtin.set_fact:
207-
grub_set_default_boot_kernel: grub-set-default
208-
when: ansible_facts['os_family']|lower != 'redhat' or ansible_facts['distribution_major_version'] | int < 8
209-
210-
- name: Obtain command to set default kernel to boot for RHEL >= 8
211-
ansible.builtin.set_fact:
212-
grub_set_default_boot_kernel: grub2-set-default
213-
when: ansible_facts['os_family']|lower == 'redhat' and ansible_facts['distribution_major_version'] | int >= 8
214-
215-
- name: Set the target kernel to be booted by default moving forward if the above command worked
216-
become: true
217-
become_flags: "su - -c"
218-
become_method: sudo
219-
ansible.builtin.command: "{{ grub_set_default_boot_kernel }} \"{{ target_boot_entry }}\""
220-
vars:
221-
target_boot_entry: "{{ grub_boot_number_cmd.stdout_lines.0 if (grub_boot_number_cmd is defined and grub_boot_number_cmd.stdout_lines is defined) else '' }}"
222-
tags: ["saved"]
223-
when:
224-
- grub_boot_number_cmd is defined
225-
- grub_boot_number_cmd.rc is defined
226-
- grub_boot_number_cmd.rc == 0
227-
- grub_boot_number_cmd.stdout is defined
228-
- grub_boot_number_cmd.stdout != ""
229-
230-
- name: Itemize kernel and GRUB entry we just selected
231-
ansible.builtin.debug:
232-
msg: "{{ target_kernel }} determined to be {{ target_boot_entry }} on the GRUB2 flat menu. Ran: grub-set-default {{ target_boot_entry }}"
233-
vars:
234-
target_kernel: "{{ target_linux_ref | replace('v', '') }}"
235-
target_boot_entry: "{{ grub_boot_number_cmd.stdout_lines.0 }}"
236-
tags: ["saved"]
237-
when:
238-
- grub_boot_number_cmd is defined
239-
- grub_boot_number_cmd.rc is defined
240-
- grub_boot_number_cmd.rc == 0
241-
- grub_boot_number_cmd.stdout is defined
242-
- grub_boot_number_cmd.stdout != ""

0 commit comments

Comments
 (0)