dell / dellemc-openmanage-ansible-modules

Dell OpenManage Ansible Modules
GNU General Public License v3.0
332 stars 162 forks source link

[BUG]: unable to set IscsiDev1ConXVlanID #682

Open sistarers opened 3 months ago

sistarers commented 3 months ago

Bug Description

See https://github.com/dell/dellemc-openmanage-ansible-modules/issues/648 for additional details. The same ansible controller, version, dellemc.ome collection etc is now unable to set the IscsiDev1ConXVlanID value.

ansible [core 2.14.14] config file = /etc/ansible/ansible.cfg configured module search path = ['/home/ncraf/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3.9/site-packages/ansible ansible collection location = /home/ncraf/.ansible/collections:/usr/share/ansible/collections executable location = /usr/local/bin/ansible python version = 3.9.18 (main, Jan 24 2024, 00:00:00) [GCC 11.4.1 20231218 (Red Hat 11.4.1-3)] (/usr/bin/python3) jinja version = 3.1.2 libyaml = True

Component or Module Name

dellemc.openmanage.idrac_bios:

Ansible Version

Ansible 2.14.14

Python Version

Python 3.9.18

iDRAC/OME/OME-M version

iDRAC: 7.00.00.171, BIOS: 2.9.4

iDRAC: 7.10.30.05, BIOS: 2.1.5

Operating System

N/A but O/S will eventually be esxi 8.x or 7.x: this setting is required in order for the blade to find it's boot disk via iSCSI so the O/S can be installed

Playbook Used

will upload in subsequent post

Logs

[UP - Set BIOS to default settings using specific A/V pairs MX760s] ***** Wednesday 12 June 2024 19:51:26 +0000 (0:00:00.063) 0:00:03.695 **** Wednesday 12 June 2024 19:51:26 +0000 (0:00:00.063) 0:00:03.694 **** fatal: [cmc_2Y5MW04_blade1-9W5MW04 -> localhost]: FAILED! => {"changed": false, "msg": "HTTP Error 400 on PATCH request to 'https://10.200.4.166/redfish/v1/Systems/System.Embedded.1/Bios/Settings', extended message: 'Unable to set the object properties because an incorrect object value is entered.'"}

TASK [UP - Set BIOS to default settings using specific A/V pairs MX740s] ***** Wednesday 12 June 2024 19:51:29 +0000 (0:00:03.884) 0:00:07.579 **** Wednesday 12 June 2024 19:51:29 +0000 (0:00:03.884) 0:00:07.578 **** fatal: [cmc_CP40PZ3_blade2-D2NK243 -> localhost]: FAILED! => {"changed": false, "msg": "HTTP Error 400 on PATCH request to 'https://10.200.4.209/redfish/v1/Systems/System.Embedded.1/Bios/Settings', extended message: 'Unable to set the object properties because an incorrect object value is entered.'"}

Steps to Reproduce

run playbook on different platforms of mx740c and mx760c blades

Expected Behavior

vlan integer value is set per the playbook either by variable or by hard coded value in playbook

Actual Behavior

error above occurs

Screenshots

No response

Additional Information

No response

sistarers commented 3 months ago

error(s) below, I initiated the playbook with the following command. If the eventvlan variable in the playbook is set using -- eventvlan: anyInteger an the -e eventvlan=anyInteger is not passed then the playbook executes successfully.

ansible-playbook idracup.yml -i labbladestest.hosts -l test_blades02,localhost -e "month=06 eventname=jmnautoevent91 eventvlan=3015" --tags netapp,config_bios

TASK [CONFIGURE unique iSCSI attributes on blade BIOS OME MX740c's] *****************************
Friday 14 June 2024  19:50:15 +0000 (0:00:00.048)       0:00:07.531 *********** 
Friday 14 June 2024  19:50:15 +0000 (0:00:00.048)       0:00:07.531 *********** 
fatal: [cmc_CP40PZ3_blade2-D2NK243]: FAILED! => {"changed": false, "error_info": {"error": {"@Message.ExtendedInfo": [{"Message": "The value 'integer' for the property IscsiDev1Con1VlanId is of a different type than the property can accept.", "MessageArgs": ["integer", "IscsiDev1Con1VlanId"], "MessageArgs@odata.count": 2, "MessageId": "Base.1.12.PropertyValueTypeError", "RelatedProperties": ["#/Attributes/IscsiDev1Con1VlanId"], "RelatedProperties@odata.count": 1, "Resolution": "Correct the value for the property in the request body and resubmit the request if the operation failed.", "Severity": "Warning"}, {"Message": "The value 'integer' for the property IscsiDev1Con2VlanId is of a different type than the property can accept.", "MessageArgs": ["integer", "IscsiDev1Con2VlanId"], "MessageArgs@odata.count": 2, "MessageId": "Base.1.12.PropertyValueTypeError", "RelatedProperties": ["#/Attributes/IscsiDev1Con2VlanId"], "RelatedProperties@odata.count": 1, "Resolution": "Correct the value for the property in the request body and resubmit the request if the operation failed.", "Severity": "Warning"}, {"Message": "The value 'integer' for the property IscsiDev1Con1VlanId is of a different type than the property can accept.", "MessageArgs": ["integer", "IscsiDev1Con1VlanId"], "MessageArgs@odata.count": 2, "MessageId": "Base.1.12.PropertyValueTypeError", "RelatedProperties": ["#/Attributes/IscsiDev1Con1VlanId"], "RelatedProperties@odata.count": 1, "Resolution": "Correct the value for the property in the request body and resubmit the request if the operation failed.", "Severity": "Warning"}, {"Message": "The value 'integer' for the property IscsiDev1Con2VlanId is of a different type than the property can accept.", "MessageArgs": ["integer", "IscsiDev1Con2VlanId"], "MessageArgs@odata.count": 2, "MessageId": "Base.1.12.PropertyValueTypeError", "RelatedProperties": ["#/Attributes/IscsiDev1Con2VlanId"], "RelatedProperties@odata.count": 1, "Resolution": "Correct the value for the property in the request body and resubmit the request if the operation failed.", "Severity": "Warning"}], "code": "Base.1.12.GeneralError", "message": "A general error has occurred. See ExtendedInfo for more information"}}, "msg": "HTTP Error 400: Bad Request"}

TASK [print unique_bios iscsi attributes register] **********************************************
Friday 14 June 2024  19:50:18 +0000 (0:00:03.524)       0:00:11.056 *********** 
Friday 14 June 2024  19:50:18 +0000 (0:00:03.524)       0:00:11.055 *********** 

TASK [CONFIGURE unique iSCSI attributes on blade BIOS OME MX760c's] *****************************
Friday 14 June 2024  19:50:18 +0000 (0:00:00.036)       0:00:11.092 *********** 
Friday 14 June 2024  19:50:18 +0000 (0:00:00.036)       0:00:11.092 *********** 
fatal: [cmc_2Y5MW04_blade1-9W5MW04]: FAILED! => {"changed": false, "error_info": {"error": {"@Message.ExtendedInfo": [{"Message": "The value 'integer' for the property IscsiDev1Con1VlanId is of a different type than the property can accept.", "MessageArgs": ["integer", "IscsiDev1Con1VlanId"], "MessageArgs@odata.count": 2, "MessageId": "Base.1.12.PropertyValueTypeError", "RelatedProperties": ["#/Attributes/IscsiDev1Con1VlanId"], "RelatedProperties@odata.count": 1, "Resolution": "Correct the value for the property in the request body and resubmit the request if the operation failed.", "Severity": "Warning"}, {"Message": "The value 'integer' for the property IscsiDev1Con2VlanId is of a different type than the property can accept.", "MessageArgs": ["integer", "IscsiDev1Con2VlanId"], "MessageArgs@odata.count": 2, "MessageId": "Base.1.12.PropertyValueTypeError", "RelatedProperties": ["#/Attributes/IscsiDev1Con2VlanId"], "RelatedProperties@odata.count": 1, "Resolution": "Correct the value for the property in the request body and resubmit the request if the operation failed.", "Severity": "Warning"}, {"Message": "The value 'integer' for the property IscsiDev1Con1VlanId is of a different type than the property can accept.", "MessageArgs": ["integer", "IscsiDev1Con1VlanId"], "MessageArgs@odata.count": 2, "MessageId": "Base.1.12.PropertyValueTypeError", "RelatedProperties": ["#/Attributes/IscsiDev1Con1VlanId"], "RelatedProperties@odata.count": 1, "Resolution": "Correct the value for the property in the request body and resubmit the request if the operation failed.", "Severity": "Warning"}, {"Message": "The value 'integer' for the property IscsiDev1Con2VlanId is of a different type than the property can accept.", "MessageArgs": ["integer", "IscsiDev1Con2VlanId"], "MessageArgs@odata.count": 2, "MessageId": "Base.1.12.PropertyValueTypeError", "RelatedProperties": ["#/Attributes/IscsiDev1Con2VlanId"], "RelatedProperties@odata.count": 1, "Resolution": "Correct the value for the property in the request body and resubmit the request if the operation failed.", "Severity": "Warning"}], "code": "Base.1.12.GeneralError", "message": "A general error has occurred. See ExtendedInfo for more information"}}, "msg": "HTTP Error 400: Bad Request"}
###########################################################################
# © Copyright 2024 - 2030, Circadence Corporation and Network Excellence. #
###########################################################################

---
- name: poll NetApp for event SVM info
  hosts: localhost
  # connection: local
  gather_facts: false
  collections:
    - netapp.ontap
  vars:
    login: &netapp_login
      hostname: "10.90.10.20"
      username: "rsistare.api"
      password: "Password1!"
      https: true
      validate_certs: false
    parent_int: a0a
    eventname: jmnautoevent01

  tasks:
  # - name: add netapp-lib
  #   ansible.builtin.shell: pip3.9 install netapp-lib
  #   tags:
  #     - netapp

  - name: print original event name
    debug:
      msg: 
        - "original event name {{ eventname }}"
    tags:
      - list
      - netapp

  - name: check event name {{ eventname }} for unwanted characters
    set_fact:
      chkd_eventname: "{{ eventname | regex_replace('[-!@#$%^&*()_+~`/?.>,<|\\[\\]{}]','_') }}"
    tags:
      - list
      - netapp

  - name: print new event name
    debug:
      msg: 
        - "accepted event name {{ chkd_eventname }}"
    tags:
      - list
      - netapp

  - name: Get NetApp iscsi target alias
    netapp.ontap.na_ontap_command:
      <<: *netapp_login
      use_rest: never
      command: "iscsi show -target-alias svm_{{ chkd_eventname }}_auto -fields target-name"
      return_dict: true
      exclude_lines: 'server'
      include_lines: 'iqn.'
    register: na_output
    tags:
      - netapp

  # - name: Print iSCSI show CMD output
  #   debug:
  #     var: na_output
  #   tags:
  #     - netapp

  - name: store SVM iSCSI target IQN in register
    set_fact:
      na_tiqn: "{{ na_output.msg.stdout_lines_filter[0] | regex_search('iqn.*') }}"
    tags:
      - netapp

  - name: get igroup info from cluster
    netapp.ontap.na_ontap_rest_info: 
      <<: *netapp_login
      # use_rest: always
      gather_subset:
        - protocols/san/igroups
        # - igroup_info
    register: ontap_info
    tags:
      - netapp

  # - name: display ontap igroup info for event svm
  #   debug:
  #     var: item.uuid
  #   loop: "{{ ontap_info.ontap_info['protocols/san/igroups'].records }}"
  #   when:
  #     - item.svm.name == "svm_jmnautoevent01_auto"
  #   tags:
  #     - netapp

  - name: build igroup uuid list
    set_fact: 
      naigroup_uuid: "{{ naigroup_uuid | default([]) + [item.uuid] | unique }}"
    loop: "{{ ontap_info.ontap_info['protocols/san/igroups'].records }}"
    when:
      - item.svm.name == "svm_{{ chkd_eventname }}_auto"
    tags:
      - netapp

  - name: get svm igroup info
    ansible.builtin.uri:
      url_username: "{{ login.username }}"
      url_password: "{{ login.password }}"
      url: https://{{ login.hostname }}/api/protocols/san/igroups/{{ item }}/initiators/
      validate_certs: false
      return_content: true
      force_basic_auth: true
    register: this
    loop: "{{ naigroup_uuid }}"
    tags:
      - netapp

  - name: set source iqn fact for blades in igroup
    set_fact:
      na_siqn: "{{ na_siqn | default([]) + [item.json.records[0].name] | unique | sort }}"
    loop: "{{ this.results }}"
    tags:
      - netapp

  - name: Print target IQN target from SVM
    debug:
      msg: 
        - " The target iqn on event {{ eventname }} svm is: {{ na_tiqn }}"
        - " the source iqn's are: {{ na_siqn }}"
    tags:
      - netapp

# - name: GET CMC Inventory - MX7K
#   hosts: mx7k_cmc
#   connection: local
#   gather_facts: false

#   vars:
#     cmc_baseuri: "{{ baseuri }}"
#     dell_login: &dell_login
#       username: "{{ username }}"
#       password: "{{ password }}"
#     template: ~/jmnauto/dell/

#   tasks:
#   - name: Gather info from MX7K
#     dellemc.openmanage.ome_device_info:
#       # fact_subset: detailed_inventory
#       hostname: "{{ baseuri }}"
#       username: "{{ username }}"
#       password: "{{ password }}"
#       # <<: *dell_login
#       validate_certs: false
#     register: CMCDevInfo
#     tags:
#       - cmc

  # - name: print native OME device info
  #   debug:
  #     var: CMCDevInfo.device_info.["@odata.count"]
  #   tags:
  #     - cmc

  # - name: Copy results to output file
  #   ansible.builtin.copy:
  #     content: "{{ CMCDevInfo | to_nice_json }}"
  #     dest: "{{ template }}_CMCDevInfo-{{ inventory_hostname }}.json"
  #   delegate_to: localhost
  #   tags:
  #     - cmc

  # - name: Print results of register #working query of CMC device info
  #   debug:
  #     var: CMCDevInfo.ansible_facts.device_info
  #   tags:
  #     - cmc

  # - name: Print results of register
  #   debug:
  #     var: item.Id
  #   loop: "{{ CMCDevInfo.device_info.value }}"
  #   loop_control:
  #     label: "{{ item.Id }}"
  #   delegate_to: localhost
  #   when:
  #     - item.Model == 'PowerEdge MX760c' or item.Model == 'PowerEdge MX740c'
  #   tags:
  #     - cmc

- name: Dell iDRAC Event Configuration
  hosts: event_blades
  connection: local
  gather_facts: false

  vars:
    hosts_count: 
      - 1
      - 2
    year: "2024"
    month: "05"
    # eventvlan: 3015
    blade_login: &blade_login
      username: "{{ username }}"
      password: "{{ password }}"
    idrac_login: &idrac_login
      idrac_user: "{{ username }}"
      idrac_password: "{{ password }}"
    template: ~/jmnauto/dell/
    reboot_uri: "/redfish/v1/Systems/System.Embedded.1/Actions/ComputerSystem.Reset"
    retries_count: 10
    polling_interval: 3
    common_iscsi_attributes:
      IscsiDev1Con1DhcpEnDis: "Disabled"
      IscsiDev1Con1EnDis: "Enabled"
      IscsiDev1Con1Gateway: "192.168.5.254"
      IscsiDev1Con1Interface: "NIC.Mezzanine.1A-1-1"
      IscsiDev1Con1Lun: "0"
      IscsiDev1Con1Port: 3260
      IscsiDev1Con1Protocol: "IPv4"
      IscsiDev1Con1Retry: 3
      IscsiDev1Con1RevChapName: ""
      IscsiDev1Con1RevChapSecret: ""
      IscsiDev1Con1TargetIp: "192.168.5.254"
      IscsiDev1Con1TargetName: "{{ hostvars['localhost']['na_tiqn'] }}"
      IscsiDev1Con1TgtDhcpEnDis: "Disabled"
      IscsiDev1Con1Timeout: 10000
      IscsiDev1Con1VlanEnDis: "Enabled"
      IscsiDev1Con1VlanId: "{{ eventvlan|int }}"
      IscsiDev1Con1VlanPriority: 0
      IscsiDev1Con2DhcpEnDis: "Disabled"
      IscsiDev1Con2EnDis: "Enabled"
      IscsiDev1Con2Gateway: "192.168.5.254"
      IscsiDev1Con2Interface: "NIC.Mezzanine.1A-1-1"
      IscsiDev1Con2Lun: "0"
      IscsiDev1Con2Port: 3260
      IscsiDev1Con2Protocol: "IPv4"
      IscsiDev1Con2Retry: 3
      IscsiDev1Con2RevChapName: ""
      IscsiDev1Con2RevChapSecret: ""
      IscsiDev1Con2TargetIp: "192.168.5.254"
      IscsiDev1Con2TargetName: "{{ hostvars['localhost']['na_tiqn'] }}"
      IscsiDev1Con2TgtDhcpEnDis: "Disabled"
      IscsiDev1Con2Timeout: 10000
      IscsiDev1Con2VlanEnDis: "Enabled"
      IscsiDev1Con2VlanId: "{{ eventvlan|int }}"
      IscsiDev1Con2VlanPriority: 0
      IscsiDev1EnDis: "Enabled"
      IscsiDev1Con1Ip: "192.168.5.{{ 10 + blade_id|int }}"
      IscsiDev1Con1Mask: "255.255.255.0"
      IscsiDev1Con2Ip: "192.168.5.{{ 20 + blade_id|int }}"
      IscsiDev1Con2Mask: "255.255.255.0"
      IscsiInitiatorName: "iqn.{{ year }}-{{ month }}.jmn.ncrc:host{{ blade_index_id|int }}"
    common_iscsi_attributes760:
      IscsiDev1Con1DhcpEnDis: "Disabled"
      IscsiDev1Con1EnDis: "Enabled"
      IscsiDev1Con1Gateway: "192.168.5.254"
      IscsiDev1Con1Interface: "NIC.Mezzanine.1A-1-1"
      IscsiDev1Con1Lun: "0"
      IscsiDev1Con1Port: 3260
      IscsiDev1Con1Protocol: "IPv4"
      IscsiDev1Con1Retry: 3
      IscsiDev1Con1RevChapName: ""
      IscsiDev1Con1RevChapSecret: ""
      IscsiDev1Con1TargetIp: "192.168.5.254"
      IscsiDev1Con1TargetName: "{{ hostvars['localhost']['na_tiqn'] }}"
      IscsiDev1Con1TgtDhcpEnDis: "Disabled"
      IscsiDev1Con1Timeout: 10000
      IscsiDev1Con1VlanEnDis: "Enabled"
      IscsiDev1Con1VlanId: "{{ eventvlan|int }}"
      IscsiDev1Con1VlanPriority: 0
      IscsiDev1Con2DhcpEnDis: "Disabled"
      IscsiDev1Con2EnDis: "Enabled"
      IscsiDev1Con2Gateway: "192.168.5.254"
      IscsiDev1Con2Interface: "NIC.Mezzanine.1A-1-1"
      IscsiDev1Con2Lun: "0"
      IscsiDev1Con2Port: 3260
      IscsiDev1Con2Protocol: "IPv4"
      IscsiDev1Con2Retry: 3
      IscsiDev1Con2RevChapName: ""
      IscsiDev1Con2RevChapSecret: ""
      IscsiDev1Con2TargetIp: "192.168.5.254"
      IscsiDev1Con2TargetName: "{{ hostvars['localhost']['na_tiqn'] }}"
      IscsiDev1Con2TgtDhcpEnDis: "Disabled"
      IscsiDev1Con2Timeout: 10000
      IscsiDev1Con2VlanEnDis: "Enabled"
      IscsiDev1Con2VlanId: "{{ eventvlan|int }}"
      IscsiDev1Con2VlanPriority: 0
      IscsiDev1EnDis: "Enabled"
      IscsiDev1Con1Ip: "192.168.5.{{ 10 + blade_id|int }}"
      IscsiDev1Con1Mask: "255.255.255.0"
      IscsiDev1Con2Ip: "192.168.5.{{ 20 + blade_id|int }}"
      IscsiDev1Con2Mask: "255.255.255.0"
      IscsiInitiatorName: "iqn.{{ year }}-{{ month }}.jmn.ncrc:host{{ blade_index_id|int }}"
    ansible_python_interpreter: "/usr/bin/env python3"
    idrac_osd_command_allowable_values: ["BootToNetworkISO", "GetAttachStatus", "DetachISOImage"]
    idrac_osd_command_default: "GetAttachStatus"
    GetAttachStatus_Code:
      DriversAttachStatus:
        "0": "NotAttached"
        "1": "Attached"
      ISOAttachStatus:
        "0": "NotAttached"
        "1": "Attached"
    idrac_https_port: 443
    expose_duration: 1080
    command: "{{ idrac_osd_command_default }}"
    validate_certs: no
    force_basic_auth: yes
    share_name: "10.200.4.229:/vol_gold_lun_nfs"
    ubuntu_iso: esxi_8.0.0u1a-21813344_x86-64-customized.iso

  tasks:
  # - name: VERIFY sanitized state blade IP ADDR

  # - name: VERIFY sanitized state BIOS iSCSI

  - name: Gather date from localhost
    ansible.builtin.command: date '+%b-%d-%Y-%H-%M-%S'
    register: local_date
    run_once: true
    delegate_to: localhost
    changed_when: false
    tags:
      - config_bios

  - name: get blade count 
    set_fact:
      blade_count: "{{ ansible_play_hosts_all | count }}"
    delegate_to: localhost
    tags:
      - config_bios

  - name: print blade count
    debug:
      var: blade_count
    delegate_to: localhost
    tags:
      - config_bios

  - name: get iqn count
    set_fact:
      iqn_count: "{{ hostvars['localhost']['na_siqn'] | count }}"
    delegate_to: localhost
    tags:
      - config_bios

  - name: fail if event blades count > iqn count
    ansible.builtin.fail:
      msg: The blade count is greater than the iqn count, check these values and re-run the script
    when: blade_count|int > iqn_count|int
    delegate_to: localhost
    tags:
      - config_bios

  - name: GET blade BIOS settings
    community.general.redfish_info:
      category: Systems
      command: GetBiosAttributes
      baseuri: "{{ baseuri }}"
      # username: "{{ username }}"
      # password: "{{ password }}"
      <<: *blade_login
    register: BiosAttributes
    tags:
      - config_bios

  # - name: print blade BIOS settings
  #   debug:
  #     var: BiosAttributes
  #   delegate_to: localhost
  #   tags:
  #     - blades

  # - name: GET blade NIC Inventory
  #   community.general.redfish_info:
  #     category: Systems
  #     command: GetNicInventory
  #     baseuri: "{{ baseuri }}"
  #     # username: "{{ username }}"
  #     # password: "{{ password }}"
  #     <<: *blade_login
  #   register: NicInv
  #   tags:
  #     - blades

  # - name: Copy results to output file
  #   ansible.builtin.copy:
  #     content: "{{ BiosAttributes | to_nice_json }}"
  #     dest: "{{ template }}_blade-{{ inventory_hostname }}_BiosAttributes_{{ local_date.stdout }}.json"
  #   tags:
  #     - blades
  #     # - debug

  # - name: Copy NIC Inventory results to output file
  #   ansible.builtin.copy:
  #     content: "{{ NicInv | to_nice_json }}"
  #     dest: "{{ template }}_blade-{{ inventory_hostname }}_NicInv_{{ local_date.stdout }}.json"
  #   tags:
  #     - blades
  #     # - debug

  # - name: Print Blade Info
  #   debug:
  #     var: BiosAttributes | json_query('redfish_facts.bios_attribute.entries[0][*].SystemServiceTag')
  #   tags:
  #     - debug

  - name: Set Blade Unique ID
    set_fact:
      blade_index_id: "{{ ansible_play_hosts_all.index(inventory_hostname) + 1 }}"
    tags:
      - config_bios

  - name: print blade unique ID
    debug:
      var: blade_index_id
    tags:
      - config_bios

  - name: print na_siqn register
    debug:
      var: hostvars['localhost']['na_siqn']
    delegate_to: localhost
    tags:
      - config_bios

  - name: print unique iSCSI Initiator Name
    debug:
      msg: iqn.{{ year }}-{{ month }}.jmn.ncrc:host{{ blade_index_id }}
    delegate_to: localhost
    tags:
      - config_bios

  # - name: CONFIGURE unique iSCSI attributes on blade BIOS
  #   community.general.redfish_config:
  #     category: Systems
  #     command: SetBiosAttributes
  #     bios_attributes: 
  #       IscsiDev1Con1Ip: "192.168.5.{{ 10 + blade_index_id|int }}"
  #       IscsiDev1Con1Mask: "255.255.255.0"
  #       IscsiDev1Con2Ip: "192.168.5.{{ 20 + blade_index_id|int }}"
  #       IscsiDev1Con2Mask: "255.255.255.0"
  #       IscsiInitiatorName: "iqn.{{ year }}-{{ month }}.jmn.ncrc:host-{{ blade_index_id|int }}"
  #     baseuri: "{{ baseuri }}"
  #     # username: "{{ username }}"
  #     # password: "{{ password }}"
  #     <<: *blade_login
  #   # loop: "{{ hosts_count }}"
  #   register: unique_bios_iscsi_attributes
  #   tags:
  #     - blades

  - name: CONFIGURE unique iSCSI attributes on blade BIOS OME MX740c's
    dellemc.openmanage.idrac_bios:
      idrac_ip: "{{ baseuri }}"
      <<: *idrac_login
      validate_certs: false
      attributes: "{{ common_iscsi_attributes }}"
    register: unique_bios_iscsi_attributes740
    when: model == 'PowerEdge MX740c'
    tags:
      - config_bios

  - name: print unique_bios iscsi attributes register
    debug:
      var: unique_bios_iscsi_attributes740
    when: model == 'PowerEdge MX740c'
    tags:
      - config_bios

  - name: CONFIGURE unique iSCSI attributes on blade BIOS OME MX760c's
    dellemc.openmanage.idrac_bios:
      idrac_ip: "{{ baseuri }}"
      <<: *idrac_login
      validate_certs: false
      attributes: "{{ common_iscsi_attributes760 }}"
    register: unique_bios_iscsi_attributes760
    when: model == 'PowerEdge MX760c'
    tags:
      - config_bios

  - name: print unique_bios iscsi attributes register
    debug:
      var: unique_bios_iscsi_attributes760
    when: model == 'PowerEdge MX760c'
    tags:
      - config_bios

  # - name: CONFIGURE iSCSI IQN on blade BIOS OME
  #   dellemc.openmanage.idrac_bios:
  #     idrac_ip: "{{ baseuri }}"
  #     <<: *idrac_login
  #     validate_certs: false
  #     attributes: 
  #       IscsiInitiatorName: "iqn.{{ year }}-{{ month }}.jmn.ncrc:host-{{ blade_index_id|int }}"
  #   register: event_iqn_name
  #   tags:
  #     - iqn

  # - name: print iscsi iqn result
  #   debug:
  #     var: event_iqn_name
  #   tags:
  #     - iqn

  # - name: CONFIGURE common iSCSI attributes on blade BIOS
  #   community.general.redfish_config:
  #     category: Systems
  #     command: SetBiosAttributes
  #     bios_attributes: "{{ common_iscsi_attributes }}"
  #     baseuri: "{{ baseuri }}"
  #     # username: "{{ username }}"
  #     # password: "{{ password }}"
  #     <<: *blade_login
  #   register: common_bios_iscsi_attributes
  #   tags:
  #     - blades

  # - name: CONFIGURE common iSCSI attributes on blade BIOS OME
  #   dellemc.openmanage.idrac_bios:
  #     attributes: "{{ common_iscsi_attributes }}"
  #     idrac_ip: "{{ baseuri }}"
  #     validate_certs: false
  #     # username: "{{ username }}"
  #     # password: "{{ password }}"
  #     <<: *idrac_login
  #   register: common_bios_iscsi_attributes
  #   tags:
  #     - blades

  # - name: print common_bios iscsi attributes register
  #   debug:
  #     var: common_bios_iscsi_attributes
  #   tags:
  #     - blades

  # - name: CONFIGURE iSCSI target iqn on blade BIOS
  #   community.general.redfish_config:
  #     category: Systems
  #     command: SetBiosAttributes
  #     bios_attributes: 
  #       IscsiInitiatorName: "iqn.{{ year }}-{{ month }}.jmn.ncrc:host-{{ blade_index_id|int }}"
  #     baseuri: "{{ baseuri }}"
  #     # username: "{{ username }}"
  #     # password: "{{ password }}"
  #     <<: *blade_login
  #   register: iscsi_tiqn
  #   tags:
  #     - blades

  # DELL ONLY: Updating BIOS settings requires creating a configuration job
  # to schedule the BIOS update, so comment out below for non-Dell systems.

  # - name: Create BIOS configuration job (schedule BIOS setting update)
  #   community.general.idrac_redfish_command:
  #     category: Systems
  #     command: CreateBiosConfigJob
  #     baseuri: "{{ baseuri }}"
  #     # username: "{{ username }}"
  #     # password: "{{ password }}"
  #     <<: *blade_login
  #   # when: common_bios_iscsi_attributes.changed or unique_bios_iscsi_attributes.changed
  #   tags:
  #     - blades

  # - name: Reboot system to apply new BIOS settings
  #   community.general.redfish_command:
  #     category: Systems
  #     command: PowerReboot
  #     baseuri: "{{ baseuri }}"
  #     # username: "{{ username }}"
  #     # password: "{{ password }}"
  #     <<: *blade_login
  #   register: reboot_result
  #   # changed_when: reboot_result.changed == 'true'
  #   # when: common_bios_iscsi_attributes.changed or unique_bios_iscsi_attributes.changed
  #   tags:
  #     - blades

  # - name: debug reboot_result
  #   debug:
  #     var: reboot_result
  #   tags:
  #     - blades

  # - name: Wait 10 mins for blade to reboot
  #   wait_for:
  #     timeout: 600
  #   delegate_to: localhost
    # when: reboot_result.msg == 'Action was successful' and reboot_result.changed == 'true'

  # - name: Poll event servers after reboot
  #   uri:
  #     url: "https://{{ cmc_IP }}/api/DeviceService/Devices({{ blade_uniqueID }})/SystemUpTime"
  #     user: "{{ username }}"
  #     password: "{{ password }}"
  #     method: "GET"
  #     use_proxy: no
  #     status_code: 200, 202
  #     return_content: yes
  #     validate_certs: no
  #     force_basic_auth: yes
  #     headers:
  #       Content-Type: "application/json"
  #       Accept: "application/json"
  #   register: reboot_result
  #   until: reboot_result.json.systemUpTime|int > 200
  #   retries: "{{ retries_count }}"
  #   delay: "{{ polling_interval }}"
  #   tags:
  #     - blades
  #     - debug

  # - name: Poll event servers after reboot
  #   uri:
  #     url: "https://{{ baseuri }}/redfish/v1/Systems/System.Embedded.1/"
  #     user: "{{ username }}"
  #     password: "{{ password }}"
  #     method: "GET"
  #     use_proxy: no
  #     status_code: 200, 202
  #     return_content: yes
  #     validate_certs: no
  #     force_basic_auth: yes
  #     headers:
  #       Content-Type: "application/json"
  #       Accept: "application/json"
  #   register: reboot_result
  #   until: reboot_result.status == 200
  #   retries: "{{ retries_count }}"
  #   delay: "{{ polling_interval }}"
  #   tags:
  #     - blades
  #     - get_bios

  - name: GET blade event BIOS settings
    community.general.redfish_info:
      category: Systems
      command: GetBiosAttributes
      baseuri: "{{ baseuri }}"
      # username: "{{ username }}"
      # password: "{{ password }}"
      <<: *blade_login
    register: EventBiosAttributes
    tags:
      - config_bios
      - get_bios
      - os_deploy

  - name: print blade event BIOS settings
    debug:
      var: EventBiosAttributes
    delegate_to: localhost
    tags:
      - config_bios
      - get_bios
      - os_deploy

  - name: print eventname
    debug:
      var: hostvars['localhost']['chkd_eventname']
    delegate_to: localhost
    tags:
      - os_deploy

  - name: INSTALL OS - find the URL for the DellOSDeploymentService
    ansible.builtin.uri:
      url: "https://{{ baseuri }}/redfish/v1/Systems/System.Embedded.1"
      user: "{{ idrac_login.idrac_user }}"
      password: "{{ idrac_login.idrac_password }}"
      method: GET
      headers:
        Accept: "application/json"
        OData-Version: "4.0"
      status_code: 200
      validate_certs: "{{ validate_certs }}"
      force_basic_auth: "{{ force_basic_auth }}"
    register: result
    delegate_to: localhost
    tags:
      - os_deploy
      - getisostatus

  - name: INSTALL OS - debug result return
    debug:
      var: result
    tags:
      - os_deploy
      - getisostatus

  - name: INSTALL OS - find the URL for the DellOSDeploymentService
    ansible.builtin.set_fact:
      idrac_osd_service_url: "{{ result.json.Links.Oem.Dell.DellOSDeploymentService['@odata.id'] }}"
    when:
      - result.json.Links.Oem.Dell.DellOSDeploymentService is defined
  - block:
      - name: INSTALL OS - get ISO attach status
        ansible.builtin.uri:
          url: "https://{{ baseuri }}{{ idrac_osd_service_url }}/Actions/DellOSDeploymentService.GetAttachStatus"
          user: "{{ idrac_login.idrac_user }}"
          password: "{{ idrac_login.idrac_password }}"
          method: POST
          headers:
            Accept: "application/json"
            Content-Type: "application/json"
            OData-Version: "4.0"
          body: "{}"
          status_code: 200
          validate_certs: "{{ validate_certs }}"
          force_basic_auth: "{{ force_basic_auth }}"
        register: attach_status
        delegate_to: localhost
      - name: set ISO attach status as a fact variable
        ansible.builtin.set_fact:
          idrac_iso_attach_status: "{{ idrac_iso_attach_status | default({}) | combine({item.key: item.value}) }}"
        with_dict:
          DriversAttachStatus: "{{ attach_status.json.DriversAttachStatus }}"
          ISOAttachStatus: "{{ attach_status.json.ISOAttachStatus }}"
    when:
      - idrac_osd_service_url is defined
      - idrac_osd_service_url|length > 0
  - block:
      - name: INSTALL OS - detach ISO image if attached
        ansible.builtin.uri:
          url: "https://{{ baseuri }}{{ idrac_osd_service_url }}/Actions/DellOSDeploymentService.DetachISOImage"
          user: "{{ idrac_login.idrac_user }}"
          password: "{{ idrac_login.idrac_password }}"
          method: POST
          headers:
            Accept: "application/json"
            Content-Type: "application/json"
            OData-Version: "4.0"
          body: "{}"
          status_code: 200
          validate_certs: "{{ validate_certs }}"
          force_basic_auth: "{{ force_basic_auth }}"
        register: detach_status
        delegate_to: localhost
      - ansible.builtin.debug:
          msg: "Successfuly detached the ISO image"
    when:
      - idrac_osd_service_url is defined and idrac_osd_service_url|length > 0
      - idrac_iso_attach_status
      - idrac_iso_attach_status.ISOAttachStatus == "Attached" or
        idrac_iso_attach_status.DriversAttachStatus == "Attached"
    tags:
      - os_deploy
      - getisostatus
  - block:
      - name: debug ISO STATUS
        debug:
          var: attach_status
        tags:
          - getisostatus

  - name: INSTALL OS - boot to network ISO
    dellemc.openmanage.idrac_os_deployment:
      idrac_ip: "{{ baseuri }}"
      idrac_user: "{{ idrac_login.idrac_user }}"
      idrac_password: "{{ idrac_login.idrac_password }}"
      share_name: "{{ share_name }}"
      iso_image: "{{ ubuntu_iso }}"
      expose_duration: "{{ expose_duration }}"
      validate_certs: False
    register: boot_to_network_iso_status
    delegate_to: localhost
    tags:
      - os_deploy