Suche…


Bemerkungen

Beispiel-2: Dies ist ein Beispiel, kopieren Sie es also nicht. Stattdessen sollten Sie die Variablen an Ihre Bedürfnisse anpassen. ansible_key, Sicherheitsgruppenregeln usw.

Beispiel-1: Um die strikte Überprüfung des SSH-Host-Schlüssels zu deaktivieren, ein Verhalten, das wir beim Automatisieren von Aufgaben nicht wünschen, setzen wir es in der Datei ansible.cfg auf no . dh: StrictHostKeyChecking=no

Die Datei ec2.py ist ein Python-Skript, das Ihre AWS-Ressourcen basierend auf der Datei ec2.ini ausführt und zurückgibt. ec2.ini Konfigurationsdatei müssen Sie anpassen, wenn Sie den Umfang Ihres Projekts auf bestimmte Regionen, bestimmte Tags usw. beschränken möchten ...

So starten Sie die EC2-Instanz von offiziellen Amazon AMIs, ändern Sie sie und speichern Sie sie als neues AMI

Dies ist ein sehr üblicher Workflow, wenn Ansible zum Bereitstellen einer AWS EC2-Instanz verwendet wird. Dieser Beitrag setzt ein grundlegendes Verständnis von Ansible voraus und setzt am wichtigsten voraus, dass Sie es ordnungsgemäß konfiguriert haben, um eine Verbindung zu AWS herzustellen.

Als offizielle Dokumentation von Ansible werden wir vier Rollen verwenden:

1- ami_find , um die Ami-ID zu erhalten, auf deren Basis wir unsere EC2-Instanz starten werden.

2- ec2_ami_creation , um die EC2-Instanz effektiv zu starten.

3- code_deploy zum Ändern der Instanz; Dies kann alles sein, so dass wir einfach eine Datei auf den Zielcomputer übertragen.

4- build_ami , um unser neues Image basierend auf der laufenden ec2-Instanz zu erstellen. Dieser Beitrag setzt voraus, dass Sie sich auf der obersten Ebene Ihres Ansible-Projekts befinden: my_ansible_project

Die erste Rolle: ami_find

cd my_ansible_project/roles && ansible-galaxy init ami_find

In dieser Rolle verwenden wir das Modul ec2_ami_find. Als Beispiel suchen wir nach einem Ubuntu-Computer und erhalten dessen ami_id (ami-xxxxxxxx). Bearbeiten my_ansible_project/roles/ami_find/tasks/main.yml Datei my_ansible_project/roles/ami_find/tasks/main.yml :

---
- ec2_ami_find:
    name: "ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"
    sort: name
    sort_order: descending
    sort_end: 1
    region: "{{ aws_region }}"
  register: ami_find
- set_fact: ami_ubuntu="{{ ami_find.results[0].ami_id }}"

Die zweite Rolle: ec2_ami_creation

Hier werden wir die ami_id verwenden, die wir von der ersten Rolle bekommen haben, und dann unsere neue Instanz basierend darauf starten:

cd my_ansible_project/roles && ansible-galaxy init ec2_ami_creation

In dieser Rolle verwenden wir vor allem das ec2_module , um unsere Instanz zu starten. Bearbeiten my_ansible_project/roles/ec2_ami_creation/tasks/main.yml Datei my_ansible_project/roles/ec2_ami_creation/tasks/main.yml :

---
- ec2_vpc_subnet_facts:
    region: "{{aws_region}}"
  register: vpc
- name: creation of security group of the ec2 instance
  ec2_group:
    name: example
    description: an example EC2 group
    region: "{{ aws_region }}"
    rules:
      - proto: tcp
        from_port: 22
        to_port: 22
        cidr_ip: 0.0.0.0/0
    state: present
  register: ec2_sg

- name: create instance using Ansible
  ec2:
    key_name: "{{ ansible_key }}"
    group: example
    vpc_subnet_id: "{{vpc.subnets[0].id}}"
    instance_type: "{{ instance_type }}"
    ec2_region: "{{ aws_region }}"
    image: "{{ base_image }}"
    assign_public_ip: yes
    wait: yes
  register: ec2

- set_fact: id={{ec2.instances[0].id}}

- name: adding the newly created instance to a temporary group in order to access it later from another play
  add_host: name={{ item.public_ip }} groups=just_created
  with_items: ec2.instances

- name: Wait for SSH to come up
  wait_for: host={{ item.public_dns_name }} port=22 delay=10 timeout=640 state=started
  with_items: ec2.instances

Die dritte Rolle: code_deploy

Hier stellen wir diese Instanz just_created , die zu einer Gruppe mit dem Namen just_created

cd my_ansible_project/roles && ansible-galaxy init code_deploy

In dieser Rolle verwenden wir das template_module , um eine Datei zu übertragen und den Hostnamen des Rechners darin zu schreiben. Bearbeiten my_ansible_project/roles/code_deploy/tasks/main.yml Datei my_ansible_project/roles/code_deploy/tasks/main.yml :

---
- template: src=my_file.txt.j2 dest=/etc/my_file.txt

Wechseln Sie dann in den Vorlagenordner in Ihrer Rolle:

cd my_ansible_project/roles/templates und fügen Sie eine Datei namens my_file.txt.j2 die my_file.txt.j2 enthält:

