SlideShare une entreprise Scribd logo
1  sur  34
Télécharger pour lire hors ligne
Python + Ansible = ♥
Gonéri Le Bouder
Ansible Montéal
mai 2017
Un peu de contexte
Mon D-Link DSP w215 smart plug
● Une catastrophe en terme de sécurité
● Se connecte au Wifi et attend des ordres
● Attend les ordres depuis Internet
● Peut se contrôler depuis le réseau local
Un peu de contexte
Mon D-Link DSP w215 smart plug
● Une catastrophe en terme de sécurité
● Se connecte au Wifi et attend des ordres
● Attend les ordres depuis Internet
● Peut se contrôler depuis le réseau local
Un module Python existe pour le manipuler (pyW215)
from pyW215.pyW215 import SmartPlug
sp = SmartPlug('192.168.1.110', '******')
# Allumer l'interrupteur et l’étendre
sp.state = 'ON'
sp.state = 'OFF'
Et si j’utilisais Ansible pour allumer ma lampe?
Les différents types de modules/plugins (1/3)
● Callback Plugins
○ Traite les retours d'exécution
● Connection Plugins
○ SSH
● Lookup Plugins
○ Par example: with_items
Les différents types de modules/plugins (2/3)
● Vars Plugins
○ Pour ajouter des variables supplémentaires
● Filter Plugins
○ Filtre pour Jinja2, par exemple: {{ myvar | ipv4 }}
● Modules
○ Par exemple: command: cat /etc/motd
● Action plugins
○ Par exemple: template: src=/mytemplates/foo.j2 dest=/etc/file.conf
Les différents types de modules/plugins (3/3)
● Vars Plugins
○ Pour ajouter des variables supplémentaires
● Filter Plugins
○ Filtre pour Jinja2, par exemple: {{ myvar | ipv4 }}
● Modules
○ Par exemple: command: cat /etc/motd
● Action plugins
○ Par exemple: template: src=/mytemplates/foo.j2 dest=/etc/file.conf
Un module Ansible (1/5)
Ma lib est écrite pour Python 3.
Ne pas oublier que le module peut être lancé sur une machine distante:
● Réduire les dépendances
● Éviter d’imposer un virtual-env
● Un seul script sera copié (pas de sous module)
● On utilise la sortie standard pour communiquer
#!/usr/bin/python3
from ansible.module_utils.basic import *
Un module Ansible (2/5)
if __name__ == '__main__':
global module
module = AnsibleModule(
argument_spec={
'host': { 'required': True, 'type': 'str' },
'password': { 'required': True, 'type': 'str' },
'state': { 'required': True, 'type': 'str' }
},
supports_check_mode=False ⇐ Ne PAS lancer en “mode à froid” (dry mode)
)
Un module Ansible (3/5)
if module.params['state'] in ('present', 'on', 'ON'):
expectation = 'ON'
elif module.params['state'] in ('absent', 'off', 'OFF'):
expectation = 'OFF'
else:
module.fail_json(msg="Invalid parameter for state")
try:
from pyW215.pyW215 import SmartPlug
except ImportError:
module.fail_json(msg="The module depends on pyW215")
Un module Ansible (4/5)
if module.params['state'] in ('present', 'on', 'ON'):
expectation = 'ON'
elif module.params['state'] in ('absent', 'off', 'OFF'):
expectation = 'OFF'
else:
module.fail_json(msg="Invalid parameter for state")
try:
from pyW215.pyW215 import SmartPlug
except ImportError:
module.fail_json(msg="The module depends on pyW215") ⇐ ne PAS utiliser print() !
Un module Ansible (5/5)
sp = SmartPlug(module.params['host'], module.params['password'])
changed = expectation != sp.state
sp.state = expectation
module.exit_json(changed=changed)
Les chemins
Enregistrer le fichier dans : ./plugins/library/smartplug.py
Et créer un fichier local ansible.cfg:
[defaults]
library = ./plugins/library
Exécution du nouveau module
A ce stade je peux déjà lancer mon module:
ansible localhost -m smartplug -a 'host=somewhere password=secret state=on'
Mon playbook pour allumer la lumière
---
- hosts: localhost
tasks:
- smartplug:
host: '192.168.1.120'
password: '851004'
state: 'on'
ansible-playbook -vvv set_light.yml
Et si il fait sombre ?!
Et si il fait sombre ?!
Oui ? Et si il y a des nuages ?
Et si il fait sombre ?!
Oui ? Et si il y a des nuages ?
Et si le soleil est couché ?
Comment indiquer la météo à Ansible ? (1/3)
Openweathermap offre une API REST/JSON, par exemple:
http://api.openweathermap.org/data/2.5/weather?q=Montréal,CA&appid=mon_sec
ret&units=metric
Comment indiquer la météo à Ansible ? (2/3)
{
"base": "stations",
"clouds": {
"all": 5 <= Et voilà la couverture nuageuse en %
},
"cod": 200,
"coord": {
"lat": 45.5,
"lon": -73.68
},
"dt": 1491703200,
"id": 6077246,
"main": {
"humidity": 55,
"pressure": 1012,
"temp": 3.33,
"temp_max": 4,
"temp_min": 2
},
Comment indiquer la météo à Ansible ? (3/3)
"name": "Montréal",
"sys": {
"country": "CA",
"id": 3829,
"message": 0.0397,
"sunrise": 1491733166,
"sunset": 1491780822, <= Je sais quand il fait nuit !
"type": 1
},
"visibility": 24140,
"weather": [
{
"description": "clear sky",
"icon": "02n",
"id": 800,
"main": "Clear"
}
],
"wind": {
"deg": 230,
"speed": 2.1
Facile, Il faut faire un curl et parser du JSON
Ansible n’est pas vraiment fait pour ça … enfin si avec le filtre to_json mais bon
… Python serait tellement plus chouette ! ☺
Les différents types de modules/plugins (3/3)
● Vars Plugins
○ Pour ajouter des variables supplémentaires
● Filter Plugins
○ Filtre pour Jinja2, par exemple: {{ myvar | ipv4 }}
● Modules
○ Par exemple: command: cat /etc/motd
● Action plugins
○ Par exemple: template: src=/mytemplates/foo.j2 dest=/etc/file.conf
Un module Action
● Cette fois on veut un traitement local
● L’API est un peu différente
● Pas d'exécution par une machine distante
● Évalué par le process Python du Ansible papa
Un module Action (1/2)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
from ansible.plugins.action import ActionBase
from ansible.utils.vars import merge_hash
try:
from __main__ import display
except ImportError:
from ansible.utils.display import Display
display = Display()
import os
import requests
Un module Action (2/2)
class ActionModule(ActionBase):
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
results = super(ActionModule, self).run(tmp, task_vars)
location = self._task.args.get('location', None)
units = self._task.args.get('units', 'metric')
Un module Action (2/2)
display.vv("Looking for weather via 'openweathermap': location=%s" % location)
r = requests.get(
'http://api.openweathermap.org/data/2.5/weather',
params={
'q': location,
'appid': os.environ['OPENWEATHERMAP_ID'],
'units': units})
Un module Action (2/2)
results = merge_hash(
results,
r.json())
return results
● Ansible utilise la valeur retournée ici (dictionnaire Python)
● On peut donc polluer la sortie standard avec des print() partout
● mais on ne le fait pas pour ne pas contourner les callbacks :-)
J’enregistre mon Action
Dans le fichier plugins/action/weather.py
J’édite mon ansible.cfg pour ajouter ce nouveau chemin:
[defaults]
action_plugins = ./plugins/action
library = ./plugins/library
Plus qu’a !
---
- hosts: localhost
tasks:
- name: Récupère la météo de Montréal
weather:
location: "Montréal,CA"
register: meteo
- set_fact:
plug_state: 'on'
when: (meteo.clouds.all | int > 75)
or
(meteo.sys.sunrise < ansible_date_time.epoch | int)
- set_fact:
plug_state: 'off'
when: ansible_date_time.hour | int < 21
- smartplug:
host: '192.168.1.120'
password: 'mon secret'
state: '{{ plug_state }}'
Quelques idées pour continuer
Déclencher le playbook automatiquement, par exemple:
● Toutes les 20 minutes
● Avec un unit et un timer pour systemd
Quelques idées pour continuer
Une notification à la fin, par exemple avec
● Le module “mail”
● Ou telegram.

Contenu connexe

Tendances

Initiation à Express js
Initiation à Express jsInitiation à Express js
Initiation à Express jsAbdoulaye Dieng
 
Cedric leblond migrer jenkins AWS vers Azure Devops
Cedric leblond migrer jenkins AWS vers Azure DevopsCedric leblond migrer jenkins AWS vers Azure Devops
Cedric leblond migrer jenkins AWS vers Azure DevopsFactoVia
 
JSS2014 – Haute disponibilité dans Azure
JSS2014 – Haute disponibilité dans AzureJSS2014 – Haute disponibilité dans Azure
JSS2014 – Haute disponibilité dans AzureGUSS
 
Conférence #nwx2014 - Thibaud Juin - Varnish, accélérateur web
Conférence #nwx2014 - Thibaud Juin - Varnish, accélérateur webConférence #nwx2014 - Thibaud Juin - Varnish, accélérateur web
Conférence #nwx2014 - Thibaud Juin - Varnish, accélérateur webNormandie Web Xperts
 
Migrer de Jenkins vers Azure DevOps les Builds Java
Migrer de Jenkins vers Azure DevOps les Builds JavaMigrer de Jenkins vers Azure DevOps les Builds Java
Migrer de Jenkins vers Azure DevOps les Builds JavaCédric Leblond
 
Realtime Web avec Kafka, Spark et Mesos
Realtime Web avec Kafka, Spark et MesosRealtime Web avec Kafka, Spark et Mesos
Realtime Web avec Kafka, Spark et Mesosebiznext
 
XebiConFr - 15 - Apache Mesos, ou comment exploiter les ressources de votre d...
XebiConFr - 15 - Apache Mesos, ou comment exploiter les ressources de votre d...XebiConFr - 15 - Apache Mesos, ou comment exploiter les ressources de votre d...
XebiConFr - 15 - Apache Mesos, ou comment exploiter les ressources de votre d...Publicis Sapient Engineering
 
Laravel yet another framework
Laravel  yet another frameworkLaravel  yet another framework
Laravel yet another frameworkLAHAXE Arnaud
 
Moussasambe projet de securite zabbix
Moussasambe projet de securite zabbixMoussasambe projet de securite zabbix
Moussasambe projet de securite zabbixmoussa sambe
 
Manon Pernin - Déploiement automatisé d’un environnement dans Azure - Global ...
Manon Pernin - Déploiement automatisé d’un environnement dans Azure - Global ...Manon Pernin - Déploiement automatisé d’un environnement dans Azure - Global ...
Manon Pernin - Déploiement automatisé d’un environnement dans Azure - Global ...AZUG FR
 
Programmation concurrente en Java
Programmation concurrente en JavaProgrammation concurrente en Java
Programmation concurrente en JavaFlorian Beaufumé
 
Programmation réactive avec Spring 5 et Reactor
Programmation réactive avec Spring 5 et ReactorProgrammation réactive avec Spring 5 et Reactor
Programmation réactive avec Spring 5 et ReactorFlorian Beaufumé
 
CocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubsCocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubsCocoaHeadsRNS
 
Phoenix Presence: Le service temps réel de Phoenix - Paris.ex #8
Phoenix Presence: Le service temps réel de Phoenix - Paris.ex #8 Phoenix Presence: Le service temps réel de Phoenix - Paris.ex #8
Phoenix Presence: Le service temps réel de Phoenix - Paris.ex #8 Mickaël Rémond
 
Configuration Management avec Drupal 8
Configuration Management avec Drupal 8Configuration Management avec Drupal 8
Configuration Management avec Drupal 8Aurelien Navarre
 
Usages autour d’Ansible chez ikoula
Usages autour d’Ansible chez ikoulaUsages autour d’Ansible chez ikoula
Usages autour d’Ansible chez ikoulaNicolas Trauwaen
 
Présentation Ansible Ikoula
Présentation Ansible IkoulaPrésentation Ansible Ikoula
Présentation Ansible IkoulaIkoula
 
Transition de NIBs/XIBs vers Storyboards
Transition de NIBs/XIBs vers StoryboardsTransition de NIBs/XIBs vers Storyboards
Transition de NIBs/XIBs vers StoryboardsCocoaHeads France
 
Alphorm.com Formation Scripting Bash avancé pour GNU/Linux
Alphorm.com   Formation Scripting Bash avancé pour GNU/LinuxAlphorm.com   Formation Scripting Bash avancé pour GNU/Linux
Alphorm.com Formation Scripting Bash avancé pour GNU/LinuxAlphorm
 

Tendances (20)

Initiation à Express js
Initiation à Express jsInitiation à Express js
Initiation à Express js
 
Cedric leblond migrer jenkins AWS vers Azure Devops
Cedric leblond migrer jenkins AWS vers Azure DevopsCedric leblond migrer jenkins AWS vers Azure Devops
Cedric leblond migrer jenkins AWS vers Azure Devops
 
JSS2014 – Haute disponibilité dans Azure
JSS2014 – Haute disponibilité dans AzureJSS2014 – Haute disponibilité dans Azure
JSS2014 – Haute disponibilité dans Azure
 
Conférence #nwx2014 - Thibaud Juin - Varnish, accélérateur web
Conférence #nwx2014 - Thibaud Juin - Varnish, accélérateur webConférence #nwx2014 - Thibaud Juin - Varnish, accélérateur web
Conférence #nwx2014 - Thibaud Juin - Varnish, accélérateur web
 
Migrer de Jenkins vers Azure DevOps les Builds Java
Migrer de Jenkins vers Azure DevOps les Builds JavaMigrer de Jenkins vers Azure DevOps les Builds Java
Migrer de Jenkins vers Azure DevOps les Builds Java
 
Realtime Web avec Kafka, Spark et Mesos
Realtime Web avec Kafka, Spark et MesosRealtime Web avec Kafka, Spark et Mesos
Realtime Web avec Kafka, Spark et Mesos
 
XebiConFr - 15 - Apache Mesos, ou comment exploiter les ressources de votre d...
XebiConFr - 15 - Apache Mesos, ou comment exploiter les ressources de votre d...XebiConFr - 15 - Apache Mesos, ou comment exploiter les ressources de votre d...
XebiConFr - 15 - Apache Mesos, ou comment exploiter les ressources de votre d...
 
Laravel yet another framework
Laravel  yet another frameworkLaravel  yet another framework
Laravel yet another framework
 
Moussasambe projet de securite zabbix
Moussasambe projet de securite zabbixMoussasambe projet de securite zabbix
Moussasambe projet de securite zabbix
 
Manon Pernin - Déploiement automatisé d’un environnement dans Azure - Global ...
Manon Pernin - Déploiement automatisé d’un environnement dans Azure - Global ...Manon Pernin - Déploiement automatisé d’un environnement dans Azure - Global ...
Manon Pernin - Déploiement automatisé d’un environnement dans Azure - Global ...
 
Programmation concurrente en Java
Programmation concurrente en JavaProgrammation concurrente en Java
Programmation concurrente en Java
 
Programmation réactive avec Spring 5 et Reactor
Programmation réactive avec Spring 5 et ReactorProgrammation réactive avec Spring 5 et Reactor
Programmation réactive avec Spring 5 et Reactor
 
CocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubsCocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubs
 
Phoenix Presence: Le service temps réel de Phoenix - Paris.ex #8
Phoenix Presence: Le service temps réel de Phoenix - Paris.ex #8 Phoenix Presence: Le service temps réel de Phoenix - Paris.ex #8
Phoenix Presence: Le service temps réel de Phoenix - Paris.ex #8
 
Configuration Management avec Drupal 8
Configuration Management avec Drupal 8Configuration Management avec Drupal 8
Configuration Management avec Drupal 8
 
Usages autour d’Ansible chez ikoula
Usages autour d’Ansible chez ikoulaUsages autour d’Ansible chez ikoula
Usages autour d’Ansible chez ikoula
 
Présentation Ansible Ikoula
Présentation Ansible IkoulaPrésentation Ansible Ikoula
Présentation Ansible Ikoula
 
Transition de NIBs/XIBs vers Storyboards
Transition de NIBs/XIBs vers StoryboardsTransition de NIBs/XIBs vers Storyboards
Transition de NIBs/XIBs vers Storyboards
 
Alphorm.com Formation Scripting Bash avancé pour GNU/Linux
Alphorm.com   Formation Scripting Bash avancé pour GNU/LinuxAlphorm.com   Formation Scripting Bash avancé pour GNU/Linux
Alphorm.com Formation Scripting Bash avancé pour GNU/Linux
 
WebSocket avec Java EE 7
WebSocket avec Java EE 7WebSocket avec Java EE 7
WebSocket avec Java EE 7
 

Similaire à Python + ansible = ♥

Node.js, le pavé dans la mare
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mareValtech
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScriptMicrosoft
 
Fondamentaux portée - contexte - function ms tech days
Fondamentaux   portée - contexte - function ms tech daysFondamentaux   portée - contexte - function ms tech days
Fondamentaux portée - contexte - function ms tech daysJean-Pierre Vincent
 
Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++cppfrug
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Dr Samir A. ROUABHI
 
Function oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech daysFunction   oop - bonnes pratiques ms tech days
Function oop - bonnes pratiques ms tech daysJean-Pierre Vincent
 
Patterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptPatterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptMicrosoft Technet France
 
Ateliers protypage d objets connectes via arduino
Ateliers protypage d objets connectes via arduinoAteliers protypage d objets connectes via arduino
Ateliers protypage d objets connectes via arduinoFatima Zahra Fagroud
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJean-Pierre Vincent
 
Introduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomicsIntroduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomicsAurélien Regat-Barrel
 
Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Ruau Mickael
 
Javascript : que fait ce code?
Javascript : que fait ce code?Javascript : que fait ce code?
Javascript : que fait ce code?Ruau Mickael
 
Interception de signal avec dump de la pile d'appel
Interception de signal avec dump de la pile d'appelInterception de signal avec dump de la pile d'appel
Interception de signal avec dump de la pile d'appelThierry Gayet
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introductionneuros
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hoodsvuillet
 
Mixit2014_Puppet_Workshop
Mixit2014_Puppet_WorkshopMixit2014_Puppet_Workshop
Mixit2014_Puppet_WorkshopSMougenot
 
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops) Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops) Joël Séguillon
 
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosTp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosSaid Benaissa
 
