128 lines
5.0 KiB
Markdown
128 lines
5.0 KiB
Markdown
|
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
|
||
|
```
|