Comment utiliser Ansible pour gérer vos ressources AWS

N'aimeriez-vous pas pouvoir simplement agiter une baguette et des couches de ressources dans votre compte AWS prendraient soudainement - et comme par magie - une vie parfaitement configurée, prêtes à répondre à vos besoins d'infrastructure complexes?

Si vous avez déjà de l'expérience avec AWS, vous savez à quel point il peut être pénible de travailler sur une page Web après une page Web dans la console de gestion Amazon lorsque vous provisionnez manuellement les services. Et même l'AWS CLI - qui représente une avancée considérable - peut ajouter sa propre complexité et ses propres efforts au mélange.

Cela ne veut pas dire qu'AWS lui-même ne résout pas le problème avec sa propre classe d'outils d'orchestration puissants, y compris CloudFormation et leur service Elastic Kubernetes (quelque chose que j'aborde en détail dans mon cours "Utilisation de Docker sur AWS" à Pluralsight). Mais aucune de ces options n'est aussi proche de votre infrastructure existante - ou n'utilise un mode de fonctionnement aussi familier - qu'Ansible.

Si vous utilisez déjà Ansible pour vos opérations sur site, le connecter à votre compte AWS peut parfois être le moyen le plus rapide et le plus simple de migrer des opérations vers le cloud.

Comprendre l'avantage Ansible / AWS

Mon livre «Gérer les ressources AWS à l'aide d'Ansible» - dont cet article est extrait - est conçu pour vous présenter rapidement l'application de l' approche déclarative d'Ansible au travail avec les ressources AWS. Être capable de «déclarer» les résultats de configuration précis que vous voulez, puis de les produire en demandant à Ansible de lire un playbook est la baguette magique d'Ansible. Lorsqu'il est correctement planifié, il est étonnant de voir à quel point il peut être simple d'exécuter des déploiements AWS complexes et en couches.

Avant de lancer un simple playbook Ansible «Hello World», vérifions d'abord que vous disposez d'un environnement de travail correctement configuré grâce auquel Ansible peut communiquer avec tous ses nouveaux amis dans votre compte AWS.

Préparer un environnement local

Comme vous le savez probablement déjà, Ansible est un outil d'orchestration qui vous permet d'écrire des fichiers de lecture en texte brut qui déclarent le profil logiciel et l'état idéal que vous souhaitez appliquer à un serveur cible. Ces serveurs, appelés hôtes, peuvent être provisionnés pour à peu près n'importe quelle charge de travail numérique que vous pouvez imaginer, en utilisant à peu près n'importe quelle combinaison de logiciels d'application et en s'exécutant sur à peu près n'importe quelle plateforme.

Dans le bon vieux temps, lorsqu'un playbook était exécuté sur un serveur physique, Ansible utilisait une connexion SSH existante pour se connecter en toute sécurité à l'hôte distant et créer votre application. Mais cela ne fonctionnera pas pour les charges de travail AWS. Vous voyez, comme les instances EC2 et les autres infrastructures que vous souhaitez lancer n'existent pas encore, il ne peut y avoir aucune connexion SSH «existante». Au lieu de cela, Ansible utilisera Boto 3 - le kit de développement logiciel (ou SDK) utilisé par AWS qui permet au code Python de communiquer avec l'API AWS.

Utilisation de l'AWS CLI pour connecter Ansible

Vous ne devez pas savoir comment tout cela fonctionne, mais il doit être là il peut fonctionner. Pour cette raison, vous allez installer l'interface de ligne de commande AWS (CLI). Nous n'utiliserons pas la CLI elle-même pour quoi que ce soit d'important, mais son installation nous donnera toutes les dépendances dont nous aurons besoin. Vous pouvez découvrir comment faire fonctionner cela sur la dernière version du système d'exploitation que vous utilisez à partir de la page de documentation AWS.

Travailler avec le gestionnaire de packages Python, PIP, est un moyen populaire de faire tout cela. Voici comment installer PIP lui-même, puis l'AWS CLI sur une machine Ubuntu:

sudo apt update sudo apt install python3-pip pip3 install awscli

Je dois noter qu'au moment où j'écris ceci, Python 2 est toujours vivant ... mais seulement juste. Il peut donc parfois y avoir des versions distinctes de Python 2 et Python 3 installées sur votre système. Puisque Python 2 sera bientôt complètement obsolète, vous n'aurez probablement pas à vous soucier de spécifier python3 ou pip3 avec vos commandes: cela devrait être automatique.

Une fois la CLI installée, exécutez aws configureet entrez votre ID de clé d'accès AWS et votre clé d'accès secrète.

aws configure cat .aws/credentials

Vous pouvez obtenir des clés à partir de la page Vos informations d'identification de sécurité dans AWS Management Console. Voici à quoi ressembleront ces clés (n'obtenez pas d'idées coquines, celles-ci ne sont pas valides):

AccessKeyId: AKIALNZTQW6H3EFBRLHQ SecretAccessKey: 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

N'oubliez pas qu'une paire de clés émises à l'utilisateur racine de votre compte AWS fournit un accès complet à l'ensemble de votre compte AWS. Toute personne en possession de ces informations d'identification serait rapidement en mesure d'exécuter des frais de service à six et même sept chiffres, alors faites très attention à la façon dont vous les utilisez et les stockez. Idéalement, vous feriez mieux de limiter votre exposition aux risques en créant un utilisateur administrateur dans le service AWS Identify and Access Management (IAM) avec des pouvoirs limités et en utilisant une clé émise à cet utilisateur.