Aspect avec AspectJ
Aspect avec AspectJAspect avec AspectJ
Aspect avec AspectJsimeon
 

Similaire à Python + ansible = ♥ (20)

Node.js, le pavé dans la mare
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mare
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
Fondamentaux portée - contexte - function ms tech days
Fondamentaux   portée - contexte - function ms tech daysFondamentaux   portée - contexte - function ms tech days
Fondamentaux portée - contexte - function ms tech days
 
Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)
 
Function oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech daysFunction   oop - bonnes pratiques ms tech days
Function oop - bonnes pratiques ms tech days
 
Patterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptPatterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScript
 
Etes vous-pret pour php8 ?
Etes vous-pret pour php8 ?Etes vous-pret pour php8 ?
Etes vous-pret pour php8 ?
 
Ateliers protypage d objets connectes via arduino
Ateliers protypage d objets connectes via arduinoAteliers protypage d objets connectes via arduino
Ateliers protypage d objets connectes via arduino
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOP
 
Introduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomicsIntroduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomics
 
Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?
 
Javascript : que fait ce code?
Javascript : que fait ce code?Javascript : que fait ce code?
Javascript : que fait ce code?
 
Interception de signal avec dump de la pile d'appel
Interception de signal avec dump de la pile d'appelInterception de signal avec dump de la pile d'appel
Interception de signal avec dump de la pile d'appel
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introduction
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hood
 
