Ansible



THE SIMPLEST WAY TO AUTOMATE IT






Daniel Banck, @dbanck   

Ansible Facts


  • Open-Source
  • Aktuelle Version: 1.5.3
  • 5,000 ★s auf Github

  • Maintainer: Michael DeHan
  • Ansible Works fuer kommerziellen Support

Ansible??





„Ansible ist eine Open-Source-Plattform zur Orchestrierung und allgemeinen Konfiguration und Administration von Computern“

Ansible?


  • Kommunikation: SSH
  • Keine Software auf dem Server
  • Module: JSON
  • Konfiguration: YAML
  • Templates: Jinja2

Struktur


environment/
  group_vars/
  host_vars/
  inventory
roles/
  ...
ansible.cfg
site.yml
Xservers.yml


Environment


z. B. production, staging, development

Group Vars


z.B. piwik-servers

  • Gruppen spezifische Variablen
  • Dateiname muss dem Namen im Inventar entsprechen

$ cat production/group_vars/piwik-servers
---
user: piwik

# Piwik download location
download_url: 'http://builds.piwik.org'
download_file: 'latest.zip'

Hosts Vars


z.B. ec2-54-72-255-255.eu-west-1.compute.amazonaws.com

  • Host spezifische Variablen
  • Dateiname muss dem Hostnamen im Inventar entsprechen


$ cat production/host_vars/ec2-54-72-255-255.eu-west-1.compute.amazonaws.com
---
mysql_host: "pw.xxxxxxxxxxx.eu-west-1.rds.amazonaws.com"

Inventory


  • Enthaelt alle Server des Environments
  • Ordnet die Server in Gruppen


$ cat production/inventory
[piwik-servers]
ec2-54-72-255-255.eu-west-1.compute.amazonaws.com
ec2-54-186-255-255.us-west-2.compute.amazonaws.com

site.yml


  • Master YAML-Datei
  • Inkludiert alle weiteren Playbooks

---
- include: piwik-servers.yml
...

Xservers.yml


z.B. webservers.yml

  • Beschreibt eine Gruppe von Servern
  • Welche Rollen diese besitzen
  • Welcher Benutzer verwendet wird


$ cat piwik-servers.yml
---
- hosts: piwik-servers
  user: ansible
  sudo: True

  roles:
    - dns-client
    - mysql-client
    - nginx
    - php
    - piwik

Role


role/
  files/
    known_hosts
  handlers/
    main.yml
  (meta/)
  tasks/
    main.yml
  templates/
    config.py.j2
  (vars/)

Role - Tasks


  • Zentrale Datei einer Rolle
  • Enthaelt alle Aufgaben diese Rolle


$ cat roles/piwik/tasks/main.yml 
---
- name: Install requirements
  apt: pkg={{ item }} update_cache=yes state=latest
  tags: piwik
  with_items:
    - php5-geoip
    - unzip

- name: Fetch latest Piwik release
  get_url: url={{ download_url }}/{{ download_file }} dest=/tmp mode=0440 owner={{ user }}
  tags: piwik


Role - Handlers


  • Zur Steuerung von Prozessen
  • Koennen in den Tasks verwendet werden


$ cat roles/nginx/handlers/main.yml 
---
- name: restart nginx
  service: name=nginx state=restarted
$ cat roles/nginx/tasks/main.yml
---
- name: write nginx.conf
  copy: src=nginx.conf dest=/etc/nginx/nginx.conf mode=0644
  tags: nginx
  notify:
    - restart nginx

Role - Templates


  • Jinja2 Templates
  • Werden durch Variablen aus `host_vars`,
    `group_vars` oder `vars` gefuellt


$ cat roles/piwik/templates/php_piwik.conf.j2 
[{{ user }}]

listen = /home/www/{{ user }}/php.sock

; Set permissions for unix socket, if one is used. In Linux, read/write
listen.owner = {{ user }}
listen.group = {{ user }}
listen.mode = 0666

; Unix user/group of processes
user = {{ user }}
group = {{ user }}

[...]


Wiederverwendbarkeit


  • Generische Rollen sollten Projektuebergreifend
    wiederverwendbar sein
  • z.B. nginx, redis, ...

  • Dazu werden diese in einem zentralen Repository
    gepflegt
  • Pfad zum Repo wird in der Ansible Config hinterlegt

Ansible Konfiguration


  1. ANSIBLE_CONFIG (Umgebungsvariable)
  2. ansible.cfg (im aktuellen Verzeichnis)
  3. .ansible.cfg (im Home-Verzeichnis)
  4. /etc/ansible/ansible.cfg

Alle Parameter: http://welu.se/6tQ

[defaults]
roles_path = /opt/mysite/roles





Code

Nice to know


  • SSH pipelining
    • Neu seit 1.5
    • Config: pipelining=True
    • Reduziert SSH Operations
  • Async & Polling
    • Fuer zeitaufwaendig Tasks
  • Ansible Galaxy
    • https://galaxy.ansible.com/





Thx

Ansible

By Daniel Banck

Ansible

  • 2,110