my name is {{ ansible_hostname }}` 

Die vierte Rolle: build_ami

Wir erstellen jetzt ein Image der laufenden Instanz mit dem Modul ec2_ami . Gehen Sie in Ihren Projektordner und:

 cd my_ansible_project/roles && ansible-galaxy init build_ami

Bearbeiten my_ansible_project/roles/build_ami/tasks/main.yml Datei my_ansible_project/roles/build_ami/tasks/main.yml :

---
- ec2_ami:
    instance_id: "{{ instance_id }}"
    wait: yes
    name: Base_Image

Ich denke, Sie haben sich gefragt, wie Sie all diese Rollen zusammenstellen sollen. Habe ich recht? Wenn ja, lesen Sie weiter.

Wir werden ein Spielbuch schreiben, das aus drei Spielen besteht: Das erste Spiel, das auf localhost anwendbar ist, nennt unsere ersten beiden Rollen, das zweite Spiel gilt für unsere Gruppe just_created . Die letzte Rolle wird auf localhost . Warum localhost ? Wenn wir einige AWS-Ressourcen verwalten möchten, verwenden wir so einfach Ihren lokalen Computer. Als Nächstes verwenden wir eine vars-Datei, in die wir unsere Variablen ansible_key werden: ansible_key , aws_region usw.

Erstellen Sie einen Infrastrukturordner am oberen aws.yml Ihres Projekts und fügen Sie eine Datei namens aws.yml :

---
aws_region: ap-southeast-2
ansible_key: ansible
instance_type: t2.small

Erstellen build_base_image.yml am Anfang Ihres Projekts build_base_image.yml und fügen Sie build_base_image.yml hinzu:

---
   - hosts: localhost
     connection: local
     gather_facts: False
     vars_files:
       - infrastructure/aws.yml
     roles:
       - ami_find
       - { role: ec2_creation, base_image: "{{ ami_ubuntu }}"}

   - hosts: just_created
     connection: ssh
     gather_facts: True
     become: yes
     become_method: sudo
     roles:
       - code_deploy

   - hosts: localhost
     connection: local
     gather_facts: False
     vars_files:
       - infrastructure/aws.yml
     roles:
       - { role: new_image, instance_id: "{{ id }}"}

Vergessen Sie nicht, Ihre Ressourcen nach dem Testen zu löschen, oder erstellen Sie eine Rolle, um die laufende Instanz zu löschen :-)

So konfigurieren Sie Ansible ordnungsgemäß für die Verbindung zu Amazon Web Services

Das Verwalten von AWS-Ressourcen, die nach oben und nach unten skaliert werden, stößt an die Grenzen der statischen Inventardatei, weshalb wir etwas Dynamisches benötigen. Dafür sind die dynamischen Lagerbestände gedacht. Lasst uns beginnen:

Laden Sie diese Dateien ec2.ini und ec2.py in Ihren Projektordner herunter:

cd my_ansible_project 
wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.py    
wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.ini

Machen Sie danach die Datei ec2.py ausführbar:

chmod +x ec2.py

Exportieren Sie jetzt Ihren AWS Secret- und Access-Schlüssel als Umgebungsvariablen:

export AWS_ACCESS_KEY_ID='ABCDEFGHIJKLM'
export AWS_SECRET_ACCESS_KEY='NOPQRSTUVWXYZ'

Um das ec2.py Skript verwenden zu können, benötigen Sie das Python AWS SDK, boto damit Sie es installieren können:

sudo pip install boto

Um zu testen, ob alles in Ordnung ist, führen Sie die ec2.py indem Sie Ihre Ressourcen auflisten:

./ec2.py --list

Sie sollten etwas ähnliches sehen:

{
  "_meta": {
    "hostvars": {}
  }
}

Jetzt möchten wir das dynamische Inventar zusammen mit unserer statischen Hosts-Datei verwenden. Erstellen Sie zuerst einen Ordner mit dem Namen " inventory , fügen Sie ec2.py , ec2.ini und unsere hosts Datei hinzu, und ec2.ini Sie Ansible an, diesen Ordner als Inventardatei zu verwenden:

mkdir inventory 
mv ec2.py inventory/ec2.py
mv ec2.ini inventory/ec2.ini
mv hosts inventory/hosts

Als Nächstes sollten Sie die Konfiguration auf Projektebene für Ansible definieren, indem Sie in Ihrem Projektordner eine Ansible-Konfigurationsdatei namens ansible.cfg und ansible.cfg hinzufügen:

[defaults]
hostfile = inventory
[ssh_connection]
pipelining = False
ssh_args = -o ControlMaster=auto -o ControlPersist=30m -o StrictHostKeyChecking=no

Als Nächstes müssen wir Ansible so konfigurieren, dass ein SSH-Schlüssel verwendet wird, um den Zugriff auf unsere EC2-Instanzen zu authentifizieren. Die Verwendung eines SSH-Agenten ist der beste Weg, um sich bei Ressourcen zu authentifizieren, da dies die Verwaltung von Schlüsseln vereinfacht:

ssh-agent bash 
ssh-add ~/.ssh/keypair.pem  

Das ist es! Wenn Sie dies befolgt haben, können Sie es mithilfe des ping Moduls testen. Anschließend werden Ihre laufenden Instanzen angezeigt, die für die Verwendung Ihres Schlüssels konfiguriert wurden, der mit pong reagiert:

ansible -m ping all
11.22.33.44 | success >> {
    "changed": false, 
    "ping": "pong"
}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow