blog/content/posts/ansible-dazu-benutzen-um-einen-fileserver-zu-migrieren.md

128 lines
5.0 KiB
Markdown
Raw Normal View History

2015-06-17 11:12:47 +02:00
Title: Ansible dazu benutzen um einen Fileserver zu migrieren
Date: 2015-06-17 10:44
Slug: ansible-dazu-benutzen-um-einen-fileserver-zu-migrieren
Tags: ansible, python
Ab und zu kommt es dann doch einmal vor das man seinen Fileserver umziehen muss. Diese Migration kann man gut benutzen um zum Beispiel mal ein paar Permissions gerade zu ziehen oder andere Kleinigkeiten anzupassen. Nun hatte ich mich dran gemacht ein Script zu schreiben mit allen Befehlen die ich dazu brauche. Wir kennen alle die Nachteile von schnell gehackten Bash-Scripten. Irgendwo ein Dreher drin und die Daten müssen aus dem Backup geholt werden oder man vergisst User oder Gruppen.
Ich werde immer mehr zum [Ansible](http://www.ansible.com/) Fan. Vor allem das strukturiere definieren von Tasks hilft mir sehr meine Aufgabe darzustellen. Ein weiterer Vorteil ist das Ansible sich um so Sachen wie "Errorhandling" kümmert und es auch möglich ist Results aus dem einem Task im anderen wieder aufzugreifen.
Hier passiert nichts wildes. Wir bereiten den neuen Fileserver vor mit allen Benutzern, Gruppen und den Files die wir benötigen. Dazu gibt es ein paar Tasks die die Permissions gerade ziehen während wir migrieren. Hier das Playbook was ich dafür geschrieben habe. Ich habe es versucht zu kommentieren.
```
---
# Ich führe das ganze nicht remote aus sondern lokal.
#
- hosts: localhost
sudo: yes
tasks:
- name: install rsync
apt: name=rsync
state=present
# Hier legen wir zwei Gruppen an.
#
- name: add groups
group: name={{ item }}
state=present
with_items:
- intern
- extern
# Wir legen zwei Benutzer an. Die im Dict angegebenen Gruppen werden der
# Gruppe "sambashare" hinzugefügt. Nichts besonderes. Die Benutzer
# haben "/bin/false" als Shell und ein Homeverzeichnis in "/home"
#
- name: add users
user: name={{ item.user }}
state=present
shell=/bin/false
home=/home/{{ item.user }}
groups=sambashare,{{ item.groups }}
append=yes
with_items:
- { user: 'user1', groups: 'intern' }
- { user: 'user2', groups: 'intern,extern' }
# Ansible hat ein "synchronize"-Modul was ein Wrapper für Rsync ist.
# Wirklich schön. So muss man nicht ein Script zusammen hacken sondern
# kann die kompletten Möglichkeiten von Ansible zu nutzen.
#
# Wir speichern die Task-Results in der Variabel "task" damit wir sie in
# den Handlern benutzen können. Ein Möglichkeit um zum Beispiel nur
# die Permissions anzuwenden an das Item welches sich verändert hat.
# Im Normalfall würde er bei nur einem geänderten Item die Handler laufen
# lassen. Diese würden dann über alle Verzeichnisse rüber laufen und
# die Permissions ändern. Da es sich um große Verzeichnisse handelt,
# musste es eine bessere Lösung geben. Die Logik der Handler werden
# später erklärt.
#
- name: sync freigaben
synchronize: src=root@192.168.1.1:/srv/samba/{{ item.src }}/
dest=/srv/samba/{{ item.dest }}
perms=no
group=no
delete=yes
with_items:
- { src: 'Erstefreigabe', dest: 'erstefreigabe' }
- { src: 'Zweitefreigabe', dest: 'zweitefreigabe' }
register: task
notify:
- set freigaben group
- set freigaben file permissions
- set freigaben group permissions
- set freigaben permissions
- name: sync homes
synchronize: src=root@192.168.1.1:/home/{{ item }}/
dest=/home/{{ item }}
group=no
delete=yes
with_items:
- user1
- user2
register: task
notify:
- set home group
handlers:
# Hier haben wir so einen Handler. Erstmal iteriert er über alle
# Task-Results. Und nun kommt "when" ins Spiel: Er führt das Kommando
# nur aus wenn ein Item als geändert gilt. So gibt es wenig Overhead
# beim Ausführen der Handler. Sie werden nur ausgeführt wenn es auch
# wirklich nötig ist.
#
- name: set freigaben group
command: chgrp -R {{ item.item.dest }} /srv/samba/{{ item.item.dest }}
with_items: task.results
when: item.changed == True
- name : set freigaben file permissions
command: find /srv/samba/{{ item.item.dest }} -type f -exec chmod 0664 {} \;
with_items: task.results
when: item.changed == True
- name : set freigaben group permissions
command: find /srv/samba/{{ item.item.dest }} -type d -exec chmod 2775 {} \;
with_items: task.results
when: item.changed == True
- name: set freigaben permissions
file: path=/srv/samba/{{ item.item.dest }}
state=directory
mode=2775
owner=root
group={{ item.item.dest }}
with_items: task.results
when: item.changed == True
- name: set home group
command: chgrp -R {{ item.item }} /home/{{ item.item }}
with_items: task.results
when: item.changed == True
```