Archives mensuelles : octobre 2018


[SQL] : créez des constantes et des noms de résultats

DBA et développeur, cet article est pour vous… y’en faut pour tous les goûts comme on dit. Voici deux outils peu utilisés dans les bases de données que j’ai pu voir récemment. Et pourtant, ils permettent de simplifier votre script sql et de le rendre plus lisible et plus structuré (génial lol).

Les constantes en SQL

Ce n’est pas révolutionnaire mais si vous ne le savez pa déjà, vous pouvez définir un groupe de constante en sql avec la clause « WITH … AS ». Cela vous permettra d’utiliser ces données fixes comme des tables pratiquement.

Par exemple si on définit les constantes de temps :

WITH timeconstants AS (
SELECT 60 as seconds,
       60 as minutes,
       24 as hours,
       365 as days,
       7 as week,
       ['Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi','Dimanche'] as daysweek,
),

C’est pas mal mais comment utiliser ces constantes ? comme une requête.

SELECT seconds, minutes, hours, days FROM timeconstants;

Enfantin comme dirait l’autre.

Les noms de résultats

Je parlerai plutôt d’alias mais souvent en sql on parle d’alias pour les alias de table par exemple et on l’utilise plutôt dans la clause FROM. En totu cas le principe est presque el même sauf qu’il s’agit à la manière d’un vue d’attribuer un alias à une requête entière.

On le fait ainsi :

myextract AS (
   SELECT
   IF(colonne1 < 10, "little", "big") AS qualified_sale,
   colonne1,   nb_hours,   colonne2 / 10  FROM mytable)

Et si on combine les deux on retrouve des trucs du genre :

SELECT nb_hours * minutes * secondes AS timer
FROM mytable, timeconstants;

Alors je fais un peu n’importe quoi mais c’est un exemple.Ici on utilise les constantes minutes et secondes pour calculer les heures passées en secondes.

L’intérêt vous le voyez c’est que désormais tout possède un nom et que pour appeler les éléments ils doivent être définis à travers le « FROM ». Derrière il est beaucoup plus simple de faire de la modélisation et surtout si vos constantes évoluent vous n’avez pas besoin de revoir toutes vos requêtes.

 

Pour ces éléments SQL que nous venons de voir, on parle de CTE dans le jargon DBA. CTE pour Common Table Expression. Ces petites clauses permettent de jouer sur les « alias » pour créer des pseudos tables qui ne sont pas non plus des vues et qui visent à simplifier le travail de maintenance.


Ansible – les différents niveaux de variables

Ansible est un orchestrateur simple d’utilisation dès lors que l’on en retient les concepts de base. Parmi ces concepts, la hiérarchie des variables fait partie des essentiels.

Je vous propose d’y revenir en vidéo.

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

D’ailleurs n’hésitez pas à vous abonner à la chaine xavki.

Au total, Ansible possède plus de 20 manières pour définir des variables. On peut les classer par ordre hiérarchique en fonction de s’imposer les unes aux autres. Je ne reviendrais pas sur l’ensemble des 20 variables mais sur les plus courantes. Néanmoins voici la liste de ces variables ordonnée hierarchiquement :

ansible-v2-and-beyond-ansible-nyc-meetup-19-638

Les principales qui me semblent importantes à retenir sont :

  • 1. extra vars : passable à partir de la command line
  • 2. task vars : variable de tâche (dans le playbook)
  • 3. block vars : la variable de block
  • 4. role vars : dans le répertoire /vars d’un rôle
  • 5. set_facts : définie dans les set_facts
  • 6. playbook vars : dans le fichier playbook
  • 7. host_vars : précisée dans les fichiers individuels des machines de l’inventaire
  • 8. inventory vars : dans l’inventaire (par exemple hosts.yml)
  • 9. group_vars : dans les fichiers de groupes de l’inventaire
  • 10. role defaults vars : la variable par défaut

Un rôle bien rédigé doit être très largement paramétrable : OS, paquets, version, user, passwords… Ainsi un bon rôle possède souvent un fichiers de variables par défaut (répertoire defaults du rôle) très fourni. Cela vous permet de personnaliser très largement l’application de ce rôle.

En outre, un bon rôle doit aussi avoir l’intégratilité de ses variables définies dans son README, en tout cas au moins toutes les variables par défaut. Elles doivent alors être documentées sur la manière de les définir (liste, string, booléens…).

Par ailleurs, vous pouvez utiliser le module debug pour afficher le contenu des variables à n’importe quel moment de votre playbook.

- name: "affichage contenu de var1"
  debug:
    msg: "Voici le contenur de var1 => {{ var1 }}"

Il faut aussi savoir que ansible n’aime pas traiter les variables vides.

Enfin ansible possède des variables particulières propres à son fonctionnement, on parle de facts (version OS, etc…). Celles-ci sont utilisables à tout moment. Pour les connaître utilisez le module setup :

 ansible all -m setup

Vous pouvez également créer vos propres facts.


[Python] : comment simplifier vos switch case avec la fonction lambda ?

Lambda, un mot qui peut faire peur pour les débutants en python. Pourtant les fonctions anonymes lambda permettent de simplifier le code et de le rendre plus compact. Certe leur lecture nécessite un peu de pratique mais elles réduisent la longueur de vos scripts.

En voici encore un exemple avec le classique switch/case. Python n’est pas équipé d’outils spécifique comme bash, php ou autres… Du coup il faut passer par le classique « If … elseif … else ». C’est dommage et je dirais que c’est presque moche non ?

C’est là que labda le vengeur masqué intervient et va nous réduire et embellir tout cela.

Voyons le cas classique dans un premier temps

def sans_lambda(op, a, b):
    if op == 'addition':
        return a + b
    elif op == 'soustraction':
        return a - b
    elif op == 'multiplication':
        return a * b
    elif op == 'division':
        return a / b
    else:
        return None

Et maintenant avec lambda :

def avec_lambda(op, c, d):
    return {
        'addition': lambda: c + d,
        'soustraction': lambda: c - d,
        'multiplication': lambda: c * d,
        'division': lambda: c / d,
    }.get(op, lambda: None)()

Vous le voyez avec lambda c’est mieux. Une lambda pour chaque cas. On intègre directement cela dans le return.


[Sécurité] : Comment encrypter vos fichiers avec Vim ?

Cet article aurait peut être eu simplement sa place dans le top commande de la semaine mais c’est un focus qui parle un peu sécurité et je pense que l’on y fait pas assez attention. J’imagine que sur votre micro vous disposez de fichiers sensibles avec des données perso voir pire avec des mots de passe et des secrets. C’est pas bien lol.

Comment remédier à cela ? en encryptant vos fichiers.

Tout de suite le mot est laché et certains ont les poils qui se dressent. Mais n’ayons pas peur des mots. Encrypter peut se limiter à n’avoir qu’un mot de passe pour consulter vos fichiers. Et c’est ce que Vim permet de faire très simplement avec l’option « :X ». Déjà ça rassure un peu de se dire que Vim peut le faire lol.

Comment encrypter avec Vim ?

  • éditer votre fichier
  • lancer « :X » avant de sauvegarder
  • rentrer votre mot de passe

Et voilà seul Vim peut ouvrir votre fichier et il vous demandera systématiquement votre mot de passe. C’est un premier pas.

Vim propose un simple cryptage symétrique avec mot de passe donc. Mais attention à la méthode que celui-ci utilise. Pour consulter la méthode par défaut faites :

:setlocal cm?

Et pour définir une méthode un peu plus fiable vous pouvez définir la méthode blowfish (ou blowfish2 suivant votre version de Vim). Pour cela lancez :

:setlocal cm=blowfish

Pour encrypter d’autres fichiers (hors de portée pour Vim comme images…), vous pouvez aussi utiliser :

Et surtout n’oublions pas qu’au minimum pour éviter les problèmes en cas de vol, vous pouvez encrypter facilement votre partition de travail sur Ubuntu si c’est votre distribution.

Par ailleurs, s’il s’agit de stocker des mots de passe tournez vous plutôt vers des outils spécifiques comme keepass par exemple.