Ansible - tworzymy podwaliny pod usługę BackupPC

Słowem wstępu...

Aktualnie wdrażanie i konfigurowanie serwerów przeżywa prawdziwy renesans. Zmieniło się podejście z konfigurowania wszystkiego ręcznie, na takie które umożliwia pisanie scenariuszy w formie kodu, Są one  następnie wykonywane w pełni automatycznie, co skraca znacząco całą procedurę ich utrzymania. Dziś pokażę Ci od czego zacząc i stworzymy prosty scenariusz, który umożliwi Ci integrację serwera z usługą BackupPC


Logowanie

Pracę z ansible rozpoczynamy od założenia, że nasze logowanie na serwery zostanie będzie się odbywało z użyciem technologi passwordless. Aby tego dokonać, na początku należy wygenerować klucze RSA na lokalnym komputerze.

ssh-keygen -f ~/.ssh/ansible -t rsa -C  ansible -b 4096
chmod 700 ~/.ssh
chmod 600 ~/.ssh/*

Które następnie wrzucamy na naszą docelową, zdalną maszynę (nasz serwer musi mieć dodane wczesniej konto o nazwie ansible):

ssh-copy-id -f -i ~/.ssh/ansible.pub ansible@10.0.30.1

Następnie, przeprowadzamy test logowania.

ssh 'ansible@10.0.30.1' -i ~/.ssh/ansible

W przypadku powodzenia, zostaniemy zalogowani bez proszenia o hasło. Następnie dla poprawy bezpieczeństwa, możemy za pomocą poniższej komendy usunąć możliwość logowania się po haśle do naszego konta.

passwd -d ansible

Inventory

Następnie przechodząc do właściwej pracy, zaczynamy od utworzenia pliku z naszą listą maszyn (inventory) na którym będziemy pracować.

backuppc/hosts

all:
vars:
ansible_ssh_private_key_file: "{{ ssh_key }}"
ansible_user: "{{ ssh_user | default('developer') }}"
vars_files:
- common.yml
children:
blog_1:
hosts:
prod:
ansible_host: 10.0.50.2
dev:
ansible_host: 10.0.30.2
webpage:
hosts:
prod:
ansible_host: 10.0.50.1
dev:
ansible_host: 10.0.30.1

Do tego tworzymy plik z naszymi zmiennymi, które możemy (bazując na nazwach grup) nadpisywać z naszego invetory.

backuppc/group_vars/blog_1/common.yml

ssh_key: ~/.ssh/ansible
ssh_user: ansible

Playbooki

Pora na nasz główny scenariusz. Stwórzmy teraz plik main.yml który będzie importował wszystkie nasze dodatkowe playbooki.

backuppc/main.yml

- import_playbook: playbooks/backuppc.yml

Teraz możemy dodać nasze podrole, które będą importowane w głównymi playbooku. W przypadku dodawania kolejnych hostów, scenariuszy, warto stosować podział, w którym odzielimy playbooki dotyczące wdrożeń na dev od tych produkcyjnych.

backuppc/playbooks/backuppc.yml

- hosts: all
become: yes
become_method: sudo
gather_facts: yes
roles:
- ../roles/backuppc
handlers:
- import_tasks: ../handlers/restart_ssh.yml

Do roli jeszcze wrócimy, na ten moment aby zakończyć ten paragraf pokażę Ci jak docelowo powinien wyglądać plik handlers który będzie restartował naszą usługę ssh w zależności od potrzeb.

backuppc/handlers/restart_ssh.yml

- name: Restart SSH Server
service:
name: sshd
state: restarted

Role

Definiując naszą pierwszą rolę:

- upewnimy się że mamy zainstalowane potrzebne pakiety,

- dodamy użytkownika backuppc, który będzie się logował z użyciem klucza publicznego, który dostarczymy mu w odzielnym pliku,

-  sprawdziwmy czy wszystkie uprawnienia do naszego klucza są poprawne.

backuppc/roles/backuppc/defaults/tasks.yml

- name: Install rsync
package:
name: "rsync"
state: present
tags: [apt]

- name: Creating '{{ uusername }}' user
ansible.builtin.user:
state: present
name: "{{ uusername }}"
password: '!' # For remove password
tags: [user]

- name: Allow '{{ uusername }}' to use sudo rsync witchout password
community.general.sudoers:
name: allow-backup
state: present
user: "{{ uusername }}"
commands:
- /usr/bin/rsync --server --sender *
tags: [user]

- name: Enable pubkey authentication for SSH
lineinfile:
dest: "/etc/ssh/sshd_config"
regex: "#PubkeyAuthentication yes"
line: "PubkeyAuthentication yes"
notify: "Restart SSH Server"
tags: [create_key]

- name: Ensure permissions for '{{ uusername }}'
file:
path: "/home/{{ uusername }}"
state: directory
mode: 0700
owner: "{{ uusername }}"
group: "{{ uusername }}"
recurse: yes
tags: [create_key]

- name: Ensure permissions for '{{ uusername }}/.ssh'
file:
path: "/home/{{ uusername }}/.ssh"
state: directory
mode: 0700
owner: "{{ uusername }}"
group: "{{ uusername }}"
recurse: yes
tags: [create_key]

- name: Add authorized keys
authorized_key:
user: "{{ uusername }}"
key: "{{ lookup('file', 'files/'+ uusername + '.pub') }}"
tags: [create_key]

Aby powyższy kod zadziałał musimy dostarczyć mu plik .ssh/authorized_keys. Więcej informacji pod tym linkiem.

backuppc/roles/backuppc/files/backuppc.pub

ssh-rsa AAAAB3[wartość klucza ukryłem]DASDASDASDASD== backuppc@10.0.30.1

Dodatkowo wyniesiemy też część naszych zmiennych, do naszego pliku env.

backuppc/roles/backuppc/defaults/main.yml

uusername: backuppc

Uruchomienie

Instalujemy wymagane zależności

apt install ansible
ansible-galaxy collection install community.general

Po czym cały nasz kod możemy uruchomić pojedynczą komendą.

ansible-playbook -i hosts main.yml

 W przypadku powodzenia otrzymamy informację że wszystkie reguły zostały prawidłowo wykonane.


Powyższy artykuł stanowi jedynie wprowadzenie do technologi automatyzacji. Po więcej informacji polecam zajrzeć do dokumentacji

Kamil Mirończuk

I kiedy czegoś gorąco pragniesz, to cały wszechświat sprzyja potajemnie twojemu pragnieniu
~Paulo Coelho

Komentarze

Zostaw komentarz

Twój adres mailowy NIE zostanie opublikowany. W razie otrzymania zapytania, otrzymasz na niego odpowiedź.
Wymagane pola są oznaczone jako *