URL: https://linuxfr.org/news/presentation-de-monkeyble-framework-de-test-bout-en-bout-pour-ansible Title: PrĂ©sentation de Monkeyble: Framework de test bout en bout pour Ansible Authors: sispheor palm123, devnewton đŸș, Xavier Teyssier et BenoĂźt Sibaud Date: 2022ćčŽ11月27æ—„T20:02:33+01:00 License: CC By-SA Tags: ansible et testing Score: 29 # PrĂ©sentation de Monkeyble: framework de test bout en bout pour Ansible ![monkeyble_logo](https://github.com/HewlettPackard/monkeyble/raw/master/docs/images/monkeyble_logo.png) Monkeyble est un petit framework qui permet de tester de bout en bout vos playbooks [Ansible](https://fr.wikipedia.org/wiki/Ansible_(logiciel)). Il permet, au niveau des tĂąches des Playbooks, de: - đŸ” VĂ©rifier qu'un module a Ă©tĂ© appelĂ© avec les bons arguments ; - 🙊 VĂ©rifier le rĂ©sultat du retour d'un module ; - 🙈 VĂ©rifier l'Ă©tat d'exĂ©cution d'une tĂąche (changed, skipped, failed) ; - 🙉 Simuler (Mock) un module afin de retourner un rĂ©sultat sans faire appel au vrai module. Monkeyble est tout particuliĂšrement conçu pour ĂȘtre placĂ© dans une CI/CD afin de dĂ©tecter les Ă©ventuels rĂ©gressions lors des modifications sur une base de code Ansible 🚀. ---- [Code](https://github.com/HewlettPackard/monkeyble) [Doc](https://hewlettpackard.github.io/monkeyble/) ---- ## Contexte La stratĂ©gie de test dĂ©crite dans la [documentation officielle de Ansible](https://docs.ansible.com/ansible/latest/reference_appendices/test_strategies.html#testing-lifecycle) consiste a exĂ©cuter un playbook sur un environnement (un inventaire) de dĂ©veloppement qui simule la production et de valider le fonctionnement de celui-ci pour l'exĂ©cuter ensuite sur l'environement de production. Cette stratĂ©gie fonctionne dans le cadre d'un playbook utilisĂ© pour un dĂ©ploiement d'un service Ă  un instant T. Les tests sont effectuĂ©s manuellement en quelque sorte. Une fois le service dĂ©ployĂ©, en cas de modification sur le code, une exĂ©cution devra Ă  nouveau ĂȘtre rĂ©alisĂ©e sur l'environement de dĂ©veloppement avant celui de production et cetera... Cependant, si vos playbooks sont utilisĂ©s en tant que "services" en Ă©tant exposĂ©s par exemple dans un AWX/Tower ou derriĂšre un catalogue de services comme [Squest](https://github.com/HewlettPackard/squest), en cas de modification sur le code il est prĂ©fĂ©rable de vĂ©rifier que le service fonctionne toujours. Un test manuel n'est bien Ă©videmment plus adaptĂ©. On prĂ©fĂ©ra donner ce travail Ă  une CI/CD. Ansible met Ă  disposition de façon native quelques "garde-fous" sous forme de modules Ă  placer dans vos tĂąches, rĂŽles ou playbook afin d'effectuer des Ă©tapes de validation de donnĂ©es tel que "[fail](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/fail_module.html)", "[assert](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/assert_module.html)" ou encore le "[check mode](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_checkmode.html)". Cela n'est pas du test Ă  proprement parler mais il permet d'apporter une forme de vĂ©rification avant l'exĂ©cution. Des projets annexes se sont Ă©galement ajoutĂ©s pour complĂ©ter l'offre. Le plus connu Ă©tant Molecule, ce dernier se base sur la librairie Python "[testinfra](https://testinfra.readthedocs.io/en/latest/)" ou sur Ansible lui mĂȘme afin de, non pas rĂ©ellement de "tester" tĂąche par tĂąche, mais de "[vĂ©rifier](https://molecule.readthedocs.io/en/latest/configuration.html#verifier)" le rĂ©sultat suite Ă  l'exĂ©cution du rĂŽle ou playbook. C'est l'une des choses qui peut dĂ©ranger avec ce framework quand on a l'habitude de coder des tests avec des bibliothĂšques de tests natives (comme [unittest](https://docs.python.org/3/library/unittest.html) en Python par exemple) qui permettent de tester le code lui-mĂȘme. Par ailleurs, comme prĂ©cisĂ© dans la [documentation](https://docs.ansible.com/ansible/latest/reference_appendices/test_strategies.html#the-right-level-of-testing), les ressources Ansible sont des "modĂšles d'Ă©tats souhaitĂ©s". Il n'est donc pas nĂ©cessaire de tester qu'un service a bien Ă©tĂ© dĂ©marrĂ©, qu'un paquet a bien Ă©tĂ© installĂ©, etc. C'est Ansible qui le garantit pour vous. En effet les modules utilisĂ©s dans nos tĂąches ont leur propres tests unitaires qui assurent que ces choses sont dĂ©clarativement vraies. Plus encore, les modules derriĂšre *testinfra* sont d'un nombre limitĂ© et ne peuvent couvrir Ă  eux seuls toutes les possibilitĂ©s d'exĂ©cutions d'un script Ansible. Et puis finalement un Playbook c'est quoi ? C'est bien souvent une suite de manipulations de donnĂ©es avant d'exĂ©cuter un module particulier. Nous rĂ©cupĂ©rons de la donnĂ©e depuis une API d'un cotĂ©, puis de l'autre le rĂ©sultat de l'exĂ©cution d'un module. Pour transformer cette donnĂ©e Ă  l'aide de "[filtre](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_filters.html)" afin de merger des dictionnaires, de crĂ©er des listes, extraire des variables, nous concatĂ©nons le tout avec les informations fournies par l'opĂ©rateur au moment de l'exĂ©cution, etc... pour finalement faire un appel Ă  un autre module dans une nouvelle tĂąche. Comme pour un test unitaire, suivant une liste de variables connues en entrĂ©e nous voulons ĂȘtre certains que cette derriĂšre tĂąche : - est bien exĂ©cutĂ©e (le script peut avoir Ă©chouĂ© en amont) ; - a bien Ă©tĂ© appelĂ©e avec la bonne instanciation d'arguments (notre donnĂ©e transformĂ©e) ; - a bien retournĂ© le rĂ©sultat attendu ; - s'est bien terminĂ©e dans l'Ă©tat souhaitĂ© ("changed", skipped,"failed"). Monkeyble permet ce type de tests avec une approche que l'on retrouve communĂ©ment dans les langages de programmation. ## Petit tour des fonctionnalitĂ©s ### Tester les entrĂ©es Vous pouvez dĂ©clarer une vĂ©rification des valeurs instanciĂ©es passĂ©es en argument des modules ```yaml - task: "my_task_name" test_input: - assert_equal: arg_name: module_argument expected: "my_value" ``` Monkeyble supporte des mĂ©thodes de tests comme celle disponibles dans la librairie [unittest](https://docs.python.org/3/library/unittest.html) de Python: assert_equal, assert_not_equal, assert_in, assert_not_in, assert_true, assert_false, assert_is_none, assert_is_not_none, assert_list_equal, assert_dict_equal. ### Tester le rĂ©sultat des exĂ©cutions de module Les modules Ansible, pour la majeure partie, retournent un dictionnaire qui peut ĂȘtre conservĂ© Ă  l'aide d'un "register" afin d'etre utilisĂ© par les tĂąches suivantes. Monkeyble permet de tester les valeurs retournĂ©es avec les mĂȘmes mĂ©thodes que pour le test des entrĂ©es. ```yaml - task: "my_task_name" test_output: - assert_dict_equal: dict_key: "result.key.name" expected: key1: "my_value" key2: "my_other_value" ``` ### Tester les Ă©tats des tĂąches Une tĂąche Ansible a plusieurs Ă©tats possibles suite Ă  son exĂ©cution. Monkeyble peut vĂ©rifier qu'une tĂąche s'est bien terminĂ©e dans un Ă©tat particulier. ```yaml - task: "my_task_name" should_be_skipped: false should_be_changed: true should_failed: false ``` ### Simuler un module (Monkey patching) Le "Monkey patching", est une technique permettant de modifier dynamiquement une mĂ©thode afin de renvoyer une ou des valeurs prĂ©alablement spĂ©cifiĂ©es dans le test. Monkeyble permet de "mocker" une tĂąche et retourner un rĂ©sultat dĂ©fini. Dans un scĂ©nario oĂč vous travaillez avec des API de cloud, dans un contexte de tests, vous ne souhaitez pas forcĂ©ment crĂ©er rĂ©ellement une instance d'un objet Ă  chaque exĂ©cution de votre CI/CD, cependant vous souhaitez que la tĂąche retourne ce que le vrai module aurait retournĂ© afin d'exĂ©cuter le playbook dans son intĂ©gralitĂ© et que les tĂąches suivantes puissent se servir de cette sortie. ```yaml - task: "my_task_name" mock: config: monkeyble_module: consider_changed: true result_dict: my_key: "mock value" ``` ## Conclusion Monkeyble est trĂšs simple Ă  utiliser, son fonctionnement est entiĂšrement basĂ© sur de la configuration Yaml et reste donc dans le mĂȘme Ă©tat d'esprit que le projet Ansible. Vous pouvez crĂ©er autant de scenarios que nĂ©cessaire afin de : - garantir que vos playbooks ou rĂŽles fonctionnent correctement ; - protĂ©ger des rĂ©gressions suite Ă  une mise Ă  jour de parties partagĂ©es ; - tester unitairement des tĂąches complexes qui manipulent de la donnĂ©e ; - passer dans chacune des conditions et blocs de code ; - valider que vos playbooks s'arrĂȘtent bien (fail) ou ne s'exĂ©cutent pas (skip) quand il le faut ; - que les tĂąches critiques s'exĂ©cutent avec le bon jeu d'arguments. ``` monkeyble test Playbook | Scenario | Test passed -----------+-----------------+------------- play1.yml | validate_test_1 | ✅ play1.yml | validate_test_2 | ✅ play2.yml | validate_this | ✅ play2.yml | validate_that | ✅ đŸ” Monkeyble test result - Tests passed: 4 of 4 tests ``` Happy testing Ă  vous ! ✅

AltStyle ă«ă‚ˆăŁăŠć€‰æ›ă•ă‚ŒăŸăƒšăƒŒă‚ž (->ă‚ȘăƒȘă‚žăƒŠăƒ«) /