Re: [PATCH v2 09/15] bootlinux: fix os detection for 9p build dependency installation

Daniel Gomez <[email protected]> Fri, 7 Nov 2025 21:47:26 +0100
Newsgroups dev.linux.lists.kdevops
Organization kernel.org
Message-ID <[email protected]>

On 07/11/2025 21.17, Chuck Lever wrote:
> On 11/7/25 3:00 PM, Daniel Gomez wrote:
>> On 07/11/2025 20.22, Chuck Lever wrote:
>>> On 10/29/25 8:40 AM, Daniel Gomez wrote:
>>>> From: Daniel Gomez <[email protected]>
>>>>
>>>> Dependency installation for 9P builds was checking ansible_os_family,
>>>> which references the target guest's OS instead of the control host where
>>>> packages are actually installed. This caused incorrect packages to be
>>>> installed when building Fedora guests on Debian hosts.
>>>>
>>>> Replace ansible_os_family checks with Kconfig distro variables
>>>> (distro_debian_based, distro_fedora, etc.) which correctly detect
>>>> the control host's distribution. Add fallback defaults to ensure the
>>>> variables are always defined for standalone role usage.
>>>>
>>>> Generated-by: Claude AI
>>>> Suggested-by: Chuck Lever <[email protected]>
>>>
>>> Hrm. I might not have understood the whole picture.
>>>
>>> Yes, distro_yada_based does pick the controller's OS version.
>>> But so does ansible_os_family when the task is running on
>>> localhost.
>>
>> Just a reminder that we control where tasks are deployed with --limit and/or
>> hosts: field in bootlinux.yml. For this case, IIRC, the playbook was run for
>> baseline:dev but tasks were "delegated_to" localhost.
> 
> That's new since I did the "build kernel on a separate target node"
> changes and the related clean-ups in the bootlinux playbook. Not a
> finger-point, just saying we could have collided somewhere.
> 
> 
>>> I just hit a problem with the "build linux on a separate
>>> target node" configuration, where the target is running
>>> Debian 11 and the controller is running Fedora 41. The
>>> bootlinux install-deps/main.yml checks were coming to
>>> the wrong conclusion.
>>
>> Can you share the output? And the --limit argument used in this case?
>> FYI, I normally enable CONFIG_KDEVOPS_MAKE_VERBOSE=y) which prints:
>>
>> make bringup
>> + make linux-clone
>> ==> [guestfs/kdevops_nodes.yaml]
>> + ansible-playbook playbooks/gen_nodes.yml --extra-vars=@./extra_vars.yaml
>> ...
>> ==> [linux-clone-9p]
>> + ansible-playbook --limit localhost playbooks/bootlinux.yml
>> '--extra-vars=target_linux_git=/mirror/linux.git ...
>> ...
> 
> Here's from my scroll-back buffer earlier this afternoon:
> 
> TASK [install-rust-deps : Install Rust build dependencies]
> *************************************************************************************
> included:
> /home/cel/src/kdevops/buildbot-configs/playbooks/roles/install-rust-deps/tasks/install-deps/main.yml
> for kernel-builder
> 
> TASK [install-rust-deps : Install Rust build dependencies]
> *************************************************************************************
> changed: [kernel-builder]
> FAILED - RETRYING: [kernel-builder]: Install packages we care about (3
> retries left).
> FAILED - RETRYING: [kernel-builder]: Install packages we care about (2
> retries left).
> FAILED - RETRYING: [kernel-builder]: Install packages we care about (1
> retries left).
> 
> TASK [bootlinux : Install packages we care about]
> **********************************************************************************************
> task path:
> /home/cel/src/kdevops/buildbot-configs/playbooks/roles/bootlinux/tasks/install-deps/redhat/main.yml:8
> fatal: [kernel-builder]: FAILED! => {
>     "ansible_facts": {
>         "pkg_mgr": "apt"
>     },
>     "attempts": 3,
>     "changed": false
> }
> 
> MSG:
> 
> ('Could not detect which major revision of dnf is in use, which is
> required to determine module backend.', 'You should manually specify
> use_backend to tell the module whether to use the dnf4 or dnf5 backend})')
> 
> 
> As you can see, bootlinux is trying to install the redhat deps on
> the target, but in fact the target is running Debian 11. This is
> because the install-deps play is now looking at distro_yada_based
> even though it is running on the target.

I think we need to detect both cases based on the target selection
(BOOTLINUX_TARGETS). Can you give this a try/check/review?

For 9p targets (controller node, ie BOOTLINUX_9P), we keep the
distro_yada_based. For builder targets (BOOTLINUX_BUILDER) we use the
ansible_os_family:

diff --git a/playbooks/roles/bootlinux/tasks/install-deps/main.yml b/playbooks/roles/bootlinux/tasks/install-deps/main.yml
index 058f3926..88d2baad 100644
--- a/playbooks/roles/bootlinux/tasks/install-deps/main.yml
+++ b/playbooks/roles/bootlinux/tasks/install-deps/main.yml
@@ -1,15 +1,36 @@
 ---
-- name: Debian-specific setup
+- name: Debian-specific setup (9p/controller node)
   ansible.builtin.import_tasks: debian/main.yml
   when:
     - distro_debian_based|bool
+    - bootlinux_9p|bool

-- name: SuSE-specific setup
+- name: Debian-specific setup (builder node)
+  ansible.builtin.import_tasks: debian/main.yml
+  when:
+    - bootlinux_builder|bool
+    - ansible_os_family == "Debian"
+
+- name: SuSE-specific setup (9p/controller node)
   ansible.builtin.import_tasks: suse/main.yml
   when:
     - distro_suse_based|bool
+    - bootlinux_9p|bool

-- name: Red Hat-specific setup
+- name: SuSE-specific setup (builder node)
+  ansible.builtin.import_tasks: suse/main.yml
+  when:
+    - bootlinux_builder|bool
+    - ansible_os_family == "Suse"
+
+- name: Red Hat-specific setup (controller node)
   ansible.builtin.import_tasks: redhat/main.yml
   when:
     - distro_redhat_based|bool
+    - bootlinux_9p|bool
+
+- name: Red Hat-specific setup (builder node)
+  ansible.builtin.import_tasks: redhat/main.yml
+  when:
+    - bootlinux_builder|bool
+    - ansible_os_family == "RedHat"

IIUC, this should return the correct ansible_os_family value when builder target
is selected because the task is executed on the guest with --limit baseline:dev.

> 
> 
>>> So if build.yml was running on the controller, then
>>> ansible_os_family should have been "Debian" for you.
>>> Question is, where was it running? For 9p, I'll bet it
>>> was running on the targets; it might need to run on
>>
>> I think that is correct. It gets a bit more tricky when we have baseline:dev but
>> we also use during the role execution the "delegate_to" localhost.
>>
>>> both localhost and the targets in this case.
>>
>> I thought about that option too but then, some/most of the tasks should be
>> executed on the guests. That path will require to exclude the controller node
>> from them.
> 
> 9p is a weird special case for all of this because the kernel is
> built on the controller and consumed on the targets. I'll bet
> dollars to donuts something is not right with build/9p.yml.
> 
>