--- - name: Validate required network configuration ansible.builtin.fail: msg: | Missing required network configuration for {{ inventory_hostname }}: {% if dns_servers is not defined or dns_servers | length == 0 %} - dns_servers must be defined in inventory with at least one DNS server {% endif %} {% if worker_ip is not defined %} - worker_ip must be defined {% endif %} {% if worker_gateway is not defined %} - worker_gateway must be defined {% endif %} {% if worker_netmask is not defined %} - worker_netmask must be defined {% endif %} {% if network_interface is not defined %} - network_interface must be defined {% endif %} when: > dns_servers is not defined or dns_servers | length == 0 or worker_ip is not defined or worker_gateway is not defined or worker_netmask is not defined or network_interface is not defined - name: Check if s390x boot files exist ansible.builtin.stat: path: "/srv/{{ ocp_name }}/boot/s390x/images/kernel.img" register: boot_files delegate_to: srv08d delegate_facts: true become: true - name: Debug boot files check result ansible.builtin.debug: msg: - "Checking path: /srv/{{ ocp_name }}/boot/s390x/images/kernel.img" - "File exists: {{ boot_files.stat.exists }}" - "Cluster name: {{ ocp_name }}" - name: List actual files in boot directory (as root) ansible.builtin.command: cmd: "find /srv -type f -name '*' | head -20" register: find_result delegate_to: srv08d become: true failed_when: false - name: Show found files ansible.builtin.debug: msg: "Found files in /srv: {{ find_result.stdout_lines }}" - name: Simple ls of /srv directory ansible.builtin.command: cmd: "ls -la /srv/" register: srv_ls delegate_to: srv08d become: true failed_when: false - name: Show /srv directory ansible.builtin.debug: msg: "/srv directory: {{ srv_ls.stdout_lines }}" - name: Check specific directory structure (as root) ansible.builtin.command: cmd: "ls -la /srv/{{ ocp_name }}/boot/s390x/images/" register: ls_result delegate_to: srv08d become: true failed_when: false - name: Show directory listing ansible.builtin.debug: msg: "Directory contents: {{ ls_result.stdout_lines }}" - name: Fail if boot files not found ansible.builtin.fail: msg: "s390x boot files not found. Run the prepare_boot_files tasks first." when: not boot_files.stat.exists - name: Generate worker-specific .prm file with boot parameters ansible.builtin.template: src: generic.prm.j2 dest: "/srv/{{ ocp_name }}/boot/s390x/images/{{ inventory_hostname }}.prm" mode: '0644' owner: "{{ jumphost_user | default('hmc_sftp') }}" group: "{{ jumphost_user | default('hmc_sftp') }}" delegate_to: srv08d become: true - name: Get initrd file size for addrsize ansible.builtin.stat: path: "/srv/{{ ocp_name }}/boot/s390x/images/initrd.img" register: initrd_stat delegate_to: srv08d become: true - name: Generate initrd.addrsize file ansible.builtin.copy: content: "{{ '%08x' | format(initrd_stat.stat.size) }}\n" dest: "/srv/{{ ocp_name }}/boot/s390x/images/initrd.addrsize" mode: '0644' owner: "{{ jumphost_user | default('hmc_sftp') }}" group: "{{ jumphost_user | default('hmc_sftp') }}" delegate_to: srv08d become: true - name: Generate generic .ins file with worker-specific .prm reference ansible.builtin.template: src: generic.ins.j2 dest: "/srv/{{ ocp_name }}/boot/s390x/generic.ins" mode: '0644' owner: "{{ jumphost_user | default('hmc_sftp') }}" group: "{{ jumphost_user | default('hmc_sftp') }}" delegate_to: srv08d become: true - name: Display LPAR boot instructions ansible.builtin.debug: msg: - "" - "╔══════════════════════════════════════════════════════════════════════════════╗" - "║ s390x Worker Node Ready ║" - "╠══════════════════════════════════════════════════════════════════════════════╣" - "║ Node Name: {{ inventory_hostname }}" - "║ Cluster: {{ ocp_name }}" - "║ SFTP Host: 192.144.75.197" - "╠══════════════════════════════════════════════════════════════════════════════╣" - "║ Boot File Locations ║" - "╠══════════════════════════════════════════════════════════════════════════════╣" - "║ SFTP Path: /srv/{{ ocp_name }}/boot/s390x/" - "║ • Kernel: images/kernel.img" - "║ • Initrd: images/initrd.img" - "║ • Boot: generic.ins" - "║ • Params: images/{{ inventory_hostname }}.prm" - "║ • AddrSize: images/initrd.addrsize" - "║" - "║ HTTP URLs (for boot parameters):" - "║ • Rootfs: http://{{ boot_server_ip }}/rootfs.img" - "║ • Ignition: http://{{ boot_server_ip }}/worker.ign" - "╠══════════════════════════════════════════════════════════════════════════════╣" - "║ HMC Boot Steps ║" - "╠══════════════════════════════════════════════════════════════════════════════╣" - "║ 1. Access HMC console for {{ mainframe_cpc | default('CPCD') }}" - "║ 2. Navigate to LPAR {{ inventory_hostname }}" - "║ 3. Configure network boot via SFTP:" - "║ - SFTP Server: 192.144.75.197" - "║ - Username: hmc_sftp" - "║ - Boot Path: /boot/s390x/images/" - "║ 4. Boot with kernel parameters pointing to HTTP URLs above" - "║ 5. Monitor installation progress" - "║ 6. Node will auto-join OpenShift cluster as {{ inventory_hostname }}" - "╚══════════════════════════════════════════════════════════════════════════════╝" - "" - name: Wait for node to join cluster (optional monitoring) kubernetes.core.k8s_info: api_version: v1 kind: Node name: "{{ inventory_hostname }}" kubeconfig: "{{ ocp_cluster_auth }}/kubeconfig" validate_certs: false register: node_status until: node_status.resources | length > 0 retries: 60 delay: 30 when: wait_for_node | default(false) failed_when: false