Archives mensuelles : octobre 2018

[Oracle] : comment connaître la taille d’un index avant de le créer ? explain plan est ton ami

Lorsque l’on réalise un explain plan, on peut en tirer pour conclusion qu’il est nécessaire de créer un index. Attention, je ne dis pas qu’il faut abuser de ces créations d’index car trop d’index ou des index mal placés ou mal constitués peuvent causer au contraire de al consommation de ressources pour rien.

Ce qui peut être intéressant avant de créer cette index c’est d’évaluer sa taille pour voir le volume qu’il prendra au regarde de votre base. Mais comment faire ?

La encore explain plan d’Oracle est notre ami( c’est pas si souvent que Oracle est ton ami c’est pas faux). Et en plus il est gratuit… youpi !

Pour cela nous allons pratiquer un explain plan sur le create index… eh oui c’est possible.

Ainsi :

#création de l'explain
explain plan for create index monindex on toto_table ( champ_1 );

#consultation du résultat
select * from table(dbms_xplan.display);

Et voilà le tour est joué.

Pas très compliqué donc. Pour en savoir un peu plus sur les explains planset surtout comment les interpréter, je ne peux que vous recommander de consulter cette vidéo de Maria Colgan, expert de chez Oracle.

[Python] : comment requêter une base mysql avec mysql.connector ?

Mysql Connector est le module le plus répandu pour utiliser une base de données mysql à partir de python. Il est relativement facile à utiliser. Nous aurons l’occasion de voir dans d’autres articles des manipulations plus complexes mais il faut bien commencer par… le commencement.

Comment réaliser un simple SELECT et afficher son résultat en Python ? voici comment faire si vous êtes débutant.

import mysql.connector

madatabase = mysql.connector.connect(
  host="localhost",
  user="nom_utilisateur",
  passwd="mon_password",
  database="mabase"
)

session = madatabase.cursor()
sql = "SELECT * FROM matable;"
session.execute(sql)

resultat = session.fetchall()

for x in resultat:
  print(x)

session.close()


Donc quelles commandes avons nous passé ?

  • import du module
  • création d’une instance madatabase avec les paramètres de connexion. C’est tout à fait classique on retrouve cela avec de nombreux modules de moteurs de bases de données
  • ouverture d’une connexionavec l’instanciation de la classe cursor
  • la variable sql contient la requête à passer
  • on lance la requête avec notre variable
  • on récupère tous les résultats (sous forme de liste)
  • il ne reste plus qu’à parcourir la liste
  • et on oublie pas de dire au revoir et merci au serveur en fermant la session

Vous pouvez d’ores et déjà retrouver plus d’infos en ligne sur le site mysql et sa rubrique dédiée à ce module Python.

Ansible – prise en main de checksum, set_facts, register et block

Ansible c’est un peu le fil rouge du moment. Certains l’ont bien vu avec le lancement de la chaine youtube xavki. L’idée c’est de vous montrer comment j’ai appris à utiliser et développer avec ansible.

La vidéo ci-dessous présente ce que nous allons découvrir dans l’article.

[youtube https://www.youtube.com/watch?v=YqKAXnmAetY&w=700&h=300]

L’objectif du jour, c’est de charger un fichier avec l’aide d’ansible, de le modifier et surtout faire en sorte qu’une fois ces opérations réalisées nous gérions la réentrance (ou idempotence). C’est à dire que si nous relançons aussitôt le playbook ansible aucun opération ne soit réalisée.

Or sans vérification du contenu du fichier, le fichier est systématiquement rechargé. Pourquoi ?

Tout simplement car ansible va contrôler l’état du fichier présent sur la cible avec celui présent sur la source. Et malheureusement ansible ne sait pas prendre en compte les diverses opérations qu’il aura réalisé sur le fichier après son chargement. Donc il est systématiquement différent du fichier source.

Comment vérifier l’état du fichier ? de cette manière peut être (si vous avez mieux je suis preneur.

---
- name: "[XAVKI]"
  hosts: all
  vars:
    - check5: "2789ebeb61ab3b1985e9f6df9256d8a1" 
  tasks:

      - name: "[XAVKI] - check md5"
        stat:
          path: /tmp/xavki.txt
          get_checksum: yes
          checksum_algorithm: md5
        register: sum5

      - set_fact:
          data: "0"
        when: sum5.stat.checksum is not defined

      - set_fact:
          data: "{{ sum5.stat.checksum }}"
        when: sum5.stat.checksum is defined

      - name: "[XAVKI] - Bloc"
        block:
        - name: "[XAVKI] - copie du fichier" 
          copy:
            src: ./monfichier.txt
            dest: /tmp/xavki.txt

        - name: "[XAVKI] - add line"
          lineinfile:
            path: /tmp/xavki.txt
            line: "ajout d'une ligne" 

        when: data != check5

Voici le cheminement :

  • tout d’abord on calcul et on place dans une variable le md5 du fichier dans l’état final souhaité (check5 en l’occurence), c’est notre référence
  • à l’aide du module stat on place avec register la valeur du fichier déjà présent dans une variable (sum5)
  • nous devons traiter alors 2 cas de figures : la variable est définie car le fichier existe ou il n’existe pas et la variable n’est pas définie
  • si la variable existe on attribue à la variable data la valeur du sum5 sinon on lui donne la valeur « 0 »
  • enfin on encapsule dans un bloc avec le module block les actions de chargement de fichier et de modification si data ne vaut pas la valeur finale souhaitée (avec when)

[Awk] : comment lister les ports des vhosts d’un apache ? (gsub, match, substr et regex)

Awk c’est un peu mon petit préféré pour faire du oneline en manipulant des lignes. Et une fois de plus, il est encore bien sympa pour nous lister les ports utilisés pour chaque vhost d’un apache. Bon on se fait un peu plaisir vous allez voir… et c’est pas pour frimer.

En gros, on veut un truc qui nous dise :

nom_du_vhost  =>> numéro_port

y compris si nous avons plusieurs ports (80 et 443).

Et en une ligne, voici le code que j’ai pu écrire :

awk '/.*:[0-9]{1,3}>/ && /[^#]/
{match($0,/:[0-9]{1,3}>/);
gsub("/.*/"," ",FILENAME);
print FILENAME"=>>", 
substr($0, RSTART+1, RLENGTH-2)}'
/etc/apache2/*.*

Explications de cette commande d’une ligne un peu chargée :

  • 1ère ligne : restriction des lignes traitées en limitant aux lignes contenant « : » puis 1 à 3 chiffres allant de 0 à 9 et qui ne contient pas de « # » (pour éviter les lignes de commentaires)
  • 2ème ligne : capture du pattern du port encadre de « : » et « > »
  • 3ème ligne : nettoyage du filename en retournant uniquement le nom de fichier
  • 5ème ligne : récupération du pattern de la regex

C’est un peu compliqué mais cela permet surtout de faire un peu de la manipulation pour s’entretenir en awk.

Et vous vous feriez comment pour réaliser ce genre d’opération ?