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

conception d'un batiment r+4 comparative de defferente ariante de plancher
conception d'un  batiment  r+4 comparative de defferente ariante de plancherconception d'un  batiment  r+4 comparative de defferente ariante de plancher
conception d'un batiment r+4 comparative de defferente ariante de planchermansouriahlam
 
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...Institut de l'Elevage - Idele
 
comprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestioncomprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestionyakinekaidouchi1
 
GAL2024 - Décarbonation du secteur laitier : la filière s'engage
GAL2024 - Décarbonation du secteur laitier : la filière s'engageGAL2024 - Décarbonation du secteur laitier : la filière s'engage
GAL2024 - Décarbonation du secteur laitier : la filière s'engageInstitut de l'Elevage - Idele
 
Câblage, installation et paramétrage d’un réseau informatique.pdf
Câblage, installation et paramétrage d’un réseau informatique.pdfCâblage, installation et paramétrage d’un réseau informatique.pdf
Câblage, installation et paramétrage d’un réseau informatique.pdfmia884611
 
JTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdfJTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdfInstitut de l'Elevage - Idele
 
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...Institut de l'Elevage - Idele
 
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdfJTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdfInstitut de l'Elevage - Idele
 
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...Institut de l'Elevage - Idele
 
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...Institut de l'Elevage - Idele
 
JTC 2024 - Réglementation européenne BEA et Transport.pdf
JTC 2024 - Réglementation européenne BEA et Transport.pdfJTC 2024 - Réglementation européenne BEA et Transport.pdf
JTC 2024 - Réglementation européenne BEA et Transport.pdfInstitut de l'Elevage - Idele
 
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenusGAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenusInstitut de l'Elevage - Idele
 
Algo II : les piles ( cours + exercices)
Algo II :  les piles ( cours + exercices)Algo II :  les piles ( cours + exercices)
Algo II : les piles ( cours + exercices)Sana REFAI
 
GAL2024 - Changements climatiques et maladies émergentes
GAL2024 - Changements climatiques et maladies émergentesGAL2024 - Changements climatiques et maladies émergentes
GAL2024 - Changements climatiques et maladies émergentesInstitut de l'Elevage - Idele
 
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...Institut de l'Elevage - Idele
 
GAL2024 - L'élevage laitier cultive la biodiversité
GAL2024 - L'élevage laitier cultive la biodiversitéGAL2024 - L'élevage laitier cultive la biodiversité
GAL2024 - L'élevage laitier cultive la biodiversitéInstitut de l'Elevage - Idele
 
WBS OBS RACI_2020-etunhjjlllllll pdf.pdf
WBS OBS RACI_2020-etunhjjlllllll pdf.pdfWBS OBS RACI_2020-etunhjjlllllll pdf.pdf
WBS OBS RACI_2020-etunhjjlllllll pdf.pdfSophie569778
 

Dernier (20)

conception d'un batiment r+4 comparative de defferente ariante de plancher
conception d'un  batiment  r+4 comparative de defferente ariante de plancherconception d'un  batiment  r+4 comparative de defferente ariante de plancher
conception d'un batiment r+4 comparative de defferente ariante de plancher
 
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
 
comprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestioncomprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestion
 
JTC 2024 - DeCremoux_Anomalies_génétiques.pdf
JTC 2024 - DeCremoux_Anomalies_génétiques.pdfJTC 2024 - DeCremoux_Anomalies_génétiques.pdf
JTC 2024 - DeCremoux_Anomalies_génétiques.pdf
 
GAL2024 - Décarbonation du secteur laitier : la filière s'engage
GAL2024 - Décarbonation du secteur laitier : la filière s'engageGAL2024 - Décarbonation du secteur laitier : la filière s'engage
GAL2024 - Décarbonation du secteur laitier : la filière s'engage
 
Câblage, installation et paramétrage d’un réseau informatique.pdf
Câblage, installation et paramétrage d’un réseau informatique.pdfCâblage, installation et paramétrage d’un réseau informatique.pdf
Câblage, installation et paramétrage d’un réseau informatique.pdf
 
JTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdfJTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdf
 
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
 
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdfJTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
 
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...
 
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
 
JTC 2024 - Réglementation européenne BEA et Transport.pdf
JTC 2024 - Réglementation européenne BEA et Transport.pdfJTC 2024 - Réglementation européenne BEA et Transport.pdf
JTC 2024 - Réglementation européenne BEA et Transport.pdf
 
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenusGAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
 
Algo II : les piles ( cours + exercices)
Algo II :  les piles ( cours + exercices)Algo II :  les piles ( cours + exercices)
Algo II : les piles ( cours + exercices)
 
GAL2024 - Changements climatiques et maladies émergentes
GAL2024 - Changements climatiques et maladies émergentesGAL2024 - Changements climatiques et maladies émergentes
GAL2024 - Changements climatiques et maladies émergentes
 
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
 
JTC 2024 Bâtiment et Photovoltaïque.pdf
JTC 2024  Bâtiment et Photovoltaïque.pdfJTC 2024  Bâtiment et Photovoltaïque.pdf
JTC 2024 Bâtiment et Photovoltaïque.pdf
 
CAP2ER_GC_Presentation_Outil_20240422.pptx
CAP2ER_GC_Presentation_Outil_20240422.pptxCAP2ER_GC_Presentation_Outil_20240422.pptx
CAP2ER_GC_Presentation_Outil_20240422.pptx
 
GAL2024 - L'élevage laitier cultive la biodiversité
GAL2024 - L'élevage laitier cultive la biodiversitéGAL2024 - L'élevage laitier cultive la biodiversité
GAL2024 - L'élevage laitier cultive la biodiversité
 
WBS OBS RACI_2020-etunhjjlllllll pdf.pdf
WBS OBS RACI_2020-etunhjjlllllll pdf.pdfWBS OBS RACI_2020-etunhjjlllllll pdf.pdf
WBS OBS RACI_2020-etunhjjlllllll pdf.pdf
 

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.