Mesurer l’occupation d’une baie Pure avec Ansible en pré-requis de la création d’un datastore.

Il y a quelques temps nous avions automatisé (toujours sous ansible) la création de datastore (et donc de LUN) sur tous nos vCenter, cependant on le faisait sans connaître à l’avance l’espace disque utilisé sur la baie de stockage cible (dans notre cas des baies Pure Storage). Nous venons justement d’écrire un yaml permettant de vérifier le pourcentage d’espace disque utilisé sur la baie de stockage cible afin de décider de poursuivre  ou pas le déploiement (lors des pré-check de la création du datastore). La collection purestorage.flasharray permet facilement d’interroger une baie pure via ses différents sous-ensembles ; ici on interroge le sous-ensemble capacity pour obtenir les valeurs des compteurs total_capacity et free_space (en octets) de la baie. Le script ci-dessous permet de retourner le pourcentage d’occupation d’un baie pure.

Les pré-requis (hormis l’installation de la collection purestorage.flasharray) sont les variables :
– fa_url (IP de votre baie pure ou nom dns au format FQDN de préférence)
– api_token (le token pour s’authentifier à la baie)
– usage_threshold_pct (le pourcentage du seuil d’utilisation de la baie)

Concernant le yaml “Check Pure Storage baie”, il est relativement simple. 

  • Task “Collect capacity information on….” nous interrogeons  la baie afin de remonter tous les compteurs du sous-ensemble capacity.
  • Task “Validate Pure capacity payload” permet de valider que la task “Collect capacity information on….” nous a bien remonté les informations que nous souhaitions, si ce n’est pas le cas la task sera en fail avec un message affichant la variable qui n’est pas remontée et une string d’erreur que vous pouvez changer).
  • Task “Display array_result” c’est juste pour afficher le résultat de la task “Collect capacity information on….”, vous pouvez la commenter au besoin.
  • Task “Normalize capacity values to integers (bytes)” créer les variables total_b et free_b 
  • Task “Compute derived values 1″, créer les variables used_b (qui reste en byte), total_gib (total_b que l’on convertit en gigibyte aka “Gib”) et free_gib (free_b que l’on convertie en en gigibyte aka “Gib).
  • Task “Compute derived values 2″, créer les variables used_gib (variable used_b que l’on convertie en gigibyte) et used_pct (used_b / total_b x 100)
  • Task Display values from …. qui affiche les différentes variables
  • Task Abort if usage > {{ usage_threshold_pct }} %, cette la task qui va faill le playblook si pourcentation d’utilisation de la baie est supérieur à la variable usage_threshold_pct.
- name: Check Pure Storage baie 
  hosts: localhost
  
  vars:
    fa_url: "Your_PureStorage.fqdn"
    api_token: "Your_token"
    usage_threshold_pct: 75
  
#######################################
# Collecting data
#######################################
  tasks:

    - name: Collect capacity information on {{ fa_url }}
      purestorage.flasharray.purefa_info:
        gather_subset:
          - capacity
        fa_url: '{{ fa_url }}'
        api_token: '{{ api_token }}'
      register: array_result
      no_log: true  # do not expose the token in the logs
      retries: 3
      delay: 3
      until: array_result is succeeded and (array_result.purefa_info.capacity is defined)

    - name: Validate Pure capacity payload
      assert:
        that:
          - array_result.purefa_info is defined
          - array_result.purefa_info.capacity is defined
          - (array_result.purefa_info.capacity.total_capacity | int) > 0
          - (array_result.purefa_info.capacity.free_space     | int) >= 0
        fail_msg: "Missing/invalid capacity data (total_capacity/free_space)."
        success_msg: "Capacity Pure: payload OK."

    - name : Display array_result
      ansible.builtin.debug:
        msg: '{{ array_result }}'

    - name: Normalize capacity values to integers (bytes)
      ansible.builtin.set_fact:
        total_b: "{{ array_result.purefa_info.capacity.total_capacity | round(2) | int }}"
        free_b:  "{{ array_result.purefa_info.capacity.free_space | round(2) | int }}"
        
    - name: Compute derived values 1
      ansible.builtin.set_fact:
        used_b:  "{{ (total_b | int) - (free_b | int) | round(2) }}"
        total_gib: "{{ ((total_b | int) / gib) | float | round(2) }}"
        free_gib:  "{{ ((free_b  | int) / gib) | float | round(2) }}"


    - name: Compute derived values 2
      ansible.builtin.set_fact:
        used_gib:  "{{ ((used_b  | int) / gib) | float | round(2) }}"
        used_pct:  "{{ (((used_b | float) / (total_b | float)) * 100) | round(2) }}"
      
    - name : Display values from {{ fa_url }}
      ansible.builtin.debug:
        msg: 
          - 'fa_url : {{ fa_url }}'
          - 'used_b : {{ used_b }}'
          - 'total_gib : {{ total_gib }}'
          - 'free_gib : {{ free_gib }} GB'
          - 'used_gib : {{ used_gib }}'
          - 'used_pct : {{ used_pct }} %'

    - name: Abort if usage > {{ usage_threshold_pct }} %
      ansible.builtin.fail:
        msg: "Array usage {{ used_pct }} > {{ usage_threshold_pct }} %. Aborting."
      when: (used_pct | float) > (usage_threshold_pct | float)


Dans l’exemple ci-dessous nous avons fixé volontairement la variable “usage_threshold_pct” à 35 afin d’afficher le message d’erreur “Array usage 37.63 > 35 %. Aborting.” et d’arrêter le playbook.

Ci-dessous le résultat sur une baie dont le taux d’occupation est de 37,63 %. 

il ne reste plus qu’a insérer cette vérification  dans nos pré-check de création de datastore  🙂 .

Post to Twitter

Leave a Reply

Your email address will not be published. Required fields are marked *

*