Wer bin ich?
• Susann Sgorzaly, 29
• Statistikerin und Softwareentwicklerin
• PHP Entwicklerin seit ca. 3 Jahren
• derzeit: Entwicklerin bei ITEXIA GmbH
@susgo
@susann_sg
Motivation: Mein Weg zu Ansible
• Szenario:
• Kunde bestellt Software
• möchte einen eigenen Server dafür
• kein Admin zur Stelle, um diesen Server einzurichten
Was ist Ansible?
Ansible ist eine sehr einfach benutzbare
IT Automatisierungsengine.
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
Installation
siehe auch: http://docs.ansible.com/ansible/latest/intro_installation.html
sudo pip install ansible
Installation
ansible --version
Inventory-Dateien
Inventory-Dateien sind einfache Textdateien, die eine
Beschreibung und Gruppierung der Server über die
IP oder DNS enthalten.
Inventory: 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
Inventory: Gruppen
Jeder Host kann mehreren Gruppen angehören.
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.
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
Inventory: Gruppen von Gruppen
Gruppen können mehrere Eltern und mehrere Kinder haben,
aber keine zirkulären Abhängigkeiten.
Inventory: Host-Variablen
[targets]
localhost ansible_connection=local
myAlias ansible_host=192.0.2.50 ansible_connection=ssh
webserver.mycompany.com ansible_port=5000
dbserver.mycompany.com ansible_user=susi
mail.mycompany.com http_port=8080
Inventory: Gruppenvariablen
[targets]
localhost ansible_connection=local
myAlias ansible_host=192.0.2.50 ansible_connection=ssh
webserver.mycompany.com ansible_port=5000
dbserver.mycompany.com ansible_user=susi
mail.mycompany.com
[targets:vars]
http_port=8080
Inventory: Gruppenvariablen
Gruppenvariablen werden vor jeder Ausführung auf Host-
Level übertragen.
Gruppenvariablen von Kindergruppen überschreiben die
Gruppenvariablen der Elterngruppe(n).
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.
Erster Ansible Ad-hoc Befehl
ansible prod-server –m ping
Playbooks
Ein Playbook ist eine Liste von Kommandos (Tasks), die auf
der remote oder lokalen Maschine ausgeführt werden.
Playbooks: Aufbau
1 ---
2 - hosts: all
3 become: yes
4 tasks:
5 - name: Ensure NTP (for time sync) is installed
6 apt: pkg=ntp state=present
7 - name: Ensure NTP is running
8 service: name=ntpd state=started enabled=yes
Playbooks: Aufbau
1 ---
Ø Markiert, dass der Rest des Dokumentes YAML formatiert
sein wird.
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
Playbooks: Aufbau
4 tasks:
Ø Alle Kommandos unterhalb dieser Zeile werden auf allen
Hosts ausgeführt.
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.
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.
Playbooks: Aufbau
1 ---
2 - hosts: all
3 become: yes
4 tasks:
5 - apt: pkg=ntp state=present
6 - service: name=ntpd state=started enabled=yes
Module
Ansible Module sind wiederverwendbare, eigenständige
Skripte, welche von der
Ansible API, von ansible oder von ansible-playbook
genutzt werden können.
Module
Sie können in einer beliebigen Programmiersprache
geschrieben sein.
Module
Sie liefern ihren Status in Form von JSON-Objekten im
stdout an Ansible zurück.
Playbook ausführen
ansible-playbook path/to/playbook.yml
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.
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
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
Roles
Eine Ansible Rolle ist eine saubere, wiederverwendbare
Abstraktion einzelner Tasks.
Die Rolle erfüllt eine bestimmte Funktionalität.
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
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
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') }}"
Ansible Roles von ITEXIA
@itexia
Ansible Roles von ITEXIA
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
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
IT – Automatisierung: Alternativen
Puppet Chef SaltStack
DANKE!
Fragen?

