Pereiti prie pagrindinio turinio

Darbo su Ansible pradžia

Šioje pamokoje parodysime, kaip pradėti dirbti su Ansible.

0. Įvadas į Ansible

Ansible yra atvirojo kodo automatizavimo įrankis, leidžiantis atlikti veiksmus keliuose serveriuose vienu metu. Su juo galite keisti bet ką tiksliniuose serveriuose (target hosts): diegti programas, valdyti naudotojus, kurti atsargines kopijas ir daug daugiau.

Keletas užduočių, kurias gali atlikti Ansible:

  • Konfigūracijos valdymas (configuration management). Ansible padeda vienodai paruošti kiekvieną serverį, pavyzdžiui, įdiegti Nginx, sukurti naudotoją ir nukopijuoti konfigūracijos failą. Scenarijų (script) užtenka parašyti vieną kartą, o visus veiksmus Ansible atlieka automatiškai.

  • Programų diegimas (application deployment). Pavyzdžiui, reikia sustabdyti senąją versiją, atsisiųsti naują kodą iš Git, įdiegti priklausomybes ir paleisti programą. Ansible leidžia naują programos versiją išdiegti visuose serveriuose vienu metu.

  • Informacijos apie serverius rinkimas (host information gathering). Įrankis gali automatiškai surinkti duomenis apie įrenginį: OS versiją, RAM, diską, procesorių ir kitus sistemos komponentus.

0.1 Kaip veikia Ansible

Du pagrindiniai vaidmenys:

  • Valdymo serveris (control node) yra pagrindinis serveris, kuriame įdiegtas Ansible ir iš kurio vykdote visas komandas. Iš šio serverio valdote visus kitus serverius.

  • Valdomas serveris (managed node) yra bet kuris nuotolinis serveris, kurį valdo Ansible.

Ansible valdo Linux serverius per SSH, o įdiegti jį reikia tik valdymo serveryje. Valdomuose serveriuose pakanka SSH prieigos, naudotojo paskyros ir Python, nes nuo jo priklauso dauguma Ansible modulių.

0.2 Reikalavimai

  • valdymo serveris su Ubuntu, Debian, AlmaLinux arba Rocky Linux;

  • bent vienas Linux VPS (valdomas serveris);

  • SSH prieiga prie šio VPS (saugiausia prisijungti SSH raktu).

Šioje pamokoje naudosime pavyzdį su vienu valdymo serveriu ir dviem valdomais serveriais:

  1. Ubuntu serveris: 192.0.2.10

  2. AlmaLinux serveris: 192.0.2.20

SSH naudotojas (abiejuose valdomuose serveriuose): adminuser

IP adresus ir naudotojo vardą pakeiskite savais.

1. Ansible diegimas

Atkreipkite dėmesį: Ansible reikia įdiegti tik valdymo serveryje.

1.1 Ubuntu

Jei valdymo serveryje naudojate Ubuntu:

sudo apt update
sudo apt install software-properties-common -y
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible -y

Pastaba. Ubuntu sistemoje fone kartais veikia automatiniai atnaujinimai ir užrakina paketų tvarkyklę. Jei pamatysite pranešimą Could not get lock /var/lib/dpkg/lock-frontend, palaukite, kol atnaujinimo procesas baigsis, ir dar kartą paleiskite komandą sudo apt install ansible -y. Lock failo netrinkite rankiniu būdu.

1.2 Debian

Jei valdymo serveryje naudojate Debian:

sudo apt update
sudo apt install ansible -y

1.3 AlmaLinux/Rocky Linux

Jei valdymo serveryje naudojate AlmaLinux arba Rocky Linux, pirmiausia įjunkite EPEL saugyklą, o tada įdiekite Ansible:

sudo dnf install epel-release -y
sudo dnf install ansible -y

1.4 Diegimo patikra

ansible --version

Jei matote įdiegtos Ansible versijos informaciją, vadinasi, diegimas pavyko. Šis serveris dabar yra jūsų valdymo serveris.

2. Įsitikinkite, kad SSH veikia

Prieš pradėdami dirbti su Ansible, įsitikinkite, kad galite prisijungti prie valdomų serverių per SSH:

Tą patį padarykite su AlmaLinux serveriu:

Prisijungę patikrinkite, ar naudotojas gali naudoti sudo:

sudo whoami

Turėtų būti išspausdinta root. Tada atsijunkite:

exit

2.1 Neprivaloma: SSH raktų nustatymas

Saugesnis ir patogesnis būdas prisijungti per SSH yra naudoti raktą. Jį galite sugeneruoti valdymo serveryje:

ssh-keygen -t ed25519

Numatytoji failo vieta tinka, todėl tiesiog spauskite Enter. Tada nukopijuokite raktą į kiekvieną valdomą serverį:

ssh-copy-id [email protected]
ssh-copy-id [email protected]

Pabandykite prisijungti dar kartą. Slaptažodžio daugiau nebeturėtų prašyti.

3. Projekto katalogo sukūrimas

Sukurkite katalogą Ansible failams ir įeikite į jį:

mkdir -p ~/ansible-lab
cd ~/ansible-lab

4. Inventory sukūrimas

inventory.ini yra failas su serverių, kuriuos Ansible leidžiama valdyti, sąrašu. Sukurkite jį:

nano inventory.ini

Ir įklijuokite šį turinį:

[ubuntu]
ubuntu1 ansible_host=192.0.2.10 ansible_user=adminuser

[alma]
alma1 ansible_host=192.0.2.20 ansible_user=adminuser

[linux:children]
ubuntu
alma

Išsaugokite ir uždarykite failą.

Svarbiausi inventory.ini turinio aspektai:

  • ubuntu1 yra pavadinimas, kuriuo Ansible vadins šį serverį. Jis gali būti bet koks.

  • ansible_host yra tikrasis IP adresas arba hostname, prie kurio jungiamasi. Įrašykite savo VPS IP adresą arba hostname.

  • ansible_user yra SSH naudotojas. Mūsų pavyzdyje tai adminuser.

  • Paskutinis blokas sukuria tėvinę grupę linux, kuri apima abi vaikines grupes, ubuntu ir alma. Taip galite nurodyti tik Ubuntu serverius, tik AlmaLinux serverius arba visus abiejų grupių serverius vienu metu.

5. Inventory patikra

Pirmiausia nuskaitykime sukurtą inventory failą:

ansible all -i inventory.ini --list-hosts

Turėtumėte gauti maždaug tokį rezultatą:

  hosts (2):
ubuntu1
alma1

Komandas galite vykdyti ir su viena grupe:

ansible ubuntu -i inventory.ini --list-hosts
ansible alma -i inventory.ini --list-hosts
ansible linux -i inventory.ini --list-hosts

Šiame žingsnyje į serverius nieko nesiunčiama, Ansible tik skaito jūsų inventory failą.

Atkreipkite dėmesį. Jei gausite tokią klaidą:

ERROR: Ansible could not initialize the preferred locale: unsupported locale setting

paleiskite:

export LANG=C.UTF-8
export LC_ALL=C.UTF-8

ir pakartokite komandą:

ansible all -i inventory.ini --list-hosts

6. Ryšio patikra

Dabar patikrinkite ryšį:

ansible all -i inventory.ini -m ping

Jei viskas teisingai, pamatysite:

ubuntu1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
alma1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}

Nepainiokite jo su standartine Linux komanda ping. Sisteminė komanda tikrina tinklo ryšį, o Ansible ping modulis tikrina, ar Ansible gali prisijungti prie serverio per SSH ir jame vykdyti modulį.

"changed": false reiškia tik tai, kad Ansible nieko nepakeitė.

7. Pirmosios komandos

Dabar galite vienu metu vykdyti paprastas komandas visuose valdomuose serveriuose:

ansible all -i inventory.ini -a "hostname"
ansible all -i inventory.ini -a "uptime"
ansible all -i inventory.ini -a "df -h"
ansible all -i inventory.ini -a "free -h"
ansible all -i inventory.ini -a "cat /etc/os-release"

Jei nenurodote modulio parametru -m, Ansible naudoja command modulį. Tokios vienkartinės komandos vadinamos ad-hoc komandomis. Jos patogios greitoms užduotims, kurioms nereikia rašyti playbook.

