Dans ce Playbook nous allons configurer l’état des disques d’un serveur CISCO M5 en “Unconfigured-good” (via une CIMC), afin de les préparer pour la création d’un Virtual Drive (voir notre précedent billet “Playbook Ansible : créer un Virtual Drive dans une CIMC“).
Les tasks du Playbook :
- Check Power Status : récupère l’état du serveur (on/off ) envoie le résultat dans la variable “SrvPwStatus“, si le serveur est “power off” alors le playbook s’arrête.
 - Check IMC uri : vérifie que l’url de la CIMC du serveur répond bien via un retour HTTP 200, si ce n’est pas le cas le Playblook s’arrête.
 - Search Status and ID storageLocalDisk 0 and 1 : récupère le status des disques (JBOD/unconfigured-good) ainsi que l’ID de chaque disques. Le status des disques est envoyé dans les variables SearchStatusDisk0/SearchStatusDisk1, l’ID des disques est envoyé dans les variables SearchIdDisk0/SearchIdDisk0
 - Search dn Storage Controller: permet de récupérer le dn du Storage Controller . Cette task est exécuté si un des disques à sa variable SearchStatusDisk0/SearchStatusDisk1 égal la variable StatusDiskJbod (“JBOD”)
 - Configure Disk 0 : Configure le disk0 en “make-unconfigured-good“
uniquement si la variable SearchStatusDisk0 est égale à StatusDiskJbod (“JBOD”) - Configure Disk 1 : Configure le disk1 en “make-unconfigured-good“
uniquement si la variable SearchStatusDisk1 est égale à StatusDiskJbod (“JBOD”) 
hosts: localhost
  vars:
    imc_hostname: 100.83.36.141
    imc_password: 
    imc_username: admin
    StatusDiskJbod: JBOD
    StatusDiskUnconfGood: unconfigured-good
    
  tasks:
    - name: Check Power Status
      community.general.imc_rest:
        hostname: '{{ imc_hostname }}'
        username: '{{ imc_username }}'
        password: '{{ imc_password }}'
        validate_certs: no
        content: |
          <configResolveClass inHierarchical="false" classId="computeRackUnit"/>      
      register: CIMCPower
    - set_fact:
        SrvPwStatus: "{{ CIMCPower.configResolveClass.children[0].outConfigs.children[0].computeRackUnit.attributes.operPower }} "
    - debug:
        msg: "{{ SrvPwStatus }}"
      failed_when: '"on" not in SrvPwStatus'
    - name: Check IMC uri
      uri:
        url: https://{{ imc_hostname }}
        validate_certs: no
        status_code: 200
      register: result
    - debug:
        msg: "{{result}}"
      failed_when: result.status != 200
        
    - name: Search Status and ID storageLocalDisk 0 and 1
      community.general.imc_rest:
        hostname: '{{ imc_hostname }}'
        username: '{{ imc_username }}'
        password: '{{ imc_password }}'
        validate_certs: no
        content: |
          <configResolveClass inHierarchical="true" classId="storageLocalDisk"/>
      register: storageLocalDisk
    - set_fact:
        SearchStatusDisk0: "{{ storageLocalDisk.configResolveClass.children[0].outConfigs.children[0].storageLocalDisk.attributes.pdState }}"
        SearchStatusDisk1: "{{ storageLocalDisk.configResolveClass.children[0].outConfigs.children[1].storageLocalDisk.attributes.pdState }}"
        SearchIdDisk0: "{{ 'pd-' + storageLocalDisk.configResolveClass.children[0].outConfigs.children[0].storageLocalDisk.attributes.id }}"
        SearchIdDisk1: "{{ 'pd-' + storageLocalDisk.configResolveClass.children[0].outConfigs.children[1].storageLocalDisk.attributes.id }}"
    - debug:
        msg: 
          - "{{ SearchStatusDisk0 }}"
          - "{{ SearchStatusDisk1 }}"
          - "{{ SearchIdDisk0 }}"
          - "{{ SearchIdDisk1 }}"
    - name: Search dn Storage Controller
      community.general.imc_rest:
        hostname: '{{ imc_hostname }}'
        username: '{{ imc_username }}'
        password: '{{ imc_password }}'
        validate_certs: no
        content: |
          <configResolveClass inHierarchical="true" classId="storageController"/>
      register: StorageController
      when: SearchStatusDisk0 == StatusDiskJbod  or SearchStatusDisk1 == StatusDiskJbod
    - set_fact:
        SearchDnRaid: "{{ StorageController.configResolveClass.children[0].outConfigs.children[0].storageController.attributes.dn }}"
      when: SearchStatusDisk0 == StatusDiskJbod or SearchStatusDisk1 == StatusDiskJbod
    - debug:
        msg: "{{ SearchDnRaid }}"
      when: SearchStatusDisk0 == StatusDiskJbod or SearchStatusDisk1 == StatusDiskJbod
    - name: Configure Disk 0
      community.general.imc_rest:
        hostname: '{{ imc_hostname }}'
        username: '{{ imc_username }}'
        password: '{{ imc_password }}'
        validate_certs: no
        content: |
          <configConfMo dn='{{SearchDnRaid}}/{{ SearchIdDisk0 }}'>
          <inConfig>
          <storageLocalDisk adminAction='make-{{StatusDiskUnconfGood}}'></storageLocalDisk>
          </inConfig>
          </configConfMo>
      retries: 3
      delay: 1
      when: SearchStatusDisk0 == StatusDiskJbod
    - name: Configure Disk 1
      community.general.imc_rest:
        hostname: '{{ imc_hostname }}'
        username: '{{ imc_username }}'
        password: '{{ imc_password }}'
        validate_certs: no
        content: |
          <configConfMo dn='{{SearchDnRaid}}/{{ SearchIdDisk1 }}'>
          <inConfig>
          <storageLocalDisk adminAction='make-{{StatusDiskUnconfGood}}'></storageLocalDisk>
          </inConfig>
          </configConfMo>
      retries: 3
      when: SearchStatusDisk1 == StatusDiskJbod

Il ne reste plus qu’à lancer le Playbook pour configurer les deux premiers disques en “unconfigured-good”.



