ansible
Verwendung von Ansible mit Amazon Web Services
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"
}