8. Konkrečios grupės valdymas

Nebūtina kaskart kreiptis į visus serverius. Vietoj all tiesiog nurodykite grupės pavadinimą:

ansible ubuntu -i inventory.ini -a "hostname"
ansible alma -i inventory.ini -a "hostname"
ansible linux -i inventory.ini -a "hostname"

Grupės taps svarbios, kai jūsų serverių sąrašas augs. Vėliau galėsite sukurti tokias grupes ir vykdyti komandas tik ten, kur jos tikslingos:

[webservers]
[databases]
[monitoring]

9. Komandų vykdymas su root teisėmis

Komandos, tokios kaip hostname ar uptime, puikiai veikia ir su paprasto naudotojo teisėmis, tačiau gana dažnai prireiks dirbti kaip root.

Pirmiausia pažiūrėkime, kurį naudotoją Ansible naudoja pagal numatytuosius nustatymus:

ansible all -i inventory.ini -a "whoami"

Mūsų atveju bus grąžintas adminuser. Dabar pridėkite parametrą -b kartu su -K:

ansible all -i inventory.ini -b -K -a "whoami"

Parametras -b įjungia teisių padidinimą (privilege escalation), o -K nurodo Ansible paprašyti sudo slaptažodžio.

Pamatysite:

BECOME password:

Įveskite savo SSH naudotojo sudo slaptažodį.

Šį kartą rezultatas bus root:

ubuntu1 | CHANGED | rc=0 >>
root
alma1 | CHANGED | rc=0 >>
root

-b įjungia become, tai yra Ansible teisių padidinimo mechanizmą. Įprastame Linux serveryje Ansible prisijungia kaip jūsų paprastas naudotojas, o tada per sudo gauna root teises.

Jei jūsų naudotojui sudo slaptažodis nenustatytas, komandą galite vykdyti be -K parametro.

10. Trikčių šalinimas

10.1 UNREACHABLE

Ansible negali prisijungti. Pirmiausia pabandykite prisijungti įprastu SSH būdu:

ssh adminuser@SERVER_IP

Jei nepavyksta ir taip, patikrinkite IP adresą, SSH prievadą, ugniasienės taisykles, naudotojo vardą ir SSH raktą.

10.2 Permission denied

Dažniausiai taip nutinka dėl neteisingo naudotojo vardo arba slaptažodžio. Patikrinkite abi reikšmes. Jei prisijungimo duomenis kopijuojate, įsitikinkite, kad prieš tekstą ar po jo nėra tarpų.

10.3 Prisijungti pavyksta, bet -b neveikia

Rankiniu būdu patikrinkite sudo serveryje:

sudo whoami

Jei prašo slaptažodžio, Ansible komandą vykdykite su -K.

10.4 Valdomame serveryje nėra Python

Dauguma Ubuntu ir AlmaLinux sistemų jau turi Python, tačiau jei Ansible rodo su tuo susijusią klaidą, jį teks įdiegti rankiniu būdu. Prisijunkite prie valdomo serverio per SSH ir vykdykite žemiau pateiktas komandas.

Ubuntu/Debian:

sudo apt update
sudo apt install python3 -y

AlmaLinux/Rocky Linux:

sudo dnf install python3 -y

11. Ansible žodynas pradedantiesiems

Terminas

Reikšmė

Valdymo serveris (control node)

Serveris, kuriame įdiegtas ir iš kurio paleidžiamas Ansible

Valdomas serveris (managed node)

Nuotolinis serveris, kurį valdo Ansible

Hostas (host)

Vienas inventory sąraše esantis serveris

Grupė (group)

Hostų rinkinys

Inventory

Failas su serverių, kuriuos gali valdyti Ansible, sąrašu

Modulis (module)

Integruotas Ansible veiksmas

Become

Teisių padidinimas, dažniausiai per sudo

Ad-hoc komanda

Vienkartinė komanda, vykdoma be playbook

Daugiau informacijos apie Ansible rasite oficialioje dokumentacijoje.

Ar gavote atsakymą į savo klausimą?