web-dev-qa-db-fra.com

Meilleure façon de lancer des instances aws ec2 avec ansible

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.

27
JorelC

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)

Pour créer la ou les instances EC2:

Afin de créer l'instance EC2, veuillez modifier ces paramètres que vous pouvez trouver dans le fichier "ec2_launch.yml" sous "vars":

  • région # où vous souhaitez lancer les instances, États-Unis, Australie, Irlande, etc.
  • 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
39
Arbab Nazar

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.

13
Pär Winzell

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.

3
tedder42