En tout cas, pourquoi est-ce que je fais ça? La valeur du remplissage de mon fichier d'informations d'identification AWS est qu'Ansible est suffisamment intelligent pour le rechercher et, si aucune autre clé d'authentification n'est disponible dans l'environnement système, il les utilisera. Vous verrez bientôt à quel point ce sera pratique. Cependant, vous devez connaître d'autres moyens de gérer l'authentification pour les playbooks Ansible, comme l'utilisation d' ansible-vault ou en créant puis en invoquant un fichier aws_keys.yml. Mais une chose que vous ne devriez certainement PAS faire est de coder en dur les clés de vos fichiers de playbook - surtout si vous prévoyez de les pousser vers un référentiel en ligne comme GitHub. Je vais rapidement tester la CLI pour m'assurer que nous pouvons correctement nous connecter à AWS. Cette simple commande listera tous les compartiments S3 que j'ai dans ce compte.

aws s3 ls

Nous sommes maintenant prêts à installer ansible. Je vais aller avec pip3 pour cela. Je pourrais utiliser le référentiel Ubuntu apt tout aussi facilement, mais il installera très probablement une version légèrement plus ancienne. En fonction de votre connexion réseau, cela prendra une minute ou deux, mais je vais sauter la plupart de cela.

$ pip3 install ansible 

Je vais confirmer qu'il est correctement installé en exécutant ansible --version. Cela nous montre la version qui a été construite, que les modules Ansible configurés seront, par défaut, enregistrés dans l'un ou l'autre de ces deux emplacements dans le système de fichiers, que d'autres modules seraient disponibles ici et - surtout - que l'exécutable Ansible se trouve dans le répertoire / local / bin / sous le répertoire personnel de mon utilisateur. Mon utilisateur ici, d'ailleurs, s'appelle ubuntu. Vous pouvez également voir que nous utilisons une belle version à jour de Python 3.

$ ansible --version ansible 2.8.5 config file = None configured module search path = ['/home/ubuntu/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /home/ubuntu/.local/lib/python3.6/site-packages/ansible executable location = /home/ubuntu/.local/bin/ansible python version = 3.6.8 (default, Aug 20 2019, 17:12:48) [GCC 8.3.0] 

Un pas de plus. Comme je l'ai mentionné précédemment, Ansible se connectera à AWS à l'aide du SDK boto. Nous devrons donc installer les packages boto et boto 3. J'irai aussi avec PIP pour celui-ci.

$ pip3 install boto boto3 

Une fois que celui-ci aura été intégré, nous serons prêts à faire de vraies choses. Cela commencera dans la section suivante.

Tester Ansible avec un Playbook simple

Cela va être une démonstration de preuve de concept très simple. Je vais créer quelques fichiers, vous expliquer la syntaxe, puis le lancer. Tout d'abord, j'utiliserai n'importe quel éditeur de texte brut pour créer un fichier hosts . Normalement, le fichier hosts indique à Ansible où il peut trouver les serveurs distants que vous souhaitez provisionner. Mais puisque, dans le cas d'AWS, les ressources qui seront nos hôtes n'existent pas encore, nous pointerons simplement Ansible vers localhost et boto gérera les connexions en arrière-plan. Voici à quoi ressemblera le contenu de ce fichier:

[local] localhost 

Ensuite, je vais créer un fichier de playbook que j'appellerai test-ansible.yml. L'extension yml, bien sûr, indique que ce fichier doit être formaté à l'aide de la syntaxe du langage de balisage YAML. Comme vous pouvez le voir dans le texte du fichier que j'ai collé juste en dessous, cela commencera par trois tirets marquant le début du fichier, puis un tiret en retrait introduisant un ensemble de définitions. La valeur des "hôtes" pourrait être un ou plusieurs ordinateurs distants mais, comme je l'ai dit, nous laisserons cela au système local de comprendre. Il en va de même pour notre connexion.

La section suivante comprend les tâches que nous voulons qu'Ansible exécute. Celui-ci utilisera le module aws_s3 pour créer un nouveau compartiment sur le service de stockage simple S3 d'Amazon dans la région us-east-1. Je dois lui donner ce nom laid car les compartiments S3 nécessitent des noms uniques au monde - si un nom que vous choisissez entre en conflit avec l'un des millions de noms déjà disponibles, l'opération échouera.

--- - name: Test s3 hosts: local connection: local tasks: - name: Create new bucket aws_s3: bucket: testme817275b mode: create region: us-east-1 

Je lance le playbook en appelant la commande ansible-playbook en utilisant -i pour spécifier le fichier hosts, puis en pointant vers le fichier test.yml. Ansible devrait nous faire part de vos commentaires dans un instant ou deux. Si nous réussissons, vous verrez "0" comme valeur de "failed" et au moins "1" comme valeur de "ok".

$ ansible-playbook -i hosts test-ansible.yml PLAY [Test s3] ****************************************************** TASK [Create new bucket] ******************************************** changed: [localhost] PLAY RECAP ********************************************************** localhost: ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

Si je vérifie à nouveau ma liste de seaux, je devrais - et je fais - voir le nouveau:

$ aws s3 ls 2018-12-30 15:19:24 elasticbeanstalk-us-east-1-297972716276 2018-10-12 04:09:37 mysite548.com 2019-09-24 15:53:26 testme817275b 

C'est une très brève introduction à la configuration d'un environnement Ansible. Nous avons vu comment l'utilisation d'Ansible avec les ressources provisionnées automatiquement d'Amazon va fonctionner différemment avec les hôtes Ansible traditionnels. Vous allez avoir besoin d'un autre ensemble d'outils d'authentification et de contrôle des stocks. Nous avons parcouru le processus de configuration d'un environnement Ansible et de sa connexion à AWS, puis d'exécution d'un simple playbook. Court et doux.

Cet article provient de mon livre "Gérer les ressources AWS à l'aide d'Ansible". Il y a plus de bonté technologique - sous la forme de livres, de cours et d'articles - disponibles sur mon site Web, bootstrap-it.com.