2016-07-19 37 views
0

Ich kann eine Instanz erstellen, installieren und ein AMI erstellen. Ich stehe fest, wenn ich diesen AMI in alle verfügbaren Regionen kopieren möchte.Ansible - EC2 Create-Install-AMI-KopieAMI

Etwas wie:
forEach (region in regions): copy-ami to region done

Was ich habe:
- Erstellen Instanz
- Installieren Sachen
- AMI erstellen basierend auf zurückgegebenen Werte von "Create Instance"
- Copy AMI für alle Regionen basierend auf "Create AMI" - (funktioniert nicht!)

Ist das der richtige Weg? Wie würde ich das richtig machen?

(ich weiß, das ist nicht der richtige Weg ist, zu lernen suche, wie es zu tun) Beispiel für das Textbuch:
- hosts: local connection: local gather_facts: no roles: - { role: copy_ami, ec2_region: [ "ap-south-1" ]}

Fehler msg:
fatal: [localhost]: FAILED! => {"failed": true, "msg": "'dict object' has no attribute 'region'"}

Was die Rolle aussieht :
- ec2_ami_copy: source_region: "{{ item.region }}" region: "{{ ec2_region }}" source_image_id: "{{ item.image_id }}" wait: yes tags: Name: "{{ item.tags.Name }}" description: "{{ item.tags.Name }}" with_items: "{{ec2_storm_ami}}" register: ec2_ami_copy

Danke,

+0

Können Sie den Abschnitt der Textbuch zeigen, dass die ami sowie den Fehler Kopieren Sie bekommen? – linuxdynasty

+0

sicher. Ich weiß, dass ich es nicht richtig mache. Ich würde gerne den richtigen Weg wissen. Ich habe versucht, eine verschachtelte Schleife zu verwenden, traf aber eine Sackgasse. Meistens wegen meines Unverständnisses bin ich mir sicher. – Asaphe

+0

Können Sie Ihren Post (nicht den Kommentar) bearbeiten, um das Playbook sowie den Fehler anzuzeigen. – linuxdynasty

Antwort

0

Die ganze „with_items“ & „registrieren“ nahm irgendwann mich voll und ganz zu verstehen, espically, wenn mehrere Rollen verwendet.

Lösung: Playbook - enthält die AWS spielt (Create_EC2, Installieren/Konfigurieren, AMI und AMI_Copy) Rollen - (wie oben erwähnt)

Wie habe ich Schleife durch Regionen? das erwies sich als einfacher als meine anfänglichen Versuche. Der Schlüssel war zu verstehen, wie "Register" tatsächlich funktioniert und mit resultierenden JSON funktioniert.

Die Variable "ec2_instance" wird als Teil des Erstellens der Instanz registriert, Sie können wahrscheinlich einfach "ec2_instance.instances" registrieren und sich ein wenig Tipparbeit ersparen. (Wenn Sie keine anderen Teile des JSON verwenden)

Die Verwendung von Register bedeutet, dass die Variable über Wiedergaben im selben Playbook verfügbar ist. (War zuerst sehr verwirrt über diesen Teil)

- name: Copying AMI ec2_ami_copy: source_region: "{{ ec2_instance.instances[0].region }}" region: "{{ item }}" source_image_id: "{{ ec2_instance.instances[0].image_id }}" wait: yes with_items: - us-west-1 - eu-west-1 Sie können wahrscheinlich ein Array für die "with_items" hier verwenden. Das ist nur schnell & schmutzig.

Hoffe das hilft mehr Neulinge in der Zukunft.

Endgültige Empfehlung: Verwenden Sie: - debug: var=myvariable mit verschiedenen Variationen, um sicherzustellen, dass Sie bekommen, was Sie wollen, mit -vvvv ist auch hilfreich.

0

Nach den Unterlagen für die ec2_ami_copy Modul.

- ec2_ami_copy: 
    source_region: us-east-1 
    region: eu-west-1 
    source_image_id: ami-xxxxxxx 

Da Sie in mehrere Regionen kopieren möchten. Sie können eine set_fact erstellen und eine Liste der Regionen in der Playbook erstellen. Mit dem Plugin with_items können Sie über eine Liste oder ein Wörterbuch iterieren.

- set_fact: 
    aws_regions: 
     - us-west-1 
     - us-west-2 

- ec2_ami_copy: 
    source_region: us-east-1 
    region: "{{ item }}" 
    source_image_id: ami-xxxxxxx 
    with_items: "{{ aws_regions }}" 
+0

Sieht gut aus und wäre es möglich, den * ganzen * Prozess automatisieren zu lassen? was bedeutet, dass 'source_image_id' aus der vorherigen Rolle, die das AMI erstellt hat, übernommen wird? – Asaphe

+0

Wenn es auf demselben Host als ja ist, wenn nicht als nein. Wenn Sie versuchen, über Hosts auf die ami_id zuzugreifen, müssen Sie ein Modul verwenden oder einen benutzerdefinierten Filter schreiben. Das Modul ec2_ami_find kann dir helfen http://docs.ansible.com/ansible/ec2_ami_find_module.html#examples – linuxdynasty

+0

Ich denke jetzt, ich sollte diese Rolle in ein anderes Playbook aufteilen. Rufen Sie ec2_ami_find auf, holen Sie sich die neueste, kopieren Sie sie in die verschiedenen Regionen. Nicht sicher über das Kopieren in alle Regionen. – Asaphe

0

Hatte eine harte Zeit, weil das Kopieren einfach ist, aber die Ausgabe war schwierig. Ich benutze einen var_input für amiid und dann benutze das in diesem Programm. Ich wollte eine Ausgabedatei, die region und ami info hat. Kleben Sie diese Arbeit ein, die anderen helfen wird, die ausgegeben werden soll in irgendeiner Datei gedruckt werden

--- 

- ec2_ami_copy: 
    source_region: us-east-1 
    region: "{{ item }}" 
    source_image_id: "{{ amiid }}" 
    encrypted: no 
    wait: yes 
    name: "image copied from {{ amiid }} of N.Virginia" 
    description: "This is working" 
    with_items: 
    - us-west-1 
    - eu-west-1 
    register: imageid 

- name: Debug variables 
    debug: 
    msg: "{{ imageid }}" 

- name: "Write info to Region-Ami.txt " 
    lineinfile: 
    dest: "{{ playbook_dir }}/Region-AMI-Info/Region-Ami.txt" 
    regexp: "^{{ item.key }}" 
    line: "{{ item.key }}: {{ '\"' + item.value + '\"' }}" 
    with_items: 
    - { key: 'aws_region', value: "{{ imageid.results[0].item }}" } 
    - { key: 'AMI-ID', value: "{{ imageid.results[0].image_id }}" } 
    - { key: 'aws_region', value: "{{ imageid.results[1].item }}" } 
    - { key: 'AMI-ID', value: "{{ imageid.results[1].image_id }}" }