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.