kayobe/ansible/roles/drac-pxe/tasks/main.yml

187 lines
6.6 KiB
YAML

---
- name: Check the boot mode
raw: "racadm get BIOS.BiosBootSettings.BootMode"
register: result
failed_when: "'ERROR' in result.stdout"
changed_when: False
- name: Initialise some facts about configuration jobs
set_fact:
# List of job IDs that have been created.
job_ids: []
# Whether a BIOS configuration job is required.
bios_job_required: False
- name: Set a fact containing the boot mode
set_fact:
# Format of last line is:
# BootMode=<boot mode>[ (Pending Value=<pending boot mode>)]
boot_mode_is_uefi: "{{ result.stdout_lines[-1] == 'BootMode=Uefi' }}"
boot_mode_is_bios: "{{ result.stdout_lines[-1] == 'BootMode=Bios' }}"
- name: Fail if unable to determine the boot mode
fail:
msg: >
Unable to determine the boot mode. Got: {{ result.stdout }}. Expected
bios or uefi.
when:
- not boot_mode_is_bios
- not boot_mode_is_uefi
- name: Check the BIOS boot sequence
raw: "racadm get BIOS.BiosBootSettings.{% if boot_mode_is_uefi %}Uefi{% endif %}BootSeq"
register: result
failed_when: "'ERROR' in result.stdout"
changed_when: False
- name: Set a fact containing the boot sequence
set_fact:
# Format of last line is:
# BootSeq=<boot sequence>[ (Pending Value=<pending boot sequence>)]
current_boot_sequence: "{{ result.stdout_lines[-1].partition('=')[2] }}"
required_boot_sequence: "{{ boot_mode_is_uefi | ternary(drac_pxe_uefi_boot_sequence, drac_pxe_bios_boot_sequence) }}"
- name: Fail if there is a pending boot sequence configuration change
fail:
msg: >
There is a pending boot sequence configuration change. Please
apply this change before continuing.
when: "'Pending' in current_boot_sequence"
- block:
- name: Check the NICs' boot protocol
raw: "racadm get Nic.NICConfig.{{ item }}.LegacyBootProto"
with_items: "{{ drac_pxe_all_interfaces }}"
register: result
failed_when: "'ERROR' in result.stdout"
changed_when: False
- name: Initialise a fact containing the NICs' boot protocol
set_fact:
nic_boot_protos: []
- name: Set a fact containing the NICs' boot protocol
set_fact:
nic_boot_protos: >
{{ nic_boot_protos +
[{'nic': item.item,
'required': 'PXE' if item.item == drac_pxe_interface else 'NONE',
'current': item.stdout_lines[-1].partition('=')[2]}] }}
with_items: "{{ result.results }}"
- name: Fail if there are pending NIC boot protocol changes
fail:
msg: >
There is a pending NIC boot protocol configuration change for
NIC {{ item.nic }}. Please apply this before continuing.
with_items: "{{ nic_boot_protos }}"
when: "'Pending' in item.current"
- name: Ensure NIC boot protocol is configured
raw: "racadm set Nic.NICConfig.{{ item.nic }}.LegacyBootProto {{ item.required }}"
with_items: "{{ nic_boot_protos }}"
when: item.current != item.required
register: result
failed_when: "'ERROR' in result.stdout"
until: "{{ drac_pxe_busy_message not in result.stdout }}"
retries: "{{ drac_pxe_retries }}"
delay: "{{ drac_pxe_interval }}"
- name: Ensure NIC configuration jobs are created
raw: "racadm jobqueue create NIC.Integrated.1-{{ item.nic }}-1 -s TIME_NOW"
with_items: "{{ nic_boot_protos }}"
when: item.current != item.required
register: result
failed_when: "'ERROR' in result.stdout"
until: "{{ drac_pxe_busy_message not in result.stdout }}"
retries: "{{ drac_pxe_retries }}"
delay: "{{ drac_pxe_interval }}"
- name: Set a fact containing the NIC configuration job IDs
set_fact:
job_ids: "{{ job_ids + [item.stdout_lines[-1].split()[-1]] }}"
with_items: "{{ result.results }}"
when: not item.skipped
when: boot_mode_is_bios
- block:
- name: Check the UEFI PXE interface
raw: "racadm get BIOS.PxeDev1Settings.PxeDev1Interface"
register: result
failed_when: "'ERROR' in result.stdout"
changed_when: False
- name: Set a fact containing the UEFI PXE interface
set_fact:
current_pxe_interface: "{{ result.stdout_lines[-1].partition('=')[2]}] }}"
required_pxe_interface: "{{ 'NIC.Integrated.1-' ~ drac_pxe_interface ~ '-1' }}"
- name: Fail if there are pending UEFI PXE interface changes
fail:
msg: >
There is a pending UEFI PXE interface configuration change.
Please apply this before continuing.
when: "'Pending' in current_pxe_interface"
- name: Ensure UEFI PXE device is configured
raw: "racadm set BIOS.PxeDev1Settings.PxeDev1Interface NIC.Integrated.1-{{ drac_pxe_interface }}-1"
register: result
failed_when: "'ERROR' in result.stdout"
until: "{{ drac_pxe_busy_message not in result.stdout }}"
retries: "{{ drac_pxe_retries }}"
delay: "{{ drac_pxe_interval }}"
when: current_pxe_interface != required_pxe_interface
- name: Set a fact to trigger a BIOS configuration job
set_fact:
bios_job_required: True
when: current_pxe_interface != required_pxe_interface
when: boot_mode_is_uefi
- name: Ensure boot sequence is configured
raw: "racadm set BIOS.BiosBootSettings.BootSeq {{ drac_pxe_bios_boot_sequence }}"
register: result
failed_when: "'ERROR' in result.stdout"
until: "{{ drac_pxe_busy_message not in result.stdout }}"
retries: "{{ drac_pxe_retries }}"
delay: "{{ drac_pxe_interval }}"
when: current_boot_sequence != required_boot_sequence
- name: Set a fact to trigger a BIOS configuration job
set_fact:
bios_job_required: True
when: current_boot_sequence != required_boot_sequence
- name: Ensure BIOS configuration job is created
raw: "racadm jobqueue create BIOS.Setup.1-1 -s TIME_NOW"
register: result
failed_when: "'ERROR' in result.stdout"
until: "{{ drac_pxe_busy_message not in result.stdout }}"
retries: "{{ drac_pxe_retries }}"
delay: "{{ drac_pxe_interval }}"
when: bios_job_required
- name: Set a fact containing the BIOS configuration job ID
set_fact:
# Format of the last line is:
# JOB_ID = <job ID>
job_ids: "{{ job_ids + [result.stdout_lines[-1].split()[-1]] }}"
when: bios_job_required
- name: Ensure server is rebooted
raw: "racadm serveraction powercycle"
register: result
failed_when: "'ERROR' in result.stdout"
- name: Wait for the configuration jobs to complete
raw: "racadm jobqueue view -i {{ item }}"
with_items: "{{ job_ids }}"
when: job_ids | length > 0
register: result
failed_when: "'ERROR' in result.stdout"
until: "{{ 'Status=Completed' in result.stdout }}"
retries: "{{ drac_pxe_timeout // drac_pxe_interval }}"
delay: "{{ drac_pxe_interval }}"