Automation with Ansible

  • 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 Wegzu Ansible • Szenario: • Kunde bestellt Software • möchte einen eigenen Server dafür • kein Admin zur Stelle, um diesen Server einzurichten
  • 4.
    Was ist Ansible? Ansibleist eine sehr einfach benutzbare IT Automatisierungsengine.
  • 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
  • 6.
  • 7.
  • 8.
    Inventory-Dateien Inventory-Dateien sind einfacheTextdateien, die eine Beschreibung und Gruppierung der Server über die IP oder DNS enthalten.
  • 9.
  • 10.
    Inventory: Gruppen Jeder Hostkann mehreren Gruppen angehören.
  • 11.
    Inventory: Gruppen Alle Hostsgehö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 vonGruppen [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 vonGruppen Gruppen können mehrere Eltern und mehrere Kinder haben, aber keine zirkulären Abhängigkeiten.
  • 14.
    Inventory: Host-Variablen [targets] localhost ansible_connection=local myAliasansible_host=192.0.2.50 ansible_connection=ssh webserver.mycompany.com ansible_port=5000 dbserver.mycompany.com ansible_user=susi mail.mycompany.com http_port=8080
  • 15.
    Inventory: Gruppenvariablen [targets] localhost ansible_connection=local myAliasansible_host=192.0.2.50 ansible_connection=ssh webserver.mycompany.com ansible_port=5000 dbserver.mycompany.com ansible_user=susi mail.mycompany.com [targets:vars] http_port=8080
  • 16.
    Inventory: Gruppenvariablen Gruppenvariablen werdenvor jeder Ausführung auf Host- Level übertragen. Gruppenvariablen von Kindergruppen überschreiben die Gruppenvariablen der Elterngruppe(n).
  • 17.
    Inventory: Gruppenvariablen mergen JederHost kann mehreren Gruppen angehören, aber es gibt nur eine Instanz jedes Hosts, welche durch das Zusammenführen der Daten aller Gruppen entsteht.
  • 18.
    Erster Ansible Ad-hocBefehl ansible prod-server –m ping
  • 19.
    Playbooks Ein Playbook isteine Liste von Kommandos (Tasks), die auf der remote oder lokalen Maschine ausgeführt werden.
  • 20.
    Playbooks: Aufbau 1 --- 2- hosts: all 3 become: yes 4 tasks: 5 - name: Ensure NTP (for time sync) is installed 6 apt: pkg=ntp state=present 7 - name: Ensure NTP is running 8 service: name=ntpd state=started enabled=yes
  • 21.
    Playbooks: Aufbau 1 --- ØMarkiert, dass der Rest des Dokumentes YAML formatiert sein wird.
  • 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
  • 23.
    Playbooks: Aufbau 4 tasks: ØAlle Kommandos unterhalb dieser Zeile werden auf allen Hosts ausgeführt.
  • 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.
  • 26.
    Playbooks: Aufbau 1 --- 2- hosts: all 3 become: yes 4 tasks: 5 - apt: pkg=ntp state=present 6 - service: name=ntpd state=started enabled=yes
  • 27.
    Module Ansible Module sindwiederverwendbare, eigenständige Skripte, welche von der Ansible API, von ansible oder von ansible-playbook genutzt werden können.
  • 28.
    Module Sie können ineiner beliebigen Programmiersprache geschrieben sein.
  • 29.
    Module Sie liefern ihrenStatus in Form von JSON-Objekten im stdout an Ansible zurück.
  • 30.
  • 31.
    Playbooks lokal testen Vagrantist 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 mitVagrant config.vm.provision "ansible" do |ansible| # ansible.verbose = "v" ansible.playbook = "playbook/yii2-base-app-playbook.yml" ansible.sudo = true end
  • 33.
    Playbook: Beispiel mitDocker 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 Rolleist eine saubere, wiederverwendbare Abstraktion einzelner Tasks. Die Rolle erfüllt eine bestimmte Funktionalität.
  • 35.
    Roles Rollen folgen einerbestimmten 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 • Einbindungder 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') }}"
  • 38.
    Ansible Roles vonITEXIA @itexia
  • 39.
  • 40.
    Beispiele für denEinsatz 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 denEinsatz 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
  • 42.
    IT – Automatisierung:Alternativen Puppet Chef SaltStack
  • 43.