SlideShare ist ein Scribd-Unternehmen logo
1 von 31
Downloaden Sie, um offline zu lesen
Testinfra test your infrastructure
Philippe Pepiot <phil@philpep.org>
Auteur et mainteneur de testinfra
Developpeur / Administrateur systèmes @
1
Testinfra
Outil pour tester l'état actuel et le comportement de vos
serveurs
En python
https://testinfra.readthedocs.io
https://github.com/philpep/testinfra
Licence Apache 2
2
La petite histoire
 ­ name: configure pgbouncer userlist
   lineinfile: dest=/etc/pgbouncer/userlist.txt
               regexp='^"user"' line='"user" "pass"'
Ansible 1.7.1:
 "user" "pass" 
Ansible 1.7.2:
 user" "pass 
3
Infrastructure as code
4
Infrastructure as code
ansible, puppet, salt, chef, cfengine
C'est du code !
Comment le tester ?
5
Serveurs de tests, de preprod.
Convient au sein d'une entreprise
Tout le monde ne peut pas travailler dessus en même temps
Ne convient pas aux projets avec des contributeurs externes
(ex: ansible rôles, puppet modules, salt formulas)
6
Technologies
Lancer le déploiement dans un environnement de test
éphémère
Outils
qemu https://www.qemu.org
docker https://docker.com
lxc https://linuxcontainers.org
 $your_favorite_container_tool 
Cloud Openstack / EC2 / GCE
7
Orchestration
Lancer une VM / un container
Deployer avec ansible, salt, puppet, chef, ...
Vérifier
Outils
Vagrant https://www.vagrantup.com
Test­kitchen http://kitchen.ci
Molecule https://molecule.readthedocs.io
8
Intégration continue
Soumission de patch
Processus de revue
Tester les soumissions de patch automatiquement
Intégration continue
Jenkins https://jenkins.io
Travis https://travis­ci.org (on peut lancer des container docker
dans travis: https://docs.travis­ci.com/user/docker/)
9
Vérifier le deploiement
Si le deploiement ne plante pas c'est déjà bien
Mais cela n'apporte pas de garantie sur le bon fonctionnement
de l'infrastructure
Le monitoring teste l'infrastructure en prod mais c'est déjà trop
tard
Solution: Écrire des tests à lancer après le déploiement
10
Serverspec
https://serverspec.org
Première version en 2013
Basé sur RSpec (Beharvior Driven Development en ruby)
describe package('httpd'),
    :if => os[:family] == 'redhat' do
  it { should be_installed }
end
describe package('apache2'),
    :if => os[:family] == 'ubuntu' do
  it { should be_installed }
end
11
Testinfra
Première version en 2015
En python, s'intègre avec pytest: https://pytest.org
def test_apache_installed(host):
    if host.system_info.distribution == 'redhat':
        pkgname = 'httpd'
    else:
        pkgname = 'apache2'
    assert host.package(pkgname).is_installed
