Comment Docker et Ansible s'articulent pour mettre en œuvre la prestation continue/le déploiement continu

je suis nouveau dans les outils de gestion de la configuration et de déploiement. Je dois mettre en œuvre un outil de livraison continue/Déploiement Continu pour l'un des projets les plus intéressants que j'ai jamais mis la main sur.

tout d'abord, individuellement, je suis à l'aise avec AWS, je sais ce que Ansible est la logique derrière elle et de son but. Je n'ai pas le même niveau de compréhension de l' Docker mais j'ai eu l'idée. Je suis passé par beaucoup de ressources sur Internet, mais je ne peux pas obtenir le grand image.

ce que j'ai éprouvé des difficultés, c'est comment ils s'agencent. En utilisant Ansible, je peux gérer mon Infrastructure as Code; la construction EC2 instances, installation de paquets... Je peux même déployer une application complète en tirant son code, modifier des fichiers de configuration et démarrer un serveur web. Docker est, lui-même, un outil qui empaquette une application et s'assure qu'elle peut être exécutée partout où vous la déployez.

Mes problèmes sont les suivants:

comment Docker (ou Ansible et Docker) étendre le processus D'Intégration Continue!?

supposons que nous ayons un dépôt de code source, les membres de l'équipe finissent de travailler sur une fonctionnalité et poussent leur travail. Jenkins détecte ceci, exécute toutes les suites de tests acceptation/unité/intégration et si elles ont toutes réussi, il déclare que c'est une construction stable. Comment va Docker ici? Je veux dire quand L'équipe pousse son travail, est-ce que Jenkins doit extraire le fichier docker source codé dans l'application, Construire l'image de l'application, démarrer le conteneur et exécuter tous les tests contre lui ou il exécute les tests de la manière classique et si tout est bon, puis il construit l'image Docker à partir du fichier Docker et l'enregistre dans un endroit privé? Si Jenkins marque l'image finale à l'aide de X. Y. z par exemple!?

Panneau configuration des conteneurs :

supposons que nous ayons une image construite par Jenkins stockée quelque part, comment gérer le déploiement de la même image dans des environnements différents, et même, différents paramètres de configuration (config Vhosts, hôtes DB, URLs des files d'attente, S3 endpoints, etc...) Quelle est la manière la plus souple de traiter cette question sans rompre Docker principes? Sont ces configurations sauvegardées dans l'image quand il fait construire ou lorsque le container qu'il est commencé, si oui, comment sont-ils injecté?

Ansible et Docker:

Ansible offre Docker module pour gérer Docker conteneurs. En supposant que j'ai résolu les problèmes mentionné ci-dessus, quand je veux déployer une nouvelle version de x.t.z de mon application, je dis Ansible pour extraire cette image de l'endroit où elle était stockée, démarrez le conteneur app, Alors comment injecter les paramètres de configuration!? Ansible doit-il se connecter à L'image Docker, avant qu'elle ne tourne ( cela me semble insensé ) et utiliser ses modèles Jinja2 de la même manière avec un hôte classique!? Si non, comment est-ce géré?!

Excusez-moi si c'est une longue question ou si j'ai mal orthographié quelque chose, mais c'est mon thinking out loud. Je suis bloqué depuis deux semaines et je n'arrive pas à trouver le bon flux de travail. Je veux que ce soit une référence pour les futurs lecteurs.

s'il vous Plaît, il serait très utile de lire vos expériences et des solutions, parce que cela ressemble à un flux de travail courantes. Je vous remercie à l'avance. Toute aide est très appréciée.

17
demandé sur Atilla Ozgur 2016-05-28 16:20:30

3 réponses

je voudrais répondre dans les parties

comment Docker (ou Ansible et Docker) étend le processus D'Intégration Continue!?

comme les images docker sont les mêmes partout, vous utilisez vos images docker comme des images de production. Par conséquent, quand quelqu'un a commis un code, vous construisez votre image de docker. Vous exécutez les tests de comparaison. Lorsque tous les tests passent, vous marquez cette image en conséquence. Comme docker est rapide, c'est un workflow réalisable. Changements de dockers sont incrémentiels; par conséquent, vos images auront un impact minimal sur le stockage. Aussi lors de vos tests échouent, vous pouvez également choisir d'enregistrer l'image. De cette façon, le développeur va tirer cette image et enquêter facilement pourquoi vos tests ont échoué. Le développeur peut choisir d'exécuter des tests dans sa machine aussi puisque les images docker dans jenkins et leur machine ne sont pas différentes.

ce que cela apporte que tous les développeurs auront le même environnement, la même version de tous les logiciels puisque vous décidez qui une sera utilisée dans les images docker. J'ai rencontré des erreurs qui sont dues à des différences entre les ordinateurs de développement. Par exemple, dans le même système d'exploitation, unicode paramètres peuvent affecter votre code. Mais dans les images de docker tous les développeurs vont tester contre les mêmes paramètres, la même version du logiciel.

Panneau configuration des conteneurs :

si vous utilisez un dépôt privé, et vous devriez en utiliser un, alors les changements de configuration n'affecteront pas le disque dur espace de bien. Par conséquent, à l'exception des configurations de sécurité, telles que les mots de passe db, vous pouvez appliquer des changements de configuration aux images docker(cuisson de la Configuration dans le contenant). Ensuite, vous pouvez utiliser ansible pour appliquer des configurations non stockées aux images déployées avant/après le démarrage en utilisant des variables d'environnement ou des Volumes de Dockers.

https://dantehranian.wordpress.com/2015/03/25/how-should-i-get-application-configuration-into-my-docker-containers/

est-ce que Ansible doit se connecter dans l'image du Docker, avant qu'il ne démarre ( cela me semble insensé ) et utiliser ses modèles Jinja2 de la même manière avec un classique de l'hôte!? Si non, comment est-ce géré?!

Non, ansible ne se connecte pas à L'image Docker, mais ansible avec Jinja2 peut être utilisé pour changement dockerfile. Vous pouvez changer dockerfile avec des modèles et vous pouvez injecter votre configuration dans différents fichiers. Marquez vos fichiers en conséquence et vous avez configuré des images pour les lancer.

5
répondu Atilla Ozgur 2016-06-02 10:20:44

en ce qui concerne votre question sur le traitement de plusieurs configurations d'environnement en utilisant la même image de Docker, j'ai prévu d'utiliser un outil de recherche de Service comme Consul comme un outil centralisé de gestion de configuration/propriété. Ainsi, lorsque vous démarrez votre conteneur, vous mettez en place un ENV var qui lui indique quelle application il est (appID), et quel environnement de configuration il devrait utiliser (ex: MyApplication:Dev) et il retirera sa configuration de Consul au démarrage. Je dois encore enquêter sur la sécurité. autour de Consul (comme si nous stockions des identifiants de connexion DB là-bas par exemple, comment restreindre qui peut interroger/mettre à jour ces valeurs). Je ne veux pas simplement l'utiliser pour les conteneurs, mais toutes les applications en général. Une autre possibilité intéressante est de changer la valeur de configuration dans Consul et d'avoir un crochet de retour dans votre application pour appliquer les changements immédiatement (peut-être comme un point de fin de repos sur votre application pour pousser les changements vers le bas et l'appliquer dynamiquement). Bien sûr, votre application doit être écrite pour supporter ce!

