daniel-rhoades.aws-elb

Circle CI

aws-elb-role

Rôle Ansible pour simplifier la mise en place et la décommission des ELB au sein d'un compte AWS.

Pour des informations détaillées sur la création :

Ce rôle configurera complètement un ELB multi-AZ et l'enregistrera avec un enregistrement dans Route 53 dans la zone de votre choix.

Exigences

Nécessite les derniers modules de support EC2 d'Ansible ainsi que Boto.

Vous devrez également configurer votre environnement Ansible pour qu'il fonctionne avec AWS, voir http://docs.ansible.com/ansible/guide_aws.html.

Variables du rôle

Valeurs par défaut :

  • elb_purge_subnets : Purger les écouteurs existants sur l'ELB qui ne se trouvent pas dans les écouteurs, par défaut à vrai ;
  • elb_cross_az_load_balancing : Distribuer la charge sur toutes les zones de disponibilité configurées, par défaut à vrai ;
  • elb_connection_draining_timeout : Attendre un temps d'attente spécifié permettant aux connexions de se vider avant de terminer une instance, par défaut à 60 secondes ;
  • elb_listeners : Écouteurs pour l'ELB, 80:80 est disponible par défaut ;
  • elb_health_check : Vérification de l'état à exécuter pour déterminer la santé de l'instance, par défaut de créer une connexion TCP au port 80 ;
  • route53_overwrite : Écrit les entrées existantes si nécessaire, par défaut à vrai ;
  • route53_alias_evaluate_target_health : Si vous souhaitez que Route 53 surveille la santé des cibles, par défaut à vrai ;
  • ec2_elb_state : État de l'ELB, par défaut à "present" ;
  • route53_zone_state : État de la zone Route 53, par défaut à "present".

Variables requises :

  • elb_name : Vous devez spécifier le nom de l'ELB que vous souhaitez créer, par exemple my-elb ;
  • elb_security_groups : Vous devez spécifier les groupes de sécurité à appliquer à l'ELB que vous souhaitez créer, voir l'exemple de playbook ci-dessous ;
  • elb_region : Vous devez spécifier la région dans laquelle vous souhaitez créer l'ELB, par exemple eu-west-1 ;
  • elb_subnets : Vous devez spécifier les sous-réseaux dans lesquels vous souhaitez rendre l'ELB disponible, voir l'exemple de playbook ci-dessous ;
  • route53_zone : Vous devez spécifier le nom de la zone que vous souhaitez définir, par exemple example.com ;
  • route53_host : Vous devez spécifier le nom de l'hôte que vous souhaitez définir dans la zone, par exemple www.example.com.

Dépendances

Une liste d'autres rôles hébergés sur Galaxy devrait être mentionnée ici, ainsi que des détails concernant les paramètres qui peuvent devoir être définis pour d'autres rôles, ou les variables utilisées à partir d'autres rôles.

Exemple de Playbook

Avant d'utiliser ce rôle, vous devrez l'installer, la manière la plus simple de le faire est : ansible-galaxy install daniel-rhoades.aws-elb-role.

Pour compléter les exemples, les éléments suivants sont créés :

  • VPC pour contenir le cluster ECS, en utilisant le rôle : daniel-rhoades.aws-vpc;
  • Groupes de sécurité EC2 à appliquer aux instances EC2, en utilisant le rôle : daniel-rhoades.aws-security-group.

Après la création, vous pouvez enregistrer vos instances EC2 auprès de l'ELB. L'exemple attend que my_route53_zone soit passé en tant que variable d'environnement en ligne de commande.

- name: Mon Système | Provisionner toute l'infrastructure requise
  hosts: localhost
  connection: local
  gather_facts: no
  vars:
    my_vpc_name: "mon_exemple_vpc"
    my_vpc_region: "eu-west-1"
    my_vpc_cidr: "172.40.0.0/16"
    everywhere_cidr: "0.0.0.0/0"

    # Sous-réseaux dans le VPC
    my_vpc_subnets:
      - cidr: "172.40.10.0/24"
        az: "{{ my_vpc_region }}a"

      - cidr: "172.40.20.0/24"
        az: "{{ my_vpc_region }}b"

    # Autoriser les sous-réseaux à atteindre le monde extérieur
    my_public_subnet_routes:
      - subnets:
          - "{{ my_vpc_subnets[0].cidr }}"
          - "{{ my_vpc_subnets[1].cidr }}"
        routes:
          - dest: "{{ everywhere_cidr }}"
            gw: igw

    # Groupes de sécurité entrants, par exemple des services accessibles au public comme un équilibreur de charge
    my_inbound_security_groups:
      - sg_name: inbound-web
        sg_description: autoriser l'accès http et https (public)
        sg_rules:
          - proto: tcp
            from_port: 80
            to_port: 80
            cidr_ip: "{{ everywhere_cidr }}"

          - proto: tcp
            from_port: 443
            to_port: 443
            cidr_ip: "{{ everywhere_cidr }}"

      # Autoriser uniquement l'accès SSH depuis l'intérieur du VPC, pour accéder à tout service à l'intérieur du VPC,
      # vous devrez créer un hôte bastion temporaire
      - sg_name: inbound-ssh
        sg_description: autoriser l'accès ssh
        sg_rules:
         - proto: tcp
           from_port: 22
           to_port: 22
           cidr_ip: "{{ my_vpc_cidr }}"

    # Groupes de sécurité internes entrants, par exemple des services qui ne devraient pas être directement accessibles
    # de l'extérieur du VPC, tels que les serveurs web derrière l'équilibreur de charge.
    #
    # Cela doit être un fichier car il doit être inclus dynamiquement après la création des groupes de sécurité entrants
    my_internal_inbound_security_groups_file: "internal-securitygroups.yml"

    # Règles sortantes, par exemple, quels services les serveurs web peuvent atteindre par eux-mêmes
    my_outbound_security_groups:
      - sg_name: outbound-all
        sg_description: permet le trafic sortant vers n'importe quelle adresse IP
        sg_rules:
          - proto: all
            cidr_ip: "{{ everywhere_cidr }}"

    # Nom de l'ELB
    my_elb_name: "mon-elb"

    # Nom de l'hôte à créer sur la zone Route 53
    my_route53_host: "mon-service-test"

  roles:
    # Provisionner le réseau
    - {
        role: daniel-rhoades.aws-vpc,
        vpc_name: "{{ my_vpc_name }}",
        vpc_region: "{{ my_vpc_region }}",
        vpc_cidr_block: "{{ my_vpc_cidr }}",
        vpc_subnets: "{{ my_vpc_subnets }}",
        public_subnet_routes: "{{ my_public_subnet_routes }}"
      }

    # Provisionner les groupes de sécurité
    - {
        role: daniel-rhoades.aws-security-groups,
        vpc_region: "{{ my_vpc_region }}",
        vpc_id: "{{ vpc.vpc_id }}",
        ec2_group_inbound_sg: "{{ my_inbound_security_groups }}",
        ec2_group_internal_inbound_sg_file: "{{ my_internal_inbound_security_groups_file }}",
        ec2_group_outbound_sg: "{{ my_outbound_security_groups }}"
      }

    # Provisionner un ELB et l'enregistrer avec un alias dans Route 53
    - {
        role: aws-elb-role,
        elb_name: "{{ my_elb_name }}",
        vpc_name: "{{ my_vpc_name }}",
        elb_security_groups: [
          "{{ ec2_group_inbound_sg.results[0].group_id }}"
          ],
        elb_region: "{{ my_vpc_region }}",
        elb_subnets: [
           "{{ vpc.subnets[0].id }}",
           "{{ vpc.subnets[1].id }}"
         ],
        route53_zone: "{{ my_route53_zone }}",
        route53_host: "{{ my_route53_host }}"
      }

L'exemple internal-securitygroups.yml ressemble à ceci :

ec2_group_internal_inbound_sg:
  - sg_name: inbound-web-internal
    sg_description: autoriser l'accès http et https (uniquement depuis l'équilibreur de charge)
    sg_rules:
      - proto: tcp
        from_port: 80
        to_port: 80
        group_id: "{{ ec2_group_inbound_sg.results[0].group_id }}"

Pour décommissionner l'ELB :

- name: Mon Système | Décommisionner toute l'infrastructure requise
  hosts: localhost
  connection: local
  gather_facts: no
  vars:
    my_vpc_name: "mon_exemple_vpc"
    my_vpc_region: "eu-west-1"
    my_vpc_cidr: "172.40.0.0/16"
    everywhere_cidr: "0.0.0.0/0"

    # Sous-réseaux dans le VPC
    my_vpc_subnets:
      - cidr: "172.40.10.0/24"
        az: "{{ my_vpc_region }}a"

      - cidr: "172.40.20.0/24"
        az: "{{ my_vpc_region }}b"

    # Autoriser les sous-réseaux à atteindre le monde extérieur
    my_public_subnet_routes:
      - subnets:
          - "{{ my_vpc_subnets[0].cidr }}"
          - "{{ my_vpc_subnets[1].cidr }}"
        routes:
          - dest: "{{ everywhere_cidr }}"
            gw: igw

    # Nom du cluster ECS à créer
    my_ecs_cluster_name: "mon-cluster"

    # Nom de l'ELB
    my_elb_name: "mon-elb"

    # Nom de l'hôte à créer sur la zone Route 53
    my_route53_host: "mon-service-test"

  roles:
    # Provisionner le réseau
    - {
        role: daniel-rhoades.aws-vpc,
        vpc_name: "{{ my_vpc_name }}",
        vpc_region: "{{ my_vpc_region }}",
        vpc_cidr_block: "{{ my_vpc_cidr }}",
        vpc_subnets: "{{ my_vpc_subnets }}",
        public_subnet_routes: "{{ my_public_subnet_routes }}"
      }

    # Provisionner les groupes de sécurité
    - {
        role: daniel-rhoades.aws-security-groups,
        vpc_region: "{{ my_vpc_region }}",
        vpc_id: "{{ vpc.vpc_id }}",
        ec2_group_inbound_sg: "{{ my_inbound_security_groups }}",
        ec2_group_internal_inbound_sg_file: "{{ my_internal_inbound_security_groups_file }}",
        ec2_group_outbound_sg: "{{ my_outbound_security_groups }}"
      }

    # Décommissionner l'ELB (point de terminaison REST)
    - {
        role: aws-elb-role,
        ec2_elb_state: "absent",
        vpc_name: "{{ my_vpc_name }}",
        elb_name: "{{ my_elb_name }}",
        route53_zone: "{{ my_route53_zone }}",
        route53_host: "{{ my_route53_host }}"
      }

Licence

MIT

Informations sur l'auteur

Daniel Rhoades (https://github.com/daniel-rhoades)

À propos du projet

Ansible role for simplifying the provisioning and decommissioning of an ELB within an AWS account

Installer
ansible-galaxy install daniel-rhoades.aws-elb
Licence
mit
Téléchargements
83
Propriétaire
Strategist, Technologist and Engineer