2015-07-20 12 views
6

Ich versuche, ein AWS EC2 ansible Textbuch zu erstellen, dass:ansible: Der Versuch, in einem mehrere EC2-Instanzen in mehreren Regionen erstellen Schuss

1) ersten VPC jeweils auf drei Regionen zuordnet, die sind: us- West-1, Ap-Nordosten-1 und Eu-West-1.

2) Ermittelt die aktuelle ubuntu AMI für jede Region (ec2_ami_search),

3 dann) die ermittelten Ergebnisse von 1) unter Verwendung von und 2), einer EC2 Instanz pro Region mit der neuesten ubuntu AMI erstellen (zum die Region) mit Availibility Zonen us-west-1a, ap-nordost-1a und eu-west-1a, beziehungsweise.

Mit ansible hatte ich kein Problem bei Schritt 1) ​​und 2), die war einfach:

> 

    tasks: 
    - name: create a vpc 
    ec2_vpc: 
     state: present 
     region: "{{ item.region }}" 
     internet_gateway: True 
     resource_tags: { env: production} 
     cidr_block: 10.0.0.0/16 
     subnets: 
     - cidr: 10.0.0.0/24 
      az: "{{ item.az }}" 
      resource_tags: 
      env: production 
      tier: public 
     route_tables: 
     - subnets: 
      - 10.0.0.0/24 
      routes: 
      - dest: 0.0.0.0/0 
      gw: igw 
    with_items: 
     - region: us-west-1 
     az: us-west-1a 
     - region: ap-northeast-1 
     az: ap-northeast-1a 
     - region: eu-west-1 
     az: eu-west-1a 
... 
    - name: Get the ubuntu trusty AMI 
    ec2_ami_search: distro=ubuntu release=trusty virt=hvm region={{ item }} 
    with_items: 
     - us-west-1 
     - ap-northeast-1 
     - eu-west-1 
    register: ubuntu_image 
... 
> 

und die für die ubuntu_image Variable mit Austestmodul ausgegeben:

TASK: [print out ubuntu images] *********************************************** 
ok: [localhost] => { 
    "ubuntu_image": { 
     "changed": false, 
     "msg": "All items completed", 
     "results": [ 
      { 
       "aki": null, 
       "ami": "ami-b33dccf7", 
       "ari": null, 
       "changed": false, 
       "invocation": { 
        "module_args": "distro=ubuntu release=trusty virt=hvm region=us-west-1", 
        "module_name": "ec2_ami_search" 
       }, 
       "item": "us-west-1", 
       "serial": "20150629", 
       "tag": "release" 
      }, 
      { 
       "aki": null, 
       "ami": "ami-9e5cff9e", 
       "ari": null, 
       "changed": false, 
       "invocation": { 
        "module_args": "distro=ubuntu release=trusty virt=hvm region=ap-northeast-1", 
        "module_name": "ec2_ami_search" 
       }, 
       "item": "ap-northeast-1", 
       "serial": "20150629", 
       "tag": "release" 
      }, 
      { 
       "aki": null, 
       "ami": "ami-7c4b0a0b", 
       "ari": null, 
       "changed": false, 
       "invocation": { 
        "module_args": "distro=ubuntu release=trusty virt=hvm region=eu-west-1", 
        "module_name": "ec2_ami_search" 
       }, 
       "item": "eu-west-1", 
       "serial": "20150629", 
       "tag": "release" 
      } 
     ] 
    } 
} 

jedoch I konnte nicht herausfinden, wie man Schritt 3) das Ergebnis von der ubuntu_image Registervariable nehmen und dann bestimmen, welche der 3 AMIs und Subnetze der gegebenen EC2-Instanz gehörte. Siehe unten, wo als Behelfslösung ich den ami und Subnet Wert manuell fest einprogrammiert , die ich einfach aus dem Ausdruck aus dem oben ubuntu_image Ausdruck bekam:

- name: start the instances 
    ec2: 
     image: "{{ item.ami }}" # MANUALLY HARDCODED 
     region: "{{ item.region }}" 
     instance_type: "{{ instance_type }}" 
     assign_public_ip: True 
     key_name: "{{ item.name }}" 
     group: ["http deployment", "ssh deployment", "outbound deployment"] 
     instance_tags: { Name: "{{ item.name }}", type: ss, env: production} 
     exact_count: "{{ count }}" 
     count_tag: { Name: "{{ item.name }}" } 
     vpc_subnet_id: "{{ item.subnet }}" #MANUALLY HARDCODED 
     wait: yes 
    register: ec2 
    with_items: 
     - region: us-west-1 
     name: ss12 
     ami: ami-b33dccf7 # MANUALLY HARDCODED 
     subnet: subnet-35a22550 # MANUALLY HARDCODED 
     - region: ap-northeast-1 
     name: ss21 
     ami: ami-9e5cff9e # MANUALLY HARDCODED 
     subnet: subnet-88c47dff # MANUALLY HARDCODED 
     - region: eu-west-1 
     name: ss32 
     ami: ami-7c4b0a0b # MANUALLY HARDCODED 
     subnet: subnet-23f59554 # MANUALLY HARDCODED 

