J'essaie de créer une petite infrastructure webapp avec ansible sur Amazon AWS et je veux faire tout le processus: lancer l'instance, configurer les services, etc. mais je ne trouve pas d'outil ou de module approprié pour gérer cela depuis ansible. Lancement EC2 principalement.
Merci beaucoup.
Ceci est la réponse courte à votre question, si vous voulez des détails et un rôle entièrement automatisé, faites-le moi savoir. Merci
Prérequis:
Ansible
Bibliothèque boto Python
Configurer l'accès AWS et les clés secrètes dans les paramètres d'environnement
(le mieux est à l'intérieur du ~./boto)
Afin de créer l'instance EC2, veuillez modifier ces paramètres que vous pouvez trouver dans le fichier "ec2_launch.yml" sous "vars":
count # Nombre d'instances que vous souhaitez créer
Une fois que vous avez mentionné ces paramètres, veuillez exécuter la commande suivante:
ansible-playbook -i héberge ec2_launch.yml
Contenu du fichier hosts:
[local]
localhost
[webserver]
Contenu du fichier ec2_launch.yml:
---
- name: Provision an EC2 Instance
hosts: local
connection: local
gather_facts: False
tags: provisioning
# Necessary Variables for creating/provisioning the EC2 Instance
vars:
instance_type: t1.micro
security_group: webserver # Change the security group name here
image: AMI-98aa1cf0 # Change the AMI, from which you want to launch the server
region: us-east-1 # Change the Region
keypair: ansible # Change the keypair name
count: 1
# Task that will be used to Launch/Create an EC2 Instance
tasks:
- name: Create a security group
local_action:
module: ec2_group
name: "{{ security_group }}"
description: Security Group for webserver Servers
region: "{{ region }}"
rules:
- proto: tcp
type: ssh
from_port: 22
to_port: 22
cidr_ip: 0.0.0.0/0
- proto: tcp
from_port: 80
to_port: 80
cidr_ip: 0.0.0.0/0
rules_egress:
- proto: all
type: all
cidr_ip: 0.0.0.0/0
- name: Launch the new EC2 Instance
local_action: ec2
group={{ security_group }}
instance_type={{ instance_type}}
image={{ image }}
wait=true
region={{ region }}
keypair={{ keypair }}
count={{count}}
register: ec2
- name: Add the newly created EC2 instance(s) to the local Host group (located inside the directory)
local_action: lineinfile
dest="./hosts"
regexp={{ item.public_ip }}
insertafter="[webserver]" line={{ item.public_ip }}
with_items: "{{ ec2.instances }}"
- name: Wait for SSH to come up
local_action: wait_for
Host={{ item.public_ip }}
port=22
state=started
with_items: "{{ ec2.instances }}"
- name: Add tag to Instance(s)
local_action: ec2_tag resource={{ item.id }} region={{ region }} state=present
with_items: "{{ ec2.instances }}"
args:
tags:
Name: webserver
Comme d'autres l'ont dit, le module cloud contient à peu près tout le support de provisionnement AWS dont vous auriez besoin. Cela dit, le paradigme d'Ansible prend tout son sens une fois qu'il existe une machine SSH existante: capable de cibler et de se connecter. La phase d'instanciation, par comparaison, vous demande essentiellement de cibler votre machine locale et appelle les points de terminaison d'API AWS à partir de là.
Comme vous, je voulais une commande mono-coup avec une transition gracieuse de l'instanciation EC2 dans sa configuration. Il y a des suggestions sur la façon d'accomplir quelque chose comme ça dans la documentation , mais il s'appuie sur le module add_Host pour Tweak Ansible l'idée de l'inventaire actuel de l'hôte, et même alors, je n'ai pas pu trouver une solution qui ne fonctionne pas Je sens que je travaillais contre plutôt qu'avec le système.
Au final, j'ai opté pour deux playbooks distincts: un provision.yml qui utilise les modules ec2, ec2_group, ec2_vol, ec2_eip et route53 pour m'assurer d'avoir le "matériel" en place, puis configure.yml, plus comme un site Ansible traditionnel .yml, qui est capable de traiter l'inventaire de l'hôte (statique dans mon cas, mais dynamique fonctionnera bien) comme une donnée et de faire tout ce bon état déclaratif en transition.
Les deux playbooks sont idempotents, mais c'est configure.yml qui est censé être réexécuté encore et encore à long terme.
Le module EC2 a été conçu précisément pour créer et détruire des instances.
Si vous voulez la "meilleure" façon, il est difficile de battre CloudFormation, qui peut être lancé depuis Ansible.