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”.