vous pourriez être intéressé à consulter les articles de Martin Fowler sur le blog infrastructure immuable et Phoenix serveurs.

4
répondu Eric J. McAlvin 2016-06-03 14:10:30

bien que ce ne soit pas une solution complète, j'ai des suggestions pour deux de vos problèmes. Bien qu'elles ne soient peut-être pas parfaites, ce sont les pratiques que nous utilisons dans notre workflow, et qui font leurs preuves jusqu'à présent.

  1. définition de différents environnements-supposons que vous ayez écrit un rôle Ansible différent pour chaque environnement que vous lancez, nous définissons une variable d'environnement définissant l'environnement auquel nous souhaitons que le conteneur appartienne. Nous téléchargeons ensuite le fichier de configuration approprié depuis un seau S3 en utilisant la variable env définie avant dans le conteneur (ce qui devrait être possible si vous fournissez des creds AWS ou donnez à votre serveur un rôle IAM) et injectez ces paramètres dans le code lors de sa construction.

  2. Ansible n'a pas besoin de se connecter à l'application docker, mais la solution est un peu délicate. J'ai essayé deux façons de résoudre ce problème, et les deux ne sont pas idéales. La première consiste à télécharger le fichier de configuration dans le cadre de la ligne de commande de l'image du docker, et construire l'application sur le conteneur de démarrage. Bien que cette solution fonctionne - elle viole la philosophie du Docker et rend l'image très sujette à des erreurs de construction. Une autre solution consiste à pousser plusieurs images vers votre Docker hub repo, puis à tirer l'image appropriée en fonction de l'environnement à portée de main.

dans un sens plus large, j'ai essayé de lancer complètement notre application avec Ansible et c'était l'enfer, de nombreuses étapes de configuration sont délicates et deviennent plus délicates quand vous essayez d'implémenter comme un livre de jeu. Quand je suis passé à maintenir les severs seul avec L'Ansible, et le déploiement de l'application elle-même avec Docker choses sont devenus beaucoup plus faciles.

1
répondu Yaron Idan 2016-05-29 10:55:54