Mixit2014_Puppet_Workshop
Mixit2014_Puppet_WorkshopMixit2014_Puppet_Workshop
Mixit2014_Puppet_Workshop
 
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops) Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
 
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosTp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
 
Aspect avec AspectJ
Aspect avec AspectJAspect avec AspectJ
Aspect avec AspectJ
 

Plus de Gonéri Le Bouder

Red Hat Ansible Lightspeed Ansible Meetup-2023-11.pdf
Red Hat Ansible Lightspeed Ansible Meetup-2023-11.pdfRed Hat Ansible Lightspeed Ansible Meetup-2023-11.pdf
Red Hat Ansible Lightspeed Ansible Meetup-2023-11.pdfGonéri Le Bouder
 
How to speed up your (API client) modules
How to speed up your (API client) modulesHow to speed up your (API client) modules
How to speed up your (API client) modulesGonéri Le Bouder
 
Virt lightning-montreal-linux-meetup-2020-02
Virt lightning-montreal-linux-meetup-2020-02Virt lightning-montreal-linux-meetup-2020-02
Virt lightning-montreal-linux-meetup-2020-02Gonéri Le Bouder
 
Ansible meetup - Québec - april 25th, 2019
Ansible meetup - Québec - april 25th, 2019Ansible meetup - Québec - april 25th, 2019
Ansible meetup - Québec - april 25th, 2019Gonéri Le Bouder
 
