Ansible installeren en configureren op Ubuntu 22.04
Ansible is een zeer populair hulpmiddel voor configuratiebeheer, ontworpen om het beheer van een groot aantal servers te stroomlijnen. Het kan het proces van het opzetten van nieuwe servers en het installeren van applicaties automatiseren met een enkel commando of bestand. Je kunt zoveel servers besturen en er tegelijkertijd processen op uitvoeren vanaf een enkel knooppunt. Ansible vereist geen speciale software die op de serverknooppunten geïnstalleerd moet worden en kan ze via SSH besturen.
In deze gids leren we hoe je Ansible installeert en configureert op een Ubuntu 22.04 server.
Voorwaarden
- Twee of meer serversystemen met Ubuntu 22.04 waarop OpenSSH server is geïnstalleerd.
- Zowel de server als de nodes zijn toegankelijk via openbare IP-adressen.
- Een niet-root gebruiker met sudo privileges is ingesteld op de Ansible server en een root gebruiker met een wachtwoord is ingesteld op de Ansible clients.
Stap 1 – Installeer Ansible
We zullen de officiële repository van Ansible gebruiken om de nieuwste versie te installeren. Voeg de officiële repository van Ansible toe aan de server.
$ sudo add-apt-repository ppa:ansible/ansible
Gelukkig wordt Ubuntu geleverd met Ansible 2.9 en dat is wat we gaan installeren. Voer het volgende commando uit om Ansible te installeren.
$ sudo apt install ansible -y
Test je installatie door het volgende commando uit te voeren.
$ ansible --version ansible [core 2.13.3rc1] config file = /etc/ansible/ansible.cfg configured module search path = ['/home/navjot/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3/dist-packages/ansible ansible collection location = /home/navjot/.ansible/collections:/usr/share/ansible/collections executable location = /usr/bin/ansible python version = 3.10.4 (main, Jun 29 2022, 12:14:53) [GCC 11.2.0] jinja version = 3.0.3 libyaml = True
Installeer en activeer het python3-argcomplete
pakket om ondersteuning voor Ansible bash voltooiing in te stellen.
$ sudo apt install python3-argcomplete $ sudo activate-global-python-argcomplete3
Je kunt nu op de Tab-toets drukken om een lijst met opties voor de bash-shell te krijgen.
Stap 2 – Inventarisbestand instellen
Om verbinding te kunnen maken met meerdere hosts heb je een bestand nodig dat de details van de knooppunten vastlegt. Dit bestand heet het Inventarisbestand.
Afhankelijk van hoeveel servers je wilt controleren, kun je met het Inventarisbestand van Ansible ze ook in groepen en subgroepen indelen. Je kunt ook aangepaste variabelen instellen die van toepassing zijn op geselecteerde hosts of groepen en die verder gebruikt kunnen worden tijdens het doorgeven van de instructies.
Ansible wordt geleverd met een standaard Inventarisbestand dat beschikbaar is op /etc/ansible/hosts
. Open het met de Nano editor.
$ sudo nano /etc/ansible/hosts
Plak de volgende code onderaan het bestand.
[servers] server1 ansible_host=203.0.113.111 server2 ansible_host=203.0.113.112 server3 ansible_host=203.0.113.113 [all:vars] ansible_python_interpreter=/usr/bin/python3
De sectie servers
definieert de lijst van knooppunten waarmee je verbinding wilt maken. Je kunt evenveel groepen aanmaken om servers in meerdere groepen te rangschikken.
De groep all:vars
stelt de parameter ansible_python_interpreter
in op alle hosts in de inventaris. Het zorgt ervoor dat Ansible de uitvoerbare Python 3 gebruikt in plaats van Python 2, die uit recente Ubuntu-versies is verwijderd.
Als je klaar bent, sla dan het bestand op door op Ctrl + X te drukken en Y in te voeren als je gevraagd wordt je wijzigingen te bevestigen.
Opmerking: Je kunt je Inventarisbestand ook aanmaken op een locatie naar keuze, die je dan kunt doorgeven door de parameter -i
te gebruiken tijdens het uitvoeren van Ansible-commando’s.
Je kunt je inventarislijst controleren met het volgende commando.
$ ansible-inventory --list -y all: children: servers: hosts: server1: ansible_host: 203.0.113.111 ansible_python_interpreter: /usr/bin/python3 server2: ansible_host: 203.0.113.112 ansible_python_interpreter: /usr/bin/python3 server3: ansible_host: 203.0.113.113 ansible_python_interpreter: /usr/bin/python3 ungrouped: {}
Servers organiseren in groepen en subgroepen
Dit is een handige tip als je veel servers hebt waarbij sommige servers specifieke functies uitvoeren. Je kunt deze methode bijvoorbeeld gebruiken om webservers en databaseservers apart te groeperen. Je kunt zelfs een host deel laten uitmaken van meerdere groepen. Om dat te bereiken zou je inventarisbestand er ongeveer zo uit moeten zien.
[webservers] 203.0.113.111 203.0.113.112 [dbservers] 203.0.113.113 server_hostname [development] 203.0.113.111 203.0.113.113 [production] 203.0.113.112 server_hostname
Stap 3 – Stel SSH Sleutels in
Om Ansible met de servers te kunnen verbinden, moet je SSH-sleutels configureren tussen je Ansible-server en de hosts die in het inventarisatiebestand staan. Dit werkt alleen als de Ansible clients geen publieke sleutel hebben ingeschakeld en een root account hebben ingeschakeld met een wachtwoord.
Gebruik de volgende stappen om een SSH-sleutel voor Ansible en zijn knooppunten aan te maken en in te stellen.
Maak de sleutel voor Ansible.
$ ssh-keygen -t rsa -b 4096 -C "Ansible key"
Kopieer de publieke sleutel naar je accounts op de externe servers. Hiervoor gebruiken we het commando ssh-copy-id
.
$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected] $ ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected] $ ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected]
Dat is alles. Nu zou Ansible met je servers moeten kunnen praten.
SSH-sleutels instellen op knooppunten met bestaande publieke sleutel
Als de clients al publieke sleutels hebben ingeschakeld, dan moet je bepaalde extra stappen volgen. Daarvoor moet je op elke node server een nieuwe gebruiker aanmaken die alleen toegankelijk is voor Ansible. Die gebruiker zal sudo privileges hebben die toegankelijk zijn zonder wachtwoord en alleen toegankelijk zijn vanaf je ansible server.
Om een ansible
gebruiker aan te maken, voer je het volgende commando uit.
$ sudo adduser ansible
Kies een sterk wachtwoord en laat alle andere velden leeg.
Configureer nu wachtwoordloze sudo toegang tot deze gebruiker via het volgende commando.
$ echo "ansible ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ansible
Nu je de nieuwe gebruiker hebt toegevoegd en geconfigureerd, kun je de SSH sleutel van je ansible server naar de node server kopiëren met het volgende commando.
$ ssh-copy-id [email protected]
Er wordt gevraagd om een wachtwoord voor de ansible gebruiker. Voer het in en de SSH-sleutel wordt gekopieerd.
Schakel vervolgens de wachtwoord-gebaseerde login voor de ansible
gebruiker op de node server uit.
$ sudo usermod -L ansible
Nu is je node server alleen toegankelijk vanaf de Ansible server omdat alleen die server de publieke sleutel ervoor heeft en je hem niet direct met sudo privileges op de node server kunt gebruiken omdat het inloggen met een wachtwoord is uitgeschakeld.
Je zult deze stappen voor elke node server moeten herhalen. Vervang ook de root
gebruiker door de ansible
gebruiker in deze tutorial.
Stap 4 – Test de verbinding
Na het opzetten van het inventarisbestand en de SSH-sleutels moeten we controleren of Ansible verbinding kan maken met de servers.
Typ het volgende commando om de verbinding te controleren. Dit commando test de verbinding met alle servers uit het inventarisbestand.
$ ansible all -m ping -u root
Dit commando gebruikt de ping-module van Ansible om een verbindingstest uit te voeren op alle servers. Je zou een uitvoer als de volgende moeten krijgen.
server1 | SUCCESS => { "changed": false, "ping": "pong" } server2 | SUCCESS => { "changed": false, "ping": "pong" } server3 | SUCCESS => { "changed": false, "ping": "pong" }
Als dit de eerste keer is dat je Ansible gebruikt, wordt je gevraagd de authenticiteit van alle servers te bevestigen. Typ bij de vraag yes
en druk op ENTER
om te bevestigen.
Stap 5 – Voer enkele basiscommando’s uit
Laten we enkele basiscommando’s op de servers uitvoeren met Ansible. Voor het uitvoeren van een commando op de server wordt het volgende formaat gebruikt.
$ ansible all -a "command" -u <username>
Schijfgebruik controleren
Laten we eerst het schijfgebruik op al onze servers controleren.
$ ansible all -a "df -h" -u root server1 | CHANGED | rc=0 >> Filesystem Size Used Avail Use% Mounted on tmpfs 198M 972K 197M 1% /run /dev/sda2 50G 3.9G 44G 9% / tmpfs 989M 0 989M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 198M 4.0K 198M 1% /run/user/1000 server2 | CHANGED | rc=0 >> Filesystem Size Used Avail Use% Mounted on tmpfs 198M 922K 197M 1% /run /dev/sda2 50G 4.9G 43G 10% / tmpfs 989M 0 989M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 198M 4.0K 198M 1% /run/user/1000
Richt je op individuele hosts en groepen
Tot nu toe voerden we commando’s uit op alle remote servers tegelijk. Maar dat is niet altijd het geval. Om een commando op slechts één server uit te voeren, moet je het volgende formaat gebruiken.
$ ansible server1 -a "uptime" -u root server1 | CHANGED | rc=0 >> 21:38:26 up 11 min, 2 users, load average: 0.00, 0.20, 0.19
Het bovenstaande commando controleert de uptime op server1 uit de inventarisatiegroep.
Je kunt ook meerdere servers targeten met het volgende formaat.
$ ansible server1:server2 -m ping -u root
Je kunt ook rechtstreeks groepen of subgroepen uit het inventarisbestand targeten.
$ ansible groupname -m ping -u <username>
Alle servers bijwerken
Voor deze tutorial gaan we ervan uit dat alle remote servers Debian of Ubuntu OS draaien.
Voer het volgende commando uit om de software op al je servers bij te werken.
$ ansible all -m apt -a "update_cache=yes upgrade=yes" -u root
De parameter -m
definieert de module die Ansible moet uitvoeren. De parameter -a
verwijst naar de argumenten of commando’s voor de bijbehorende module. Hier gebruiken we de module apt
van Ansible om servers bij te werken, net zoals we in ons vorige voorbeeld de module ping
gebruikten. De update_cache
werkt de APT-cache op de server bij en upgrade=yes
vertelt Ansible om het commando apt upgrade
uit te voeren.
Als je de ansible
gebruiker gebruikt zoals hierboven gedocumenteerd, moet je het ansible
commando aanpassen om met verhoogde sudo privileges te draaien.
$ ansible server2 -m apt -a "update_cache=yes upgrade=yes" -K -b -u ansible
Hier vraagt -K
om een wachtwoord voor privilege-escalatie. -b
voert de ansible operatie uit met become
waarmee je een andere gebruiker kunt zijn. Beide variabelen samen laten ansible draaien met verhoogde sudo-privileges. Je zult dit moeten gebruiken voor alle commando’s die sudo privileges vereisen.
Soms vereisen sommige van deze update commando’s een reboot, dus voer het volgende commando uit om al je servers te rebooten.
$ ansible all -a "reboot" -u root
Dit waren slechts enkele van de basiscommando’s die je met Ansible kunt uitvoeren.
Stap 6 – Inleiding tot Playbooks
Met bovenstaande commando’s kun je eenmalige taken uitvoeren, maar als je meerdere servers wilt instellen of dezelfde reeks commando’s op meerdere servers wilt uitvoeren, moet je playbooks instellen. Playbooks zijn bestanden geschreven in YAML en bevatten instructies om een reeks taken voor het instellen van applicaties en diensten te automatiseren.
We gaan nu een playbook maken om Nginx te installeren en een HTML pagina in te stellen op de Ansible node. Maak een map voor Ansible in je thuismap.
$ mkdir ~/ansible
Maak en open het playbook bestand om te bewerken.
$ cd ~/ansible $ nano testplaybook.yml
Playbooks gebruiken het YAML formaat om een of meer plays te definiëren. Een play is een verzameling geordende taken die zo zijn gerangschikt dat ze een proces automatiseren. De plays worden gedefinieerd als een YAML lijst.
De eerste stap om een play te definiëren is te bepalen welke hosts het doel zijn met behulp van de hosts: all
richtlijn. De richtlijn become
wordt gebruikt om aan te geven dat de volgende taken door een supergebruiker moeten worden uitgevoerd.
We zullen drie taken definiëren: één om een gebruiker toe te voegen, één om alle pakketten te upgraden, en de laatste om de Nginx server te installeren. De sectie vars
van het playbook wordt gebruikt om aangepaste variabelen te definiëren. We definiëren twee variabelen, één voor de gebruiker die we moeten toevoegen, en de tweede om de toestand van het pakket dat we moeten installeren te definiëren. Om de variabele te gebruiken, moeten we de naam van de variabele tussen dubbele accolades zetten.
De module ansible.builtin.user
wordt gebruikt om een nieuwe gebruiker met sudo-privileges toe te voegen. Om de gebruiker toe te voegen, gebruiken we de variabelen name
, password
en de group
. De group
variabele wordt ingesteld op sudo
om de gebruiker superuser rechten te geven. Je kunt het plaintext-password niet in het playbook-bestand zetten, daarom voegen we een SHA gehasht geheim toe. Daarvoor gebruiken we het hulpprogramma mkpasswd
. Voer het volgende commando uit om het whois
pakket te installeren.
$ sudo apt install whois
Genereer het gehashte wachtwoord. Je wordt om het gebruikelijke wachtwoord gevraagd en krijgt daarvoor een gehashte string. Noteer de gehashte sleutel om te gebruiken in het playbook-bestand.
$ mkpasswd --method=sha-512 Password: $6$dGbprm2oVqClDDDh$Epk6r5eXYkYBaQpQpP.H7VCdz0g9Aj0aO8hjy/WXq4WmfQ7GvQP2/cl/cNhd7.LRFuCKix9uCF2t8X5/Pv0Lk1
De richtlijn update_cache
is om de repository lijst van het systeem bij te werken, net als het commando apt update
en de richtlijn upgrade: dist
vertelt Ansible om de systeemupgrade uit te voeren. De derde opdracht spreekt voor zich en installeert de nieuwste versie van de Nginx server.
Plak op basis van de besproken informatie de volgende code in het bestand. Plak de gehashte sleutel die je kreeg als waarde voor de variabele password
.
--- - name: Test playbook hosts: all become: true vars: state: latest user: navjot tasks: - name: Add the user {{ user }} ansible.builtin.user: name: "{{ user }}" password: '$6$dGbprm2oVqClDDDh$Epk6r5eXYkYBaQpQpP.H7VCdz0g9Aj0aO8hjy/WXq4WmfQ7GvQP2/cl/cNhd7.LRFuCKix9uCF2t8X5/Pv0Lk1' group: sudo - name: Upgrade all apt packages apt: update_cache: yes upgrade: dist - name: Install the {{ state }} of package "nginx" apt: name: "nginx" state: "{{ state }}"
Sla het bestand op door op Ctrl + X te drukken en Y in te voeren als gevraagd wordt je wijzigingen te bevestigen.
Voer het volgende commando uit om het playbook uit te voeren. De vlag --ask-become-pass
zal om je root wachtwoord vragen om een verhoogde operatie uit te voeren.
$ ansible-playbook testplaybook.yml --ask-become-pass
Je krijgt de volgende uitvoer.
BECOME password: PLAY [Test playbook] *************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************* ok: [server1] ok: [server2] ok: [server3] TASK [Add the user casablanca] ***************************************************************************************** changed: [server3] changed: [server2] changed: [server1] TASK [Upgrade all apt packages] **************************************************************************************** changed: [server1] changed: [server2] changed: [server3] TASK [Install the latest of package "nginx"] *************************************************************************** changed: [server3] changed: [server2] changed: [server1] PLAY RECAP ************************************************************************************************************* server1 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 server2 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 server3 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Dit bevestigt dat je playbook met succes is uitgevoerd.
Als je een aangepast inventarisbestand gebruikt, moet je de locatie van het bestand als volgt in het commando opnemen.
$ ansible-playbook -i /etc/ansible/custominventory testplaybook.yml --ask-become-pass
Conclusie
Daarmee is onze tutorial over het installeren en configureren van Ansible op Ubuntu 22.04 server afgerond. Als je vragen hebt, plaats ze dan in de opmerkingen hieronder.