2016-04-19 4 views
2

Ich habe eine wirklich harte Zeit zu tun, was scheint wie eine ziemlich Standard-Aufgabe, so hoffe ich, jemand kann mir helfen. Ich habe das wie verrückt gegoogelt und die meisten Beispiele sind nicht in VPC oder verwenden veraltete Strukturen, die sie in meinem Anwendungsfall falsch oder unbrauchbar machen.Erstellen n neuer Instanzen in AWS EC2 VPC und dann konfigurieren

Hier sind meine Ziele:

  1. ich will (unten hat 3 der gleiche Code, aber es könnte ein hundert sein) ein ganzes Durcheinander von neuen Instanzen in meiner VPC starten
  2. Ich will warten für thoseinstances am leben zu kommen
  3. ich diese Instanzen dann konfiguriert werden soll (ssh in sie, Hostnamen ändern, einige Dienste, etc. etc. ermöglichen)

N Ich könnte das wahrscheinlich in 2 Aufgaben machen. Ich könnte die Instanzen in 1 Playbook erstellen. Warte, bis sie sich beruhigt haben. Führen Sie dann ein zweites Playbook aus, um sie zu konfigurieren. Wahrscheinlich werde ich das jetzt tun, weil ich in Bewegung kommen will - aber es muss eine einzige Antwort geben.

Hier ist, was ich bisher für ein Textbuch

--- 
- hosts: localhost 
    connection: local 
    gather_facts: False 
    tasks: 
    - name: Provision Lunch 
     with_items: 
     - hostname: eggroll1 
     - hostname: eggroll2 
     - hostname: eggroll3 
     ec2: 
     region: us-east-1 
     key_name: eggfooyong 
     vpc_subnet_id: subnet-8675309 
     instance_type: t2.micro 
     image: ami-8675309 
     wait: true 
     group_id: sg-8675309 
     exact_count: 1 
     count_tag: 
      Name: "{{ item.hostname }}" 
     instance_tags: 
      Name: "{{ item.hostname }}" 
      role: "supper" 
      ansibleowned: "True" 
     register: ec2 

    - name: Wait for SSH to come up 
     wait_for: host={{ item.private_ip }} port=22 delay=60 timeout=900 state=started 
     with_items: '{{ec2.instances}}' 

    - name: Update hostname on instances 
     hostname: name={{ item.private_ip }} 
     with_items: '{{ec2.instances}}' 

Und die doens't Arbeit. Was ich bekomme, ist

TASK [Wait for SSH to come up] ************************************************* 
[DEPRECATION WARNING]: Skipping task due to undefined Error, in the future this will be a fatal error.. This feature will be removed in a future release. Deprecation warnings can be disabled by setting 
deprecation_warnings=False in ansible.cfg. 

TASK [Update hostname on instances] ******************************************** 
[DEPRECATION WARNING]: Skipping task due to undefined Error, in the future this will be a fatal error.. This feature will be removed in a future release. Deprecation warnings can be disabled by setting 
deprecation_warnings=False in ansible.cfg. 

Was mich traurig macht. Das ist jetzt meine letzte Inkarnation dieses Playbooks. Aber ich habe versucht, es mit jedem Beispiel neu zu schreiben, das ich im Internet finden kann. Die meisten von ihnen haben with_items auf eine andere Art geschrieben, aber ansible sagt mir, dass dieser Weg entzogen ist, und dann scheitert.

Bis jetzt war Ansible lustig und einfach, aber das lässt mich meinen Laptop über die Straße werfen.

Irgendwelche Vorschläge? Sollte ich überhaupt register und with_items benutzen? Würde ich besser mit etwas wie diesem sein:

add_host: hostname={{item.public_ip}} groupname=deploy 

statt? Ich bin weit offen für eine Neufassung hier. Ich schreibe das in 2 Spielbüchern und würde gerne Vorschläge bekommen.

Danke!

**** EDIT **** Jetzt fängt es an, sich gebrochen oder ernsthaft verändert zu fühlen. Ich habe Dutzende von Beispielen gegooglet und alle sind auf die gleiche Weise geschrieben und alle scheitern mit dem gleichen Fehler. Das ist mein einfaches Spielbuch jetzt:

--- 
- hosts: localhost 
    connection: local 
    gather_facts: False 
    vars: 
    builderstart: 93 
    builderend: 94 
    tasks: 
    - name: Provision Lunch 
     ec2: 
     region: us-east-1 
     key_name: dakey 
     vpc_subnet_id: subnet-8675309 
     instance_type: t2.micro 
     image: ami-8675309 
     wait: True 
     group_id: sg-OU812 
     exact_count: 1 
     count_tag: 
      Name: "{{ item }}" 
     instance_tags: 
      Name: "{{ item }}" 
      role: "dostuff" 
      extracheese: "True" 
     register: ec2 
     with_sequence: start="{{builderstart}}" end="{{builderend}}" format=builder%03d 


    - name: the newies 
     debug: msg="{{ item }}" 
     with_items: "{{ ec2.instances }}" 

Es könnte wirklich nicht einfacher sein. Egal wie ich es schreiben, egal, wie ich es variieren, bekomme ich die gleichen grundlegenden Fehler:

[DEPRECATION WARNING]: Skipping task due to undefined Error, in the future this will be a fatal error.: 'dict object' has no attribute 'instances'.

So sieht es aus wie es die with_items ist: „{{ec2.instances}}“ Zeile, die den Fehler verursacht .

Ich habe Debug verwendet, um ec2 auszudrucken, und dieser Fehler sieht genau aus. Es sieht so aus, als hätte sich die Struktur zu mir verändert. Es sieht so aus, als ob ec2 jetzt ein Wörterbuch mit Ergebnissen als Schlüssel zu einem anderen Wörterbuchobjekt enthält und Instanzen ein Schlüssel in diesem Wörterbuch sind. Aber ich kann keinen vernünftigen Weg finden, auf die Daten zuzugreifen.

Für das, was es wert ist, ich in 2.0.1 versucht habe diesen Zugriff auf 2.0.2 und 2.2 und ich das gleiche Problem in jedem Fall erhalten.

sind der Rest von euch 1,9 oder etwas mit? Ich kann nirgends ein Beispiel finden, das funktioniert. Es ist sehr frustrierend.

Nochmals vielen Dank für jede Hilfe.

+0

Müssen Sie das Paradigma der "veränderbaren Infrastruktur" verwenden? Eine Möglichkeit besteht darin, Ihre AMIs vorab mit Packer zu konfigurieren. Sie könnten Packer sogar Ihr Ansible-Playbook für Sie ausführen lassen. Dann können Sie das AMI einfach direkt starten. In Bezug auf Ihren Ansible-Fehler, nicht sicher in diesem. –

+0

Nun, Ihr Problem hier ist in der Art und Weise, wie Sie EC2-Modul verwenden – vvchik

+0

Sie könnten eine Autoscaling-Gruppe verwenden, um die ec2 hinzufügen, dann haben Sie ein Ende der Konfiguration – Vorsprung

Antwort

1

Tun Sie es nicht so:
- name: Provision Lunch with_items: - hostname: eggroll1 - hostname: eggroll2 - hostname: eggroll3 ec2: region: us-east-1

Weil es dich über alle Informationen von EC2 in Ihrem Artikel zu spülen.
Sie empfangen folgende Ausgabe:

TASK [Launch instance] ********************************************************* 
changed: [localhost] => (item={u'hostname': u'eggroll1'}) 
changed: [localhost] => (item={u'hostname': u'eggroll2'}) 

aber Artikel wie folgt sein sollte:

changed: [localhost] => (item={u'kernel': None, u'root_device_type': u'ebs', u'private_dns_name': u'ip-172-31-29-85.ec2.internal', u'public_ip': u'54.208.138.217', u'private_ip': u'172.31.29.85', u'id': u'i-003b63636e7ffc27c', u'ebs_optimized': False, u'state': u'running', u'virtualization_type': u'hvm', u'architecture': u'x86_64', u'ramdisk': None, u'block_device_mapping': {u'/dev/sda1': {u'status': u'attached', u'delete_on_termination': True, u'volume_id': u'vol-37581295'}}, u'key_name': u'eggfooyong', u'image_id': u'ami-fce3c696', u'tenancy': u'default', u'groups': {u'sg-aabbcc34': u'ssh'}, u'public_dns_name': u'ec2-54-208-138-217.compute-1.amazonaws.com', u'state_code': 16, u'tags': {u'ansibleowned': u'True', u'role': u'supper'}, u'placement': u'us-east-1d', u'ami_launch_index': u'1', u'dns_name': u'ec2-54-208-138-217.compute-1.amazonaws.com', u'region': u'us-east-1', u'launch_time': u'2016-04-19T08:19:16.000Z', u'instance_type': u't2.micro', u'root_device_name': u'/dev/sda1', u'hypervisor': u'xen'}) 

Versuchen verwenden Sie folgenden Code

- name: Create a sandbox instance 
    hosts: localhost 
    gather_facts: False 
    vars: 
    keypair: eggfooyong 
    instance_type: t2.micro 
    security_group: ssh 
    image: ami-8675309 
    region: us-east-1 
    subnet: subnet-8675309 
    instance_names: 
     - eggroll1 
     - eggroll2 
    tasks: 
    - name: Launch instance 
     ec2: 
     key_name: "{{ keypair }}" 
     group: "{{ security_group }}" 
     instance_type: "{{ instance_type }}" 
     image: "{{ image }}" 
     wait: true 
     region: "{{ region }}" 
     vpc_subnet_id: "{{ subnet }}" 
     assign_public_ip: no 
     count: "{{ instance_names | length }}" 
     register: ec2 

    - name: tag instances 
     ec2_tag: 
     resource: '{{ item.0.id }}' 
     region: '{{ region }}' 
     tags:   
      Name: '{{ item.1 }}' 
      role: "supper" 
      ansibleowned: "True" 
     with_together: 
     - '{{ ec2.instances }}' 
     - '{{ instance_names }}' 

    - name: Wait for SSH to come up 
     wait_for: host={{ private_ip }} port=22 delay=60 timeout=320 state=started 
     with_items: '{{ ec2.instances }}' 

Annahme, dass Ihr ansible Host innerhalb von VPC befindet

+0

Ansible-Host ist in meiner VPC - und das sieht vielversprechend und sehr anders als alles, was ich in meinen eigenen Suchen gefunden habe. Ich werde es ausprobieren und Sie wissen lassen. Vielen Dank! –

+0

@ericwoodworth Wie läuft es? – vvchik

+0

von anderen Dingen zugeschlagen. Ich habe 2 ansible Playbooks zusammengeschmissen, um den Job zu erledigen, und ich lasse sie einfach in Reihenfolge laufen. Das war gut genug, um Leute zum Arbeiten zu bringen, aber ich werde es entweder morgen oder über das Wochenende umschreiben. Die Vorschläge hier sehen vielversprechend aus und ich werde sicherlich einen Follow-up hinterlassen. –

0

dieses Ziel zu erreichen, ich habe einen wirklich kleinen Filter Plugin get_ec2_info geschrieben.

Erstellen Sie ein Verzeichnis mit dem Namen filter_plugins

Erstellen Sie eine Plugin-Datei get_ec2_info.py mit folgendem Inhalt:

from jinja2.utils import soft_unicode 

class FilterModule(object): 

    def filters(self): 
     return { 
      'get_ec2_info': get_ec2_info, 
     } 

def get_ec2_info(list, ec2_key): 

    ec2_info = [] 
    for item in list: 
     for ec2 in item['instances']: 
      ec2_info.append(ec2[ec2_key]) 
    return ec2_info 

Dann können Sie diese in Ihrem Textbuch verwenden:

--- 
- hosts: localhost 
    connection: local 
    gather_facts: False 
    tasks: 
    - name: Provision Lunch 
     ec2: 
     region: us-east-1 
     key_name: eggfooyong 
     vpc_subnet_id: subnet-8675309 
     instance_type: t2.micro 
     image: ami-8675309 
     wait: true 
     group_id: sg-8675309 
     exact_count: 1 
     count_tag: 
      Name: "{{ item.hostname }}" 
     instance_tags: 
      Name: "{{ item.hostname }}" 
      role: "supper" 
      ansibleowned: "True" 
     register: ec2 
     with_items: 
     - hostname: eggroll1 
     - hostname: eggroll2 
     - hostname: eggroll3 
    - name: Create SSH Group to login dynamically to EC2 Instance(s) 
    add_host: 
     hostname: "{{ item }}" 
     groupname: my_ec2_servers 
    with_items: "{{ ec2.results | get_ec2_info('public_ip') }}" 

    - name: Wait for SSH to come up on EC2 Instance(s) 
    wait_for: 
     host: "{{ item }}" 
     port: 22 
     state: started 
    with_items: "{{ ec2.results | get_ec2_info('public_ip') }}" 

# CALL THE DYNAMIC GROUP IN THE SAME PLAYBOOK 
- hosts: my_ec2_servers 
    become: yes 
    remote_user: ubuntu 
    gather_facts: yes 
    tasks: 
    - name: DO YOUR TASKS HERE 

EXTRA informaiton:

  • mit ansible 2.0.1.0
  • vorausgesetzt, Sie Ubuntu-Instanzen werden hochgefahren, wenn nicht, dann den Wert in remote_user: ubuntu ändern
    • unter der Annahme, SSH-Schlüssel richtig
    • konfiguriert ist

Bitte konsultieren diese github repos für weitere Hilfe:

+0

Das sieht also interessant aus. Es sieht so aus, als würdest du mit der zusätzlichen Ebene der Info-Abstraktion umgehen, die ich sehe. Sie erhalten auch ec2.results mit den Informationen, die Sie wirklich darin leben möchten. Ich überprüfe deine Filter. Als du das zum ersten Mal geschrieben hast, habe ich das Problem, das ich hatte, nicht verstanden, um zu sehen, was du getan hast. Jetzt denke ich, und das macht mehr Sinn für mich. –

+0

@ericwoodworth, toll Sie können auch die mitgelieferten Github-Referenz für vollständige Beispiele überprüfen –

Verwandte Themen