Montreal ansible meetup april 17th, 2019
Montreal ansible meetup   april 17th, 2019Montreal ansible meetup   april 17th, 2019
Montreal ansible meetup april 17th, 2019Gonéri Le Bouder
 
How to driver your webservices with ansible
How to driver your webservices with ansibleHow to driver your webservices with ansible
How to driver your webservices with ansibleGonéri Le Bouder
 
Distributed-CI - OpenStack Montréal - 2018-06
Distributed-CI - OpenStack Montréal - 2018-06Distributed-CI - OpenStack Montréal - 2018-06
Distributed-CI - OpenStack Montréal - 2018-06Gonéri Le Bouder
 
DCI presentation during OpenStack Montréal - 2018-06
DCI presentation during OpenStack Montréal - 2018-06DCI presentation during OpenStack Montréal - 2018-06
DCI presentation during OpenStack Montréal - 2018-06Gonéri Le Bouder
 
How to use TripleO tools for your own project
How to use TripleO tools for your own projectHow to use TripleO tools for your own project
How to use TripleO tools for your own projectGonéri Le Bouder
 
Fusioninventory journees-perl-2012
Fusioninventory journees-perl-2012Fusioninventory journees-perl-2012
Fusioninventory journees-perl-2012Gonéri Le Bouder
 
Otrs help desk-solutions-linux-2012
Otrs help desk-solutions-linux-2012Otrs help desk-solutions-linux-2012
Otrs help desk-solutions-linux-2012Gonéri Le Bouder
 
Fusioninventory openworldforum-paris-2011-september
Fusioninventory openworldforum-paris-2011-septemberFusioninventory openworldforum-paris-2011-september
Fusioninventory openworldforum-paris-2011-septemberGonéri Le Bouder
 
Linuxtag 2011-it-asset-management-glpi-fusioninventory
Linuxtag 2011-it-asset-management-glpi-fusioninventoryLinuxtag 2011-it-asset-management-glpi-fusioninventory
Linuxtag 2011-it-asset-management-glpi-fusioninventoryGonéri Le Bouder
 
High Performance Computing and Open Source & Linux Technical Excellence Sympo...
High Performance Computing and Open Source & Linux Technical Excellence Sympo...High Performance Computing and Open Source & Linux Technical Excellence Sympo...
High Performance Computing and Open Source & Linux Technical Excellence Sympo...Gonéri Le Bouder
 
Fusioninventory project FOSDEM 2011
Fusioninventory project FOSDEM 2011Fusioninventory project FOSDEM 2011
Fusioninventory project FOSDEM 2011Gonéri Le Bouder
 
Fusioninventory froscamp2010
Fusioninventory froscamp2010Fusioninventory froscamp2010
Fusioninventory froscamp2010Gonéri Le Bouder
 

Plus de Gonéri Le Bouder (20)

Red Hat Ansible Lightspeed Ansible Meetup-2023-11.pdf
Red Hat Ansible Lightspeed Ansible Meetup-2023-11.pdfRed Hat Ansible Lightspeed Ansible Meetup-2023-11.pdf
Red Hat Ansible Lightspeed Ansible Meetup-2023-11.pdf
 