Während ami/Subnetz Werke hartzucodieren, können Sie eine Lösung denken für ich um diese hardcoding der ami/subnetz zu vermeiden? Ich habe versucht, mit set_fact ohne Erfolg durcheinander, wie ich es nicht ein Wörterbuch der „Region ami“ Werte-Mappings zu werden erhalten könnte zu

Antwort

4

Beachten Sie, dass Ansible ein „steckbar“ System ist, so ist es wirklich einfach zu gestalten es für dich selbst. Manchmal ist es sogar einfacher und schneller, als mit Hilfe von nativen Modulen eine Problemumgehung zu finden.

In Ihrem Fall können Sie einfach Ihre eigenen lookup_plugin schreiben, die für eine korrekte subnet suchen würde.

Zum Beispiel:

  1. Erstellen Sie einen Ordner lookup_plugins in Ihrem Hauptordner genannt. Erstellen
  2. eine Datei (wenn Sie noch kein Konto haben) ansible.cfg
[defaults] 
lookup_plugins = lookup_plugins 

Erstellen Sie eine Datei in lookup_pluginssubnets.py

import boto.vpc 
class LookupModule(object): 
    def __init__(self, basedir=None, **kwargs): 
     self.basedir = basedir 
     self.plugin_name = 'subnets' 
    def run(self, regions, variable=None, **kwargs): 
     if not isinstance(regions, list): 
      regions = [regions] 
     for region in regions: 
      return [boto.vpc.connect_to_region(region).get_all_subnets()[0].id] 

Die obige einfachen Code für genannt genannt aussehen würde, ein Subnetz in einer bestimmten Region. Natürlich können Sie es beliebig anpassen.

Dann in Ihrem Textbuch Referenz dieses Plugin korrekt Subnetz finden:

Beispiel:

- hosts: localhost 
    gather_facts: no 
    tasks: 
    - name: Start instance 
     debug: msg="Starting instance {{ item.ami }} in {{ item.region }} in {{ item.subnet }}" 
     with_items: 
     - region: us-west-1 
      name: ss12 
      ami: ami-b33dccf7 
      subnet: "{{ lookup('subnets', 'us-west-1') }}" 
     - region: ap-northeast-1 
      name: ss21 
      ami: ami-9e5cff9e 
      subnet: "{{ lookup('subnets', 'ap-northeast-1') }}" 
     - region: eu-west-1 
      name: ss32 
      ami: ami-7c4b0a0b 
      subnet: "{{ lookup('subnets', 'ap-northeast-1') }}" 

In Ihrem Fall würden Sie wahrscheinlich richtig die AMI und die damit verbundenen Region verweisen müssen.

0

wenn Sie wollen immer noch den von einem anderen Modul ohne Hilfe zu tun, können Sie die Modulo ‚%‘ des Servers und die Subnetze Länge berechnen:

"{{subnets[item.0 | int % subnets | length | int].aws_ec2_subnets}}" 

Beispielcode

Vars:

subnets: 
    - {zone: "us-east-1a", aws_ec2_subnets: 'subnet-123'} 
    - {zone: "us-east-1b", aws_ec2_subnets: 'subnet-456'} 
    - {zone: "us-east-1d", aws_ec2_subnets: 'subnet-789'} 

server_list: 
    - server1 
    - server2 
    - server3 

Aufgabe:

- name: Create new ec2 instance 
    ec2: 
    profile: "{{aws_profile}}" 
    key_name: "{{aws_key_name}}" 
    group_id: "{{aws_security_group}}" 
    instance_type: "{{aws_instance_type}}" 
    image: "{{aws_ami}}" 
    region: "{{region}}" 
    exact_count: "1" 
    #instance_profile_name: none 
    wait: yes 
    wait_timeout: 500 
    volumes: "{{volumes}}" 
    monitoring: no 
    vpc_subnet_id: "{{subnets[item.0 | int % subnets | length | int].aws_ec2_subnets}}" 
    assign_public_ip: no 
    tenancy: default 
    termination_protection: yes 
    instance_tags: 
     App: "{{app_name}}" 
     Environment: "{{environment_type}}" 
     Platform: "{{platform_name}}" 
     Name: "{{item.1}}" 
    count_tag: 
     App: "{{app_name}}" 
     Environment: "{{environment_type}}" 
     Platform: "{{platform_name}}" 
     Name: "{{item.1}}" 
    register: ec2_new_instance 
    with_indexed_items: 
    - "{{server_list}}" 
Verwandte Themen