12
pytest
L'objet  host  est une fixture pytest définie dans testinfra qui
représente par défaut l'hôte local
Toutes les fonctions qui commencent par  test_  sont des
tests pour pytest.
Beaucoup de fonctionnalités: https://docs.pytest.org
13
Lancement des tests
$ py.test mytest.py
mytest.py::test_apache_installed[local://] PASSED
$ py.test mytest.py
[...]
mytest.py::test_apache_installed[local://] FAILED
[...]
  def test_apache_installed(host):
      if host.system_info.distribution == 'redhat':
          pkgname = 'httpd'
      else:
          pkgname = 'apache2'
>     assert host.package(pkgname).is_installed
E     AssertionError: assert False
E      +  where False = <package apache2>.is_installed
14
Testinfra
Testinfra exécute des commandes localement ou sur un hôte
distant
Permet d'écrire des assertions sur l'état d'un serveur
Abstraction du système avec des objets python
15
Connexions
Accès à l'API via l'objet retourné par  testinfra.get_hosts() 
Testinfra supporte différents types de connexion ("backends"):
local, paramiko, docker, salt, ansible, kubectl, winrm
Les connexions ont des options (utilisateur, sudo, ansible
inventory)
https://testinfra.readthedocs.io/en/latest/backends.html
$ py.test ­­host=paramiko://user@host
test.py::test_postgres[pramiko://user@host] PASSED
$ py.test ­­host=docker://boring,docker://wozniak
test.py::test_postgres[docker://boring] PASSED
test.py::test_postgres[docker://wozniak] PASSED
$ py.test ­­host 'salt://web*'
$ py.test ­­host 'ansible://all?ansible_inventory=hosts'
16
Lancer des commandes
>>> import testinfra
>>> host = testinfra.get_host('ssh://somehost')
>>> host.run('echo foo;echo bar >/dev/stderr; exit 42')
CommandResult(rc=42, stdout='foo', stderr='bar')
Faire des assertions
>>> assert host.check_output('echo foo') == 'bar'
Traceback (most recent call last):
  [...]
AssertionError
17
Modules
package
apt, rpm, *BSD
>>> host.package('nginx').is_installed
True
>>> host.package('nginx').version
'1.2.1­2.2+wheezy3'
service
Systemd, Upstart, Sysv, *BSD
>>> host.service('nginx').is_enabled
True
>>> host.service('nginx').is_running
False
18
Modules
https://testinfra.readthedocs.io/en/latest/modules.html
ansible, file, group, interface, mount_point, package, pip_package,
process, puppet_resource, facter, salt, service, socket, sudo,
supervisor, sysctl, system_info, user
def test_postgres(host):
    postgresql = host.service('postgresql')
    assert postgresql.is_enabled
    assert postgresql.is_running
    
    with host.sudo('postgres'):
        assert host.check_output(
            "psql ­tAc 'show shared_buffers'"
        ) == '256MB'
    
    assert sum([p.pmem for p in
                host.process.filter(user='postgres')
               ]) < 80
    assert len(host.socket('tcp://5432').clients) < 50
19
ansible
>>> host.ansible(
...     "apt", "name=nginx state=present")["changed"]
False
>>> host.ansible.get_variables()
{
    'inventory_hostname': 'localhost',
    'group_names': ['ungrouped'],
    'foo': 'bar',
}
20
Unittest
Testinfra peut s'utiliser sans pytest
On peut obtenir un objet  host  avec  testinfra.get_host() 
Par exemple unittest:
import unittest
import testinfra
class TestTC(unittest.TestCase):
    def setUp(self):
        self.host = testinfra.get_host('local://')
        
    def test_postgres(self):
        self.assertTrue(
            self.host.service('postgres').is_enabled)
            
if __name__ == '__main__':
    unittest.main()
21
Test multi hôte
On peut instancier plusieurs hôtes dans les tests
Sans coût supplémentaire, il y a un cache des hôtes.
import testinfra
def test_same_users():
    srv0 = testinfra.get_host('paramiko://srv0')
    srv1 = testinfra.get_host('paramiko://srv1')
    assert srv0.check_output('getent passwd') == (
        srv1.check_output('getent passwd'))
22
Réutilisation des tests
Certains tests peuvent être proches des tests de monitoring
L'option  ­­nagios  permet à testinfra de se comporter comme
une sonde nagios
$ testinfra ­q ­­nagios
TESTINFRA OK ­ 1 passed, 0 failed, 0 skipped in 0.02 seconds
23
Test de Dockerfile
Surcharge de la fixture  host 
import testinfra
@pytest.fixture(scope="session")
def host():
    check_output = testinfra.get_host(
        'local://').check_output
    check_output('docker build . ­t myapp')
    docker_id = check_output('docker run ­d myapp')
    yield testinfra.get_host(
        'docker://{}'.format(docker_id))
    check_output('docker rm ­f %s', docker_id)
    
def test_myapp(host):
    # write assertions
24
Test­kitchen
On peut utiliser testinfra en verifier de test­kitchen
verifier:
  name: shell
  command: testinfra ­­host="paramiko://
  ${KITCHEN_USERNAME}@${KITCHEN_HOSTNAME}:${KITCHEN_PORT}
  ?ssh_identity_file=${KITCHEN_SSH_KEY}"
  ­­junit­xml "junit­${KITCHEN_INSTANCE}.xml"
  "test/integration/${KITCHEN_SUITE}"
25
Vagrant
$ vagrant ssh­config > .vagrant/ssh­config
$ py.test ­­hosts=default 
    ­­ssh­config=.vagrant/ssh­config tests/
26
Molecule
https://molecule.readthedocs.io
https://github.com/metacloud/molecule
Outil complet pour tester des rôles ansible
Intègre testinfra nativement
27
Exemples de suite de tests
https://github.com/ceph/ceph­ansible
https://github.com/freedomofpress/securedrop
28
Autres projets
serverspec (BDD, ruby)
goss: https://github.com/aelsabbahy/goss en go, fichier de
spec json, local only
inspec, ruby orienté chef: https://www.inspec.io/
29
Roadmap
Lancer des commandes en background
with host.run('journalctl ­f') as output:
    testmyapp()
assert 'some log' in output.stdout
Pouvoir maintenir des modules, connecteurs en dehors de
testinfra
Support MacOS / Windows ? (help wanted)
30
Questions ?
https://philpep.org/dl/testinfra_pyconfr_2017.pdf
31

Weitere ähnliche Inhalte

Ähnlich wie Testinfra pyconfr 2017

BBL - TDD pour les DevOps - Puppet
BBL - TDD pour les DevOps - PuppetBBL - TDD pour les DevOps - Puppet
BBL - TDD pour les DevOps - PuppetOlivier BAZOUD
 
Industrialisation PHP - Canal+
Industrialisation PHP - Canal+Industrialisation PHP - Canal+
Industrialisation PHP - Canal+ekino
 
20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache MavenArnaud Héritier
 
Puppet, la philosophie DevOps
Puppet, la philosophie DevOpsPuppet, la philosophie DevOps
Puppet, la philosophie DevOpsJeoffrey Bauvin
 
DevOps, freedom to get stuff done
DevOps, freedom to get stuff doneDevOps, freedom to get stuff done
DevOps, freedom to get stuff doneAhmed Bessifi
 
Automatisation des tests - objectifs et concepts - partie 2
Automatisation des tests  - objectifs et concepts - partie 2Automatisation des tests  - objectifs et concepts - partie 2
Automatisation des tests - objectifs et concepts - partie 2Christophe Rochefolle
 
Jenkins - Les jeudis de la découverte
Jenkins - Les jeudis de la découverteJenkins - Les jeudis de la découverte
Jenkins - Les jeudis de la découverteStephane Couzinier
 
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOps@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOlivier DASINI
 
Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon Ippon
 
20100221 my phingtool - blog
20100221   my phingtool - blog20100221   my phingtool - blog
20100221 my phingtool - blogPHPPRO
 
AT2010 Principes Integration Continue
AT2010 Principes Integration ContinueAT2010 Principes Integration Continue
AT2010 Principes Integration ContinueNormandy JUG
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015Stéphane Legrand
 
Ma boîte à outils DevOps
Ma boîte à outils DevOpsMa boîte à outils DevOps
Ma boîte à outils DevOpsNoël Bardelot
 
Python application packaging @ MeilleursAgents
Python application packaging @ MeilleursAgentsPython application packaging @ MeilleursAgents
Python application packaging @ MeilleursAgentsNicolas Mussat
 
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !vincent aniort
 
Industrialiser le contrat dans un projet PHP
Industrialiser le contrat dans un projet PHPIndustrialiser le contrat dans un projet PHP
Industrialiser le contrat dans un projet PHPhalleck45
 

Ähnlich wie Testinfra pyconfr 2017 (20)

BBL - TDD pour les DevOps - Puppet
BBL - TDD pour les DevOps - PuppetBBL - TDD pour les DevOps - Puppet
BBL - TDD pour les DevOps - Puppet
 
Industrialisation PHP - Canal+
Industrialisation PHP - Canal+Industrialisation PHP - Canal+
Industrialisation PHP - Canal+
 
Cerberus Testing
Cerberus TestingCerberus Testing
Cerberus Testing
 
20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven
 
Puppet, la philosophie DevOps
Puppet, la philosophie DevOpsPuppet, la philosophie DevOps
Puppet, la philosophie DevOps
 
Présentation devops&puppet 04112014
Présentation devops&puppet 04112014 Présentation devops&puppet 04112014
Présentation devops&puppet 04112014
 
Jenkins
JenkinsJenkins
Jenkins
 
DevOps, freedom to get stuff done
DevOps, freedom to get stuff doneDevOps, freedom to get stuff done
DevOps, freedom to get stuff done
 
Automatisation des tests - objectifs et concepts - partie 2
Automatisation des tests  - objectifs et concepts - partie 2Automatisation des tests  - objectifs et concepts - partie 2
Automatisation des tests - objectifs et concepts - partie 2
 
Jenkins - Les jeudis de la découverte
Jenkins - Les jeudis de la découverteJenkins - Les jeudis de la découverte
Jenkins - Les jeudis de la découverte
 
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOps@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
 
Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon
 
20100221 my phingtool - blog
20100221   my phingtool - blog20100221   my phingtool - blog
20100221 my phingtool - blog
 
AT2010 Principes Integration Continue
AT2010 Principes Integration ContinueAT2010 Principes Integration Continue
AT2010 Principes Integration Continue
 
Xhprof
XhprofXhprof
Xhprof
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015
 
Ma boîte à outils DevOps
Ma boîte à outils DevOpsMa boîte à outils DevOps
Ma boîte à outils DevOps
 
Python application packaging @ MeilleursAgents
Python application packaging @ MeilleursAgentsPython application packaging @ MeilleursAgents
Python application packaging @ MeilleursAgents
 
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
 
Industrialiser le contrat dans un projet PHP
Industrialiser le contrat dans un projet PHPIndustrialiser le contrat dans un projet PHP
Industrialiser le contrat dans un projet PHP
 

Mehr von Logilab

Open Source & Open Data : les bienfaits des communs
Open Source & Open Data : les bienfaits des communsOpen Source & Open Data : les bienfaits des communs
Open Source & Open Data : les bienfaits des communsLogilab
 
Salon Open Data
Salon Open DataSalon Open Data
Salon Open DataLogilab
 
Pydata Paris Python for manufacturing musical instruments
Pydata Paris Python for manufacturing musical instrumentsPydata Paris Python for manufacturing musical instruments
Pydata Paris Python for manufacturing musical instrumentsLogilab
 
Présentation Logilab
Présentation LogilabPrésentation Logilab
Présentation LogilabLogilab
 
Système d'archivage électronique mutualisé
Système d'archivage électronique mutualiséSystème d'archivage électronique mutualisé
Système d'archivage électronique mutualiséLogilab
 
Utiliser salt pour tester son infrastructure sur open stack ou docker
Utiliser salt pour tester son infrastructure sur open stack ou dockerUtiliser salt pour tester son infrastructure sur open stack ou docker
Utiliser salt pour tester son infrastructure sur open stack ou dockerLogilab
 
Importer des données en Python avec CubicWeb 3.21
Importer des données en Python avec CubicWeb 3.21Importer des données en Python avec CubicWeb 3.21
Importer des données en Python avec CubicWeb 3.21Logilab
 
Simulagora au service d'un grand défi industriel
Simulagora au service d'un grand défi industrielSimulagora au service d'un grand défi industriel
Simulagora au service d'un grand défi industrielLogilab
 
Simulagora - Salon du Bourget
Simulagora - Salon du BourgetSimulagora - Salon du Bourget
Simulagora - Salon du BourgetLogilab
 
Innover par et pour la donnée - Logilab ADBU Bibcamp 2015
Innover par et pour la donnée - Logilab ADBU Bibcamp 2015Innover par et pour la donnée - Logilab ADBU Bibcamp 2015
Innover par et pour la donnée - Logilab ADBU Bibcamp 2015Logilab
 
Study of the dynamic behavior of a pump with Code_ASTER on Simulagora
Study of the dynamic behavior of a pump with Code_ASTER on SimulagoraStudy of the dynamic behavior of a pump with Code_ASTER on Simulagora
Study of the dynamic behavior of a pump with Code_ASTER on SimulagoraLogilab
 
Initialiser des conteneurs Docker à partir de configurations Salt construites...
Initialiser des conteneurs Docker à partir de configurations Salt construites...Initialiser des conteneurs Docker à partir de configurations Salt construites...
Initialiser des conteneurs Docker à partir de configurations Salt construites...Logilab
 
Battle Opendata - Logilab - Cubicweb
Battle Opendata - Logilab - CubicwebBattle Opendata - Logilab - Cubicweb
Battle Opendata - Logilab - CubicwebLogilab
 
Debconf14 : Putting some salt in your Debian systems -- Julien Cristau
Debconf14 : Putting some salt in your Debian systems -- Julien CristauDebconf14 : Putting some salt in your Debian systems -- Julien Cristau
Debconf14 : Putting some salt in your Debian systems -- Julien CristauLogilab
 
Simulagora (Euroscipy2014 - Logilab)
Simulagora (Euroscipy2014 - Logilab)Simulagora (Euroscipy2014 - Logilab)
Simulagora (Euroscipy2014 - Logilab)Logilab
 
PAFI (Euroscipy2014 - Logilab)
PAFI (Euroscipy2014 - Logilab)PAFI (Euroscipy2014 - Logilab)
PAFI (Euroscipy2014 - Logilab)Logilab
 
Open Legislative Data Conference 2014
Open Legislative Data Conference 2014Open Legislative Data Conference 2014
Open Legislative Data Conference 2014Logilab
 
Pylint : 10 ans, état des lieux
Pylint : 10 ans, état des lieuxPylint : 10 ans, état des lieux
Pylint : 10 ans, état des lieuxLogilab
 
BRAINOMICS A management system for exploring and merging heterogeneous brain ...
BRAINOMICS A management system for exploring and merging heterogeneous brain ...BRAINOMICS A management system for exploring and merging heterogeneous brain ...
BRAINOMICS A management system for exploring and merging heterogeneous brain ...Logilab
 
Présentation sur le stand à l'OpenWorldForum 2013
Présentation sur le stand à l'OpenWorldForum 2013Présentation sur le stand à l'OpenWorldForum 2013
Présentation sur le stand à l'OpenWorldForum 2013Logilab
 

Mehr von Logilab (20)

Open Source & Open Data : les bienfaits des communs
Open Source & Open Data : les bienfaits des communsOpen Source & Open Data : les bienfaits des communs
Open Source & Open Data : les bienfaits des communs
 
Salon Open Data
Salon Open DataSalon Open Data
Salon Open Data
 
Pydata Paris Python for manufacturing musical instruments
Pydata Paris Python for manufacturing musical instrumentsPydata Paris Python for manufacturing musical instruments
Pydata Paris Python for manufacturing musical instruments
 
Présentation Logilab
Présentation LogilabPrésentation Logilab
Présentation Logilab
 
Système d'archivage électronique mutualisé
Système d'archivage électronique mutualiséSystème d'archivage électronique mutualisé
Système d'archivage électronique mutualisé
 
Utiliser salt pour tester son infrastructure sur open stack ou docker
Utiliser salt pour tester son infrastructure sur open stack ou dockerUtiliser salt pour tester son infrastructure sur open stack ou docker
Utiliser salt pour tester son infrastructure sur open stack ou docker
 
Importer des données en Python avec CubicWeb 3.21
Importer des données en Python avec CubicWeb 3.21Importer des données en Python avec CubicWeb 3.21
Importer des données en Python avec CubicWeb 3.21
 
Simulagora au service d'un grand défi industriel
Simulagora au service d'un grand défi industrielSimulagora au service d'un grand défi industriel
Simulagora au service d'un grand défi industriel
 
Simulagora - Salon du Bourget
Simulagora - Salon du BourgetSimulagora - Salon du Bourget
Simulagora - Salon du Bourget
 
Innover par et pour la donnée - Logilab ADBU Bibcamp 2015
Innover par et pour la donnée - Logilab ADBU Bibcamp 2015Innover par et pour la donnée - Logilab ADBU Bibcamp 2015
Innover par et pour la donnée - Logilab ADBU Bibcamp 2015
 
Study of the dynamic behavior of a pump with Code_ASTER on Simulagora
Study of the dynamic behavior of a pump with Code_ASTER on SimulagoraStudy of the dynamic behavior of a pump with Code_ASTER on Simulagora
Study of the dynamic behavior of a pump with Code_ASTER on Simulagora
 
Initialiser des conteneurs Docker à partir de configurations Salt construites...
Initialiser des conteneurs Docker à partir de configurations Salt construites...Initialiser des conteneurs Docker à partir de configurations Salt construites...
Initialiser des conteneurs Docker à partir de configurations Salt construites...
 
Battle Opendata - Logilab - Cubicweb
Battle Opendata - Logilab - CubicwebBattle Opendata - Logilab - Cubicweb
Battle Opendata - Logilab - Cubicweb
 
Debconf14 : Putting some salt in your Debian systems -- Julien Cristau
Debconf14 : Putting some salt in your Debian systems -- Julien CristauDebconf14 : Putting some salt in your Debian systems -- Julien Cristau
Debconf14 : Putting some salt in your Debian systems -- Julien Cristau
 
Simulagora (Euroscipy2014 - Logilab)
Simulagora (Euroscipy2014 - Logilab)Simulagora (Euroscipy2014 - Logilab)
Simulagora (Euroscipy2014 - Logilab)
 
PAFI (Euroscipy2014 - Logilab)
PAFI (Euroscipy2014 - Logilab)PAFI (Euroscipy2014 - Logilab)
PAFI (Euroscipy2014 - Logilab)
 
Open Legislative Data Conference 2014
Open Legislative Data Conference 2014Open Legislative Data Conference 2014
Open Legislative Data Conference 2014
 
Pylint : 10 ans, état des lieux
Pylint : 10 ans, état des lieuxPylint : 10 ans, état des lieux
Pylint : 10 ans, état des lieux
 
BRAINOMICS A management system for exploring and merging heterogeneous brain ...
BRAINOMICS A management system for exploring and merging heterogeneous brain ...BRAINOMICS A management system for exploring and merging heterogeneous brain ...
BRAINOMICS A management system for exploring and merging heterogeneous brain ...
 
Présentation sur le stand à l'OpenWorldForum 2013
Présentation sur le stand à l'OpenWorldForum 2013Présentation sur le stand à l'OpenWorldForum 2013
Présentation sur le stand à l'OpenWorldForum 2013
 

Testinfra pyconfr 2017