How to speed up your (API client) modules
How to speed up your (API client) modulesHow to speed up your (API client) modules
How to speed up your (API client) modules
 
Virt lightning-montreal-linux-meetup-2020-02
Virt lightning-montreal-linux-meetup-2020-02Virt lightning-montreal-linux-meetup-2020-02
Virt lightning-montreal-linux-meetup-2020-02
 
Ansible meetup - Québec - april 25th, 2019
Ansible meetup - Québec - april 25th, 2019Ansible meetup - Québec - april 25th, 2019
Ansible meetup - Québec - april 25th, 2019
 
Montreal ansible meetup april 17th, 2019
Montreal ansible meetup   april 17th, 2019Montreal ansible meetup   april 17th, 2019
Montreal ansible meetup april 17th, 2019
 
How to driver your webservices with ansible
How to driver your webservices with ansibleHow to driver your webservices with ansible
How to driver your webservices with ansible
 
Distributed-CI - OpenStack Montréal - 2018-06
Distributed-CI - OpenStack Montréal - 2018-06Distributed-CI - OpenStack Montréal - 2018-06
Distributed-CI - OpenStack Montréal - 2018-06
 
DCI presentation during OpenStack Montréal - 2018-06
DCI presentation during OpenStack Montréal - 2018-06DCI presentation during OpenStack Montréal - 2018-06
DCI presentation during OpenStack Montréal - 2018-06
 
How to use TripleO tools for your own project
How to use TripleO tools for your own projectHow to use TripleO tools for your own project
How to use TripleO tools for your own project
 
Fusioninventory journees-perl-2012
Fusioninventory journees-perl-2012Fusioninventory journees-perl-2012
Fusioninventory journees-perl-2012
 
Otrs help desk-solutions-linux-2012
Otrs help desk-solutions-linux-2012Otrs help desk-solutions-linux-2012
Otrs help desk-solutions-linux-2012
 
Fusioninventory openworldforum-paris-2011-september
Fusioninventory openworldforum-paris-2011-septemberFusioninventory openworldforum-paris-2011-september
Fusioninventory openworldforum-paris-2011-september
 
GLPI RMLL-2011
GLPI RMLL-2011GLPI RMLL-2011
GLPI RMLL-2011
 
Fusioninventory rmll-2011
Fusioninventory rmll-2011Fusioninventory rmll-2011
Fusioninventory rmll-2011
 
Linuxtag 2011-it-asset-management-glpi-fusioninventory
Linuxtag 2011-it-asset-management-glpi-fusioninventoryLinuxtag 2011-it-asset-management-glpi-fusioninventory
Linuxtag 2011-it-asset-management-glpi-fusioninventory
 
High Performance Computing and Open Source & Linux Technical Excellence Sympo...
High Performance Computing and Open Source & Linux Technical Excellence Sympo...High Performance Computing and Open Source & Linux Technical Excellence Sympo...
High Performance Computing and Open Source & Linux Technical Excellence Sympo...
 
Fusioninventory project FOSDEM 2011
Fusioninventory project FOSDEM 2011Fusioninventory project FOSDEM 2011
Fusioninventory project FOSDEM 2011
 
Fusioninventory 2010-french
Fusioninventory 2010-frenchFusioninventory 2010-french
Fusioninventory 2010-french
 
Fusioninventory froscamp2010
Fusioninventory froscamp2010Fusioninventory froscamp2010
Fusioninventory froscamp2010
 
présentation de Debian 2
présentation de Debian 2présentation de Debian 2
présentation de Debian 2
 

Dernier

BOW 2024 - 3-3 - Adaptation des bâtiments pour ruminants au changement clima...
BOW 2024 - 3-3 -  Adaptation des bâtiments pour ruminants au changement clima...BOW 2024 - 3-3 -  Adaptation des bâtiments pour ruminants au changement clima...
BOW 2024 - 3-3 - Adaptation des bâtiments pour ruminants au changement clima...idelewebmestre
 
BOW 2024 - 3 1 - Les infrastructures équestres et le changement climatique
BOW 2024 - 3 1 - Les infrastructures équestres et le changement climatiqueBOW 2024 - 3 1 - Les infrastructures équestres et le changement climatique
BOW 2024 - 3 1 - Les infrastructures équestres et le changement climatiqueidelewebmestre
 
Chapitre 2 : fondations et analyses de données géotechniques
Chapitre 2 : fondations et analyses de données géotechniquesChapitre 2 : fondations et analyses de données géotechniques
Chapitre 2 : fondations et analyses de données géotechniquesangevaleryn
 
BOW 2024 -3-9 - Matelas de logettes à eau refroidie VL
BOW 2024 -3-9 - Matelas de logettes à eau refroidie VLBOW 2024 -3-9 - Matelas de logettes à eau refroidie VL
BOW 2024 -3-9 - Matelas de logettes à eau refroidie VLidelewebmestre
 
BOW 2024-3-10 - Batcool Petits ruminants
BOW 2024-3-10 - Batcool Petits ruminantsBOW 2024-3-10 - Batcool Petits ruminants
BOW 2024-3-10 - Batcool Petits ruminantsidelewebmestre
 
Accompagnement de l'agrivoltaisme - Focus sur l'étude système en Merthe et Mo...
Accompagnement de l'agrivoltaisme - Focus sur l'étude système en Merthe et Mo...Accompagnement de l'agrivoltaisme - Focus sur l'étude système en Merthe et Mo...
Accompagnement de l'agrivoltaisme - Focus sur l'étude système en Merthe et Mo...idelewebmestre
 
BOW 2024 - Dedans/Dehors quand voir ne suffit pas
BOW 2024 - Dedans/Dehors quand voir ne suffit pasBOW 2024 - Dedans/Dehors quand voir ne suffit pas
BOW 2024 - Dedans/Dehors quand voir ne suffit pasidelewebmestre
 
BOW 2024 - 3-8 - Adaptation des bâtiments d'élevages de volailles au changeme...
BOW 2024 - 3-8 - Adaptation des bâtiments d'élevages de volailles au changeme...BOW 2024 - 3-8 - Adaptation des bâtiments d'élevages de volailles au changeme...
BOW 2024 - 3-8 - Adaptation des bâtiments d'élevages de volailles au changeme...idelewebmestre
 
BOW 2024 - L'écurie ouverte : un concept inspirant pour la filière équine
BOW 2024 - L'écurie ouverte : un concept inspirant pour la filière équineBOW 2024 - L'écurie ouverte : un concept inspirant pour la filière équine
BOW 2024 - L'écurie ouverte : un concept inspirant pour la filière équineidelewebmestre
 
Actions du vent sur les bâtiments selon lEurocode 1 – Partie 1-4.pdf
Actions du vent sur les bâtiments selon lEurocode 1 – Partie 1-4.pdfActions du vent sur les bâtiments selon lEurocode 1 – Partie 1-4.pdf
Actions du vent sur les bâtiments selon lEurocode 1 – Partie 1-4.pdfalainfahed961
 
BOW 2024 -3-7- Impact bâtiment stress thermique Vaches laitières
BOW 2024 -3-7- Impact bâtiment stress thermique Vaches laitièresBOW 2024 -3-7- Impact bâtiment stress thermique Vaches laitières
BOW 2024 -3-7- Impact bâtiment stress thermique Vaches laitièresidelewebmestre
 
Compersseur d'air a vis atlas copco avec huile
Compersseur d'air a vis atlas copco avec huileCompersseur d'air a vis atlas copco avec huile
Compersseur d'air a vis atlas copco avec huileMBouderbala
 
Bow 2024 - Plein air à l'intérieur des bâtiments d'élevage de ruminants
Bow 2024 - Plein air à l'intérieur des bâtiments d'élevage de ruminantsBow 2024 - Plein air à l'intérieur des bâtiments d'élevage de ruminants
Bow 2024 - Plein air à l'intérieur des bâtiments d'élevage de ruminantsidelewebmestre
 
BOW 2024 - 3-2 - Stress thermique impact vaches laitières
BOW 2024 - 3-2 - Stress thermique impact vaches laitièresBOW 2024 - 3-2 - Stress thermique impact vaches laitières
BOW 2024 - 3-2 - Stress thermique impact vaches laitièresidelewebmestre
 
Cadre réglementaire et développement de l'agrivoltaïsme en France
Cadre réglementaire et développement de l'agrivoltaïsme en FranceCadre réglementaire et développement de l'agrivoltaïsme en France
Cadre réglementaire et développement de l'agrivoltaïsme en Franceidelewebmestre
 
Support de cours La technologie WDM.pptx
Support de cours La technologie WDM.pptxSupport de cours La technologie WDM.pptx
Support de cours La technologie WDM.pptxdocteurgyneco1
 
Cours polymère presentation powerpoint 46 pages
Cours polymère presentation powerpoint 46 pagesCours polymère presentation powerpoint 46 pages
Cours polymère presentation powerpoint 46 pagesPierreFournier32
 
Accompagnement de l'agrivoltaïsme dans le département de la Nièvre
Accompagnement de l'agrivoltaïsme dans le département de la NièvreAccompagnement de l'agrivoltaïsme dans le département de la Nièvre
Accompagnement de l'agrivoltaïsme dans le département de la Nièvreidelewebmestre
 
BOW 2024 - Le bâtiment multicritère porcin
BOW 2024 - Le bâtiment multicritère porcinBOW 2024 - Le bâtiment multicritère porcin
BOW 2024 - Le bâtiment multicritère porcinidelewebmestre
 
BOW 2024 - Nouveaux modes de logement pour des veaux de boucherie avec accès ...
BOW 2024 - Nouveaux modes de logement pour des veaux de boucherie avec accès ...BOW 2024 - Nouveaux modes de logement pour des veaux de boucherie avec accès ...
BOW 2024 - Nouveaux modes de logement pour des veaux de boucherie avec accès ...idelewebmestre
 

Dernier (20)

BOW 2024 - 3-3 - Adaptation des bâtiments pour ruminants au changement clima...
BOW 2024 - 3-3 -  Adaptation des bâtiments pour ruminants au changement clima...BOW 2024 - 3-3 -  Adaptation des bâtiments pour ruminants au changement clima...
BOW 2024 - 3-3 - Adaptation des bâtiments pour ruminants au changement clima...
 
BOW 2024 - 3 1 - Les infrastructures équestres et le changement climatique
BOW 2024 - 3 1 - Les infrastructures équestres et le changement climatiqueBOW 2024 - 3 1 - Les infrastructures équestres et le changement climatique
BOW 2024 - 3 1 - Les infrastructures équestres et le changement climatique
 
Chapitre 2 : fondations et analyses de données géotechniques
Chapitre 2 : fondations et analyses de données géotechniquesChapitre 2 : fondations et analyses de données géotechniques
Chapitre 2 : fondations et analyses de données géotechniques
 
BOW 2024 -3-9 - Matelas de logettes à eau refroidie VL
BOW 2024 -3-9 - Matelas de logettes à eau refroidie VLBOW 2024 -3-9 - Matelas de logettes à eau refroidie VL
BOW 2024 -3-9 - Matelas de logettes à eau refroidie VL
 
BOW 2024-3-10 - Batcool Petits ruminants
BOW 2024-3-10 - Batcool Petits ruminantsBOW 2024-3-10 - Batcool Petits ruminants
BOW 2024-3-10 - Batcool Petits ruminants
 
Accompagnement de l'agrivoltaisme - Focus sur l'étude système en Merthe et Mo...
Accompagnement de l'agrivoltaisme - Focus sur l'étude système en Merthe et Mo...Accompagnement de l'agrivoltaisme - Focus sur l'étude système en Merthe et Mo...
Accompagnement de l'agrivoltaisme - Focus sur l'étude système en Merthe et Mo...
 
BOW 2024 - Dedans/Dehors quand voir ne suffit pas
BOW 2024 - Dedans/Dehors quand voir ne suffit pasBOW 2024 - Dedans/Dehors quand voir ne suffit pas
BOW 2024 - Dedans/Dehors quand voir ne suffit pas
 
BOW 2024 - 3-8 - Adaptation des bâtiments d'élevages de volailles au changeme...
BOW 2024 - 3-8 - Adaptation des bâtiments d'élevages de volailles au changeme...BOW 2024 - 3-8 - Adaptation des bâtiments d'élevages de volailles au changeme...
BOW 2024 - 3-8 - Adaptation des bâtiments d'élevages de volailles au changeme...
 
BOW 2024 - L'écurie ouverte : un concept inspirant pour la filière équine
BOW 2024 - L'écurie ouverte : un concept inspirant pour la filière équineBOW 2024 - L'écurie ouverte : un concept inspirant pour la filière équine
BOW 2024 - L'écurie ouverte : un concept inspirant pour la filière équine
 
Actions du vent sur les bâtiments selon lEurocode 1 – Partie 1-4.pdf
Actions du vent sur les bâtiments selon lEurocode 1 – Partie 1-4.pdfActions du vent sur les bâtiments selon lEurocode 1 – Partie 1-4.pdf
Actions du vent sur les bâtiments selon lEurocode 1 – Partie 1-4.pdf
 
BOW 2024 -3-7- Impact bâtiment stress thermique Vaches laitières
BOW 2024 -3-7- Impact bâtiment stress thermique Vaches laitièresBOW 2024 -3-7- Impact bâtiment stress thermique Vaches laitières
BOW 2024 -3-7- Impact bâtiment stress thermique Vaches laitières
 
Compersseur d'air a vis atlas copco avec huile
Compersseur d'air a vis atlas copco avec huileCompersseur d'air a vis atlas copco avec huile
Compersseur d'air a vis atlas copco avec huile
 
Bow 2024 - Plein air à l'intérieur des bâtiments d'élevage de ruminants
Bow 2024 - Plein air à l'intérieur des bâtiments d'élevage de ruminantsBow 2024 - Plein air à l'intérieur des bâtiments d'élevage de ruminants
Bow 2024 - Plein air à l'intérieur des bâtiments d'élevage de ruminants
 
BOW 2024 - 3-2 - Stress thermique impact vaches laitières
BOW 2024 - 3-2 - Stress thermique impact vaches laitièresBOW 2024 - 3-2 - Stress thermique impact vaches laitières
BOW 2024 - 3-2 - Stress thermique impact vaches laitières
 
Cadre réglementaire et développement de l'agrivoltaïsme en France
Cadre réglementaire et développement de l'agrivoltaïsme en FranceCadre réglementaire et développement de l'agrivoltaïsme en France
Cadre réglementaire et développement de l'agrivoltaïsme en France
 
Support de cours La technologie WDM.pptx
Support de cours La technologie WDM.pptxSupport de cours La technologie WDM.pptx
Support de cours La technologie WDM.pptx
 
Cours polymère presentation powerpoint 46 pages
Cours polymère presentation powerpoint 46 pagesCours polymère presentation powerpoint 46 pages
Cours polymère presentation powerpoint 46 pages
 
Accompagnement de l'agrivoltaïsme dans le département de la Nièvre
Accompagnement de l'agrivoltaïsme dans le département de la NièvreAccompagnement de l'agrivoltaïsme dans le département de la Nièvre
Accompagnement de l'agrivoltaïsme dans le département de la Nièvre
 
BOW 2024 - Le bâtiment multicritère porcin
BOW 2024 - Le bâtiment multicritère porcinBOW 2024 - Le bâtiment multicritère porcin
BOW 2024 - Le bâtiment multicritère porcin
 
BOW 2024 - Nouveaux modes de logement pour des veaux de boucherie avec accès ...
BOW 2024 - Nouveaux modes de logement pour des veaux de boucherie avec accès ...BOW 2024 - Nouveaux modes de logement pour des veaux de boucherie avec accès ...
BOW 2024 - Nouveaux modes de logement pour des veaux de boucherie avec accès ...
 

Python + ansible = ♥

  • 1. Python + Ansible = ♥ Gonéri Le Bouder Ansible Montéal mai 2017
  • 2.
  • 3. Un peu de contexte Mon D-Link DSP w215 smart plug ● Une catastrophe en terme de sécurité ● Se connecte au Wifi et attend des ordres ● Attend les ordres depuis Internet ● Peut se contrôler depuis le réseau local
  • 4. Un peu de contexte Mon D-Link DSP w215 smart plug ● Une catastrophe en terme de sécurité ● Se connecte au Wifi et attend des ordres ● Attend les ordres depuis Internet ● Peut se contrôler depuis le réseau local
  • 5. Un module Python existe pour le manipuler (pyW215) from pyW215.pyW215 import SmartPlug sp = SmartPlug('192.168.1.110', '******') # Allumer l'interrupteur et l’étendre sp.state = 'ON' sp.state = 'OFF'
  • 6. Et si j’utilisais Ansible pour allumer ma lampe?
  • 7. Les différents types de modules/plugins (1/3) ● Callback Plugins ○ Traite les retours d'exécution ● Connection Plugins ○ SSH ● Lookup Plugins ○ Par example: with_items
  • 8. Les différents types de modules/plugins (2/3) ● Vars Plugins ○ Pour ajouter des variables supplémentaires ● Filter Plugins ○ Filtre pour Jinja2, par exemple: {{ myvar | ipv4 }} ● Modules ○ Par exemple: command: cat /etc/motd ● Action plugins ○ Par exemple: template: src=/mytemplates/foo.j2 dest=/etc/file.conf
  • 9. Les différents types de modules/plugins (3/3) ● Vars Plugins ○ Pour ajouter des variables supplémentaires ● Filter Plugins ○ Filtre pour Jinja2, par exemple: {{ myvar | ipv4 }} ● Modules ○ Par exemple: command: cat /etc/motd ● Action plugins ○ Par exemple: template: src=/mytemplates/foo.j2 dest=/etc/file.conf
  • 10. Un module Ansible (1/5) Ma lib est écrite pour Python 3. Ne pas oublier que le module peut être lancé sur une machine distante: ● Réduire les dépendances ● Éviter d’imposer un virtual-env ● Un seul script sera copié (pas de sous module) ● On utilise la sortie standard pour communiquer #!/usr/bin/python3 from ansible.module_utils.basic import *
  • 11. Un module Ansible (2/5) if __name__ == '__main__': global module module = AnsibleModule( argument_spec={ 'host': { 'required': True, 'type': 'str' }, 'password': { 'required': True, 'type': 'str' }, 'state': { 'required': True, 'type': 'str' } }, supports_check_mode=False ⇐ Ne PAS lancer en “mode à froid” (dry mode) )
  • 12. Un module Ansible (3/5) if module.params['state'] in ('present', 'on', 'ON'): expectation = 'ON' elif module.params['state'] in ('absent', 'off', 'OFF'): expectation = 'OFF' else: module.fail_json(msg="Invalid parameter for state") try: from pyW215.pyW215 import SmartPlug except ImportError: module.fail_json(msg="The module depends on pyW215")
  • 13. Un module Ansible (4/5) if module.params['state'] in ('present', 'on', 'ON'): expectation = 'ON' elif module.params['state'] in ('absent', 'off', 'OFF'): expectation = 'OFF' else: module.fail_json(msg="Invalid parameter for state") try: from pyW215.pyW215 import SmartPlug except ImportError: module.fail_json(msg="The module depends on pyW215") ⇐ ne PAS utiliser print() !
  • 14. Un module Ansible (5/5) sp = SmartPlug(module.params['host'], module.params['password']) changed = expectation != sp.state sp.state = expectation module.exit_json(changed=changed)
  • 15. Les chemins Enregistrer le fichier dans : ./plugins/library/smartplug.py Et créer un fichier local ansible.cfg: [defaults] library = ./plugins/library
  • 16. Exécution du nouveau module A ce stade je peux déjà lancer mon module: ansible localhost -m smartplug -a 'host=somewhere password=secret state=on'
  • 17. Mon playbook pour allumer la lumière --- - hosts: localhost tasks: - smartplug: host: '192.168.1.120' password: '851004' state: 'on' ansible-playbook -vvv set_light.yml
  • 18. Et si il fait sombre ?!
  • 19. Et si il fait sombre ?! Oui ? Et si il y a des nuages ?
  • 20. Et si il fait sombre ?! Oui ? Et si il y a des nuages ? Et si le soleil est couché ?
  • 21. Comment indiquer la météo à Ansible ? (1/3) Openweathermap offre une API REST/JSON, par exemple: http://api.openweathermap.org/data/2.5/weather?q=Montréal,CA&appid=mon_sec ret&units=metric
  • 22. Comment indiquer la météo à Ansible ? (2/3) { "base": "stations", "clouds": { "all": 5 <= Et voilà la couverture nuageuse en % }, "cod": 200, "coord": { "lat": 45.5, "lon": -73.68 }, "dt": 1491703200, "id": 6077246, "main": { "humidity": 55, "pressure": 1012, "temp": 3.33, "temp_max": 4, "temp_min": 2 },
  • 23. Comment indiquer la météo à Ansible ? (3/3) "name": "Montréal", "sys": { "country": "CA", "id": 3829, "message": 0.0397, "sunrise": 1491733166, "sunset": 1491780822, <= Je sais quand il fait nuit ! "type": 1 }, "visibility": 24140, "weather": [ { "description": "clear sky", "icon": "02n", "id": 800, "main": "Clear" } ], "wind": { "deg": 230, "speed": 2.1
  • 24. Facile, Il faut faire un curl et parser du JSON Ansible n’est pas vraiment fait pour ça … enfin si avec le filtre to_json mais bon … Python serait tellement plus chouette ! ☺
  • 25. Les différents types de modules/plugins (3/3) ● Vars Plugins ○ Pour ajouter des variables supplémentaires ● Filter Plugins ○ Filtre pour Jinja2, par exemple: {{ myvar | ipv4 }} ● Modules ○ Par exemple: command: cat /etc/motd ● Action plugins ○ Par exemple: template: src=/mytemplates/foo.j2 dest=/etc/file.conf
  • 26. Un module Action ● Cette fois on veut un traitement local ● L’API est un peu différente ● Pas d'exécution par une machine distante ● Évalué par le process Python du Ansible papa
  • 27. Un module Action (1/2) #!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import (absolute_import, division, print_function) __metaclass__ = type from ansible.plugins.action import ActionBase from ansible.utils.vars import merge_hash try: from __main__ import display except ImportError: from ansible.utils.display import Display display = Display() import os import requests
  • 28. Un module Action (2/2) class ActionModule(ActionBase): def run(self, tmp=None, task_vars=None): if task_vars is None: task_vars = dict() results = super(ActionModule, self).run(tmp, task_vars) location = self._task.args.get('location', None) units = self._task.args.get('units', 'metric')
  • 29. Un module Action (2/2) display.vv("Looking for weather via 'openweathermap': location=%s" % location) r = requests.get( 'http://api.openweathermap.org/data/2.5/weather', params={ 'q': location, 'appid': os.environ['OPENWEATHERMAP_ID'], 'units': units})
  • 30. Un module Action (2/2) results = merge_hash( results, r.json()) return results ● Ansible utilise la valeur retournée ici (dictionnaire Python) ● On peut donc polluer la sortie standard avec des print() partout ● mais on ne le fait pas pour ne pas contourner les callbacks :-)
  • 31. J’enregistre mon Action Dans le fichier plugins/action/weather.py J’édite mon ansible.cfg pour ajouter ce nouveau chemin: [defaults] action_plugins = ./plugins/action library = ./plugins/library
  • 32. Plus qu’a ! --- - hosts: localhost tasks: - name: Récupère la météo de Montréal weather: location: "Montréal,CA" register: meteo - set_fact: plug_state: 'on' when: (meteo.clouds.all | int > 75) or (meteo.sys.sunrise < ansible_date_time.epoch | int) - set_fact: plug_state: 'off' when: ansible_date_time.hour | int < 21 - smartplug: host: '192.168.1.120' password: 'mon secret' state: '{{ plug_state }}'
  • 33. Quelques idées pour continuer Déclencher le playbook automatiquement, par exemple: ● Toutes les 20 minutes ● Avec un unit et un timer pour systemd
  • 34. Quelques idées pour continuer Une notification à la fin, par exemple avec ● Le module “mail” ● Ou telegram.