Automatisierung? ANSIBLE - Einfach. Sicher. Zuverlässig.
Ansible ist ein Open-Source Werkzeug zur Automatisierung von Deployment-, Konfigurations- und Administrationsprozessen. Die Beschreibung der Aufgaben basiert auf YAML und Jinja Templates. Es lässt sich zudem in Verbindung mit Vagrant und Docker nutzen.
2. Wer bin ich?
• Susann Sgorzaly, 29
• Statistikerin und Softwareentwicklerin
• PHP Entwicklerin seit ca. 3 Jahren
• derzeit: Entwicklerin bei ITEXIA GmbH
@susgo
@susann_sg
3. Motivation: Mein Weg zu Ansible
• Szenario:
• Kunde bestellt Software
• möchte einen eigenen Server dafür
• kein Admin zur Stelle, um diesen Server einzurichten
5. Gründe für Ansible
• Klare und einfache Syntax
(YAML)
• Schnell:
• schnell aufzusetzen
• schnell zu erlernen
• Effizient:
• kein extra Master Server
• keine extra Software auf den
Servern
• Sicher: Kommunikation über SSH
11. Inventory: Gruppen
Alle Hosts gehören der „Gruppe“ all an.
Jeder Host der keinen weiteren, selbstdefinierten Gruppen
angehört, gehört außerdem der Gruppe ungrouped an.
12. Inventory: Gruppen von Gruppen
[prodserver]
webserver-[a-f].mycompany.com
dbserver[01-10].mycompany.com
mail.mycompany.com
[devserver]
webserver.mycompany-dev.com
dbserver.mycompany-dev.com
git.mycompany-dev.com
[mycompany:children]
devserver
prodserver
13. Inventory: Gruppen von Gruppen
Gruppen können mehrere Eltern und mehrere Kinder haben,
aber keine zirkulären Abhängigkeiten.
17. Inventory: Gruppenvariablen mergen
Jeder Host kann mehreren Gruppen angehören, aber es gibt
nur eine Instanz jedes Hosts, welche durch das
Zusammenführen der Daten aller Gruppen entsteht.
22. Playbooks: Aufbau
2 - hosts: all
Ø Definiert die Hosts / Hostgruppe, auf denen dieses Playbook
ausgeführt werden soll
3 become: yes
Ø Alle Tasks sollen mit erweiterten Privilegien (sudo) arbeiten
24. Playbooks: Aufbau
5 - name: Ensure NTP (for time sync) is installed
6 apt: pkg=ntp state=present
Ø Equivalent zu:
apt-get install ntp
Aber dieser Befehl ist viel intelligenter:
Es checkt, ob NTP bereits installiert ist und installiert es, falls
nicht.
25. Playbooks: Aufbau
7 - name: Ensure NTP is running
8 service: name=ntpd state=started enabled=yes
Ø Checkt und stellt sicher, dass der ntpd-Service läuft.
27. Module
Ansible Module sind wiederverwendbare, eigenständige
Skripte, welche von der
Ansible API, von ansible oder von ansible-playbook
genutzt werden können.
31. Playbooks lokal testen
Vagrant ist eine freie Software zum Erstellen und Verwalten
von virtuellen Maschinen.
Vagrant wird über die Shell gesteuert.
Die virtuelle Maschine (Box) wird über eine
Konfigurationsdatei (Vagrantfile) beschrieben.
32. Playbook: Beispiel mit Vagrant
config.vm.provision "ansible" do |ansible|
# ansible.verbose = "v"
ansible.playbook = "playbook/yii2-base-app-playbook.yml"
ansible.sudo = true
end
33. Playbook: Beispiel mit Docker
FROM ubuntu:16.04
MAINTAINER ITEXIA GmbH
RUN apt-get -y update
RUN apt-get install -y python-yaml python-jinja2 git
RUN git clone http://github.com/ansible/ansible.git /tmp/ansible
WORKDIR /tmp/ansible
ENV PATH $PATH:/tmp/ansible/bin:/sbin:/usr/sbin:/usr/bin
ENV ANSIBLE_LIBRARY /tmp/ansible/library
ENV PYTHONPATH /tmp/ansible/lib:$PYTHON_PATH
ADD playbook /tmp/example
WORKDIR /tmp/example
RUN ansible-playbook yii2-base-app-playbook.yml -i hosts
EXPOSE 80
34. Roles
Eine Ansible Rolle ist eine saubere, wiederverwendbare
Abstraktion einzelner Tasks.
Die Rolle erfüllt eine bestimmte Funktionalität.
35. Roles
Rollen folgen einer bestimmten Ordnerstruktur:
• meta
• main.yml (allg. Informationen zur Rolle)
• defaults
• main.yml (default-values für Variablen)
• tasks
• main.yml (Tasks)
• vars
• main.yml (Variablen-Definition)
• templates
36. Roles: Beispiel create-mysql-db
• tasks à main.yml:
- name: Create a database
mysql_db:
db: '{{ db_name }}'
state: present
- name: Create a MySQL user for this db
mysql_user:
name: "db_user"
password: "{{ db_pass }}"
priv: '{{ db_name }}.*:ALL'
state: present
update_password: on_create
37. Roles: Beispiel
• Einbindung der Rolle im Playbook:
- hosts: all
become: yes
tasks:
…
- name: Create DB and DB user
include_role:
name: create-mysql-db
vars:
db_name: itexia
db_user: itexia
db_pass: "{{ lookup('password', 'passwords/password_db_itexia
chars=ascii_letters,numbers length=16') }}"
40. Beispiele für den Einsatz bei ITEXIA
1. Aufsetzen von virtuellen Maschinen für den Einsatz beim
Kunden:
• Softwareinstallation / -update
• Anlegen von Datenbank und Datenbankbenutzer
• Automatisches Generieren und Setzen von Passwörtern
• Einspielen von Kundendaten in die Software (MySQL +
Filesystem)
• Hinzufügen eines Benutzers mit sudo-Privilegien für die VM
41. Beispiele für den Einsatz bei ITEXIA
2. Aufsetzen von Cloud-Instanzen unserer Software über die
Plesk-API
• Anlegen einer Subdomain
• Anlegen von Datenbank und Datenbankbenutzer
• Automatisches Generieren und Setzen von Passwörtern
• Kopieren der Software aus einem Vorlagenverzeichnis
• PHP Konfigurationen