Ansible componenten

The ansible config file

Ansible.cfg

Het ansible.cfg-bestand is het configuratiebestand voor Ansible. Het kan worden gebruikt om verschillende opties en instellingen in te stellen die het gedrag van Ansible en de werking ervan bepalen.

Enkele algemene opties die kunnen worden ingesteld in het bestand ansible.cfg, zijn onder andere:

  • inventory: Dit specificeert het pad naar het inventarisbestand met de hosts waarop Ansible zal werken.
  • library: Dit specificeert het pad naar de directory met Ansible-modules.
  • module_utils: Dit specificeert het pad naar de directory met hulpprogrammamodules die worden gebruikt door Ansible.
  • log_path: Dit specificeert het pad naar het bestand waar Ansible zijn uitvoer logt.
  • roles_path: Dit specificeert het pad naar de directory met Ansible-rollen.

Er zijn veel andere opties die kunnen worden ingesteld in het bestand ansible.cfg, en u kunt meer informatie hierover vindenin de Ansible-documentatie.

Het bestand ansible.cfg bevat instellingen voor het aanpassen van de ansible-service op het besturingsknooppunt.

  1. Eerst genereren we een standaardconfiguratiebestand ansible.cfg. De volgende opdracht genereert een bestand met alle instellingen uitgeschakeld:
ansible-config init --disabled > ansible.cfg
  1. De volgende wijziging aan het ansible-bestand is alleen voor testdoeleinden. We stellen de variabele host_key_checking in op False, zodat we verbinding kunnen maken met doelhosts zonder de SSH-sleutel te verifiëren. In een productieomgeving wordt het ten zeerste aanbevolen om de sleutels te importeren. Wanneer u zich in de map /etc/ansible bevindt, bewerkt u het bestand ansible.cfg.
sudo nano ansible.cfg
  1. Zoek vervolgens de invoer host_key_checking (u kunt in nano zoeken door op CTRL + W te drukken en de zoekterm in te voeren). Verwijder de ‘;’ voor de invoer en voer het volgende in:
host_key_checking=False

Het inventarisbestand

Ansible Inventory is een bestand dat een lijst met hosts bevat, dit zijn de servers of apparaten die Ansible zal beheren. In de meest basisvorm is het inventarisbestandgewoon een platte lijst met hosts (of ook wel “Targets” genoemd). In meer geavanceerde , enterprise-implementaties, wordt het inventarisbestand echter vaak gehost op een Git-repository (bijvoorbeeld Github of Gitlab). Detoegevoegde waarde van extra broncodebeheer helpt teams samenwerken enhoudt wijzigingen bij die zijn aangebracht in het inventarisbestand.

Het inventarisbestand definieert groepen hosts, waarmee u acties op meerdere servers tegelijk kunt toepassen. In dit hoofdstuk beginnen we met een aantal eenvoudige voorbeelden van hoe u hosts definieert met gebruikersnamen en wachtwoorden in het inventarisbestand, en laten we vervolgens zien hoe u groepen en variabelen gebruikt.

Wanneer u Ansible installeerde, kunt u een standaard inventarisbestand vinden in de map /etc/ansible/hosts.

Inventarisoverzicht

de volgende structuur wordt gebruikt binnen een basisinventarisbestand.

[<groepsnaam>]
<optionele aliasnaam> <IP-adres> <parameters>

[<groepsnaam>:vars]
<specifieke variabele>=<waarde>
 

Met behulp van deze structuur kunnen we de volgende inventaris samenstellen:

[linux_hosts]
webserver1 ansible_host=192.168.5.2 ansible_user=davy ansible_password=SuperVeiligWachtwoordVanDavy

Speciale tekens in wachtwoorden

Wanneer het wachtwoord dat u gebruikt om verbinding te maken met een doelhost speciale tekens bevat (zoals ‘#’, ‘!’, ‘ç’,… ), zal Ansible proberen om het teparseren als een speciaal teken. Als u dit wilt ontkennen (zodat het kan worden gebruikt als een normaal teken), moet u een backslash ‘\’ toevoegen. Een voorbeeld: u hebt een doelhost met het volgende wachtwoord:
ThisIsADifficult#wachtwoord

Het volgende zou een fout veroorzaken:

webserver1 ansible_host=10.10.10.10 ansible_user=davy ansible_password=ThisIsADifficult#wachtwoord
Om het speciale #-teken te ontkennen, moet het worden gedefinieerd als volgt:
webserver1 ansible_host=10.10.10.10 ansible_user=davy ansible_password=ThisIsADifficult\#password
 

De backslash wordt niet gebruikt in het wachtwoord bij het verbinden met de host, het ontkent gewoon het speciale teken wanneer Ansible het inventarisbestand parseert.

Parameteroverzicht

Het inventarisbestand kan worden gebruikt om variabelen te definiëren voor hosts, groepen, en zelfs alle hosts in de inventaris. Deze variabelen kunnen worden gebruikt omhet gedrag van Ansible-playbooks aan te passen, zoals het instellen van verbindingsparameters, het definiëren van hostspecifieke variabelen en meer.

Hier zijn enkele van de veelgebruikte parameters die kunnen worden gebruikt in een inventarisbestand:

  • ansible_host: het IP-adres of de hostnaam van de host. Dit wordt door Ansible gebruikt om verbinding te maken met de host via SSH of andere verbindingsplugins.
  • ansible_user: de gebruikersnaam die moet worden gebruikt bij verbinding maken met de host.
  • ansible_port: hetSSH-poortnummer dat moet worden gebruikt bij verbinding maken met de host. De standaardwaarde is 22.
  • ansible_ssh_private_key_file: hetpad naar het bestand met de persoonlijke sleutel dat moet worden gebruikt voor SSH-authenticatie.
  • ansible_password: het wachtwoord dat moet worden gebruikt bij verbinding maken met de host. Dit wordt om veiligheidsredenen niet aanbevolen en mag alleen als laatste redmiddel worden gebruikt.
  • ansible_ssh_pass: een alternatief voor ansible_password dat het wachtwoord specificeert dat moet worden gebruikt bij verbinding met de host via SSH. Dit wordt ook om veiligheidsredenenniet aanbevolen en mag alleen als laatste redmiddel worden gebruikt.
  • ansible_connection: de verbindingsplug-in die moet worden gebruikt bij verbinding met de host. De standaardwaarde is ssh, maar andere plug-ins zoalswinrm, local of docker kunnen worden gebruikt voor verbinding met verschillende typen hosts.
  • ansible_become: een booleaanse waarde die bepaalt of privilege escalation moet worden gebruikt bij het uitvoeren van opdrachten op de host. De standaardwaarde is false.
  • ansible_become_user: de gebruikersnaam die moet worden gebruikt voor privilege-escalatie bij het uitvoeren van opdrachten op de host.
  • ansible_become_password: het wachtwoord dat moet worden gebruikt voor privilege-escalatie bij het uitvoeren van opdrachten op de host. Dit wordt om veiligheidsredenen afgeraden en mag alleen als laatste redmiddel worden gebruikt.
  • ansible_shell_type: het shelltype dat moet worden gebruikt bij het uitvoeren van opdrachten op de host. De standaardwaarde is sh, maar andere shells zoals bash of zsh kunnen worden gebruikt.

Variabelen in het inventarisbestand

Stel dat u een groep van 10 servers hebt die een vergelijkbare naamgevingsconventie hebben en die kunnen worden opgevraagd met dezelfde gebruikersnaam en hetzelfde wachtwoord. Stel dat ze de volgende naam hebben:

  • Webserver01
  • Webserver02
  • Webserver10

In plaats van 10 regels toe te voegen aan het inventarisbestand, kunt u ze toevoegen als één enkele regel met behulp van het volgende patroon:

webserver[01-10].lab.local ansible_user=webadmin ansible_password=Webadminsecretpass

Basisvoorbeelden

Linux-server

Stel dat we eenLinux-server hebben met IP-adres 192.168.1.10 en we willen deze beheren met Ansible met behulp van de gebruikersnaam ansibleuser en het wachtwoord wachtwoord123. We kunnen deze host in ons inventarisbestand als volgt definiëren:

[linux_servers]
linux1 ansible_host=192.168.1.10 ansible_user=ansibleuser ansible_password=password123
 

In dit voorbeeld hebben we een groep gemaakt met de naam [linux-servers] en onze Linux-server aan die groep toegevoegd. We hebben ook de variabelen ansible_user en ansible_password opgegeven om Ansible te vertellen hoe verbinding moet worden gemaakt met de server.

Windows Server

Stel dat we een Windows-server hebben met IP-adres 192.168.1.20 en dat we deze willen beheren met Ansible met de gebruikersnaam ansibleuser en het wachtwoord password123. We kunnen deze host in ons inventarisbestand als volgt definiëren:

[windows_servers]
win1 ansible_host=192.168.1.20 ansible_user=ansibleuser ansible_password=password123 ansible_connection=winrm ansible_winrm_transport=ntlm
 

In dit voorbeeld hebben we een groep gemaakt met de naam [windows-servers] en onze Windows-server aan die groep toegevoegd. We hebben ook de variabelen ansible_user, ansible_password, ansible_connection en ansible_winrm_transport opgegeven om Ansible te vertellen hoe verbinding moet worden gemaakt met de server met behulp van WinRM.

Cisco Switch

Stel dat we een Cisco-switch hebben met IP-adres 192.168.1.30 en we willen deze beheren met Ansible met behulp van de gebruikersnaam ansibleuser en het wachtwoord password123. We kunnen deze host in ons inventarisbestand als volgt definiëren:

[cisco_switches]
access_SWBlockD ansible_host=192.168.1.30 ansible_user=ansibleuser ansible_password=password123 ansible_connection=network_cli
 

In dit voorbeeld hebben we een groep gemaakt met de naam [cisco-switches] en onze Cisco-switch aan die groep toegevoegd. We hebben ook de variabelen ansible_user, ansible_password en ansible_connection opgegeven om Ansible te vertellen hoe verbinding moet worden gemaakt met de switch met behulp van de network_cli connection-plugin.

Groepen en variabelen gebruiken

Groepsvars

In de vorige voorbeelden hebben we de gebruikersnaam en het wachtwoord voor elke host afzonderlijk opgegeven. Als we veel hosts hebben, kan het lastig zijn om deze variabelen voor elke host op te geven. In plaats daarvan kunnen we groepsvariabelen gebruiken om de variabelen voor een groep hosts te specificeren.

Stel dat we bijvoorbeeld een groep Linux-servers hebben en we willen dezelfde gebruikersnaam en hetzelfde wachtwoord voor alle servers gebruiken. We kunnen een groepsvariabele in ons inventarisbestand als volgt definiëren:

[linux_servers]
server1 ansible_host=192.168.1.10
server2 ansible_host=192.168.1.11

[linux_servers:vars]
ansible_user=ansibleuser
ansible_password=wachtwoord123
 

In dit voorbeeld hebben we een groep Linux-servers gedefinieerd en vervolgens een groepsvariabele voor die groep gedefinieerd met behulp van de syntaxis [groupname:vars]. De variabelen ansible_user en ansible_password zijn van toepassing op alle hosts in de groep linux-servers.

Onderliggende groepen

Onderliggende groepen worden gedefinieerd met de syntaxis [child-group:children] in het inventarisbestand, waarbij child-group de naam van de onderliggende groep is en children het trefwoord is datde bovenliggende groep specificeert. Alle instellingen die in de bovenliggende groep zijn gedefinieerd, worden overgenomen door de onderliggende groep, inclusief alle host- of variabeledefinities.

Onderliggende groepen zijn handig voor het organiseren van uw inventarisbestand en het vereenvoudigen van de definitie van eigenschappen en variabelen voor gerelateerde hosts. U kunt ze gebruiken om hosts te groeperen op functie, omgeving of een andere categorie die zinvol is voor uw infrastructuur.

Voorbeeld 1: Onderliggende groepen in de Linux-servergroep

Stel dat we een groep Linux-servers hebben die we willen verdelen in twee onderliggende groepen, webservers en db-servers, en we willen verschillende variabelen definiëren voor elke onderliggende groep.

We kunnen ons inventarisbestand als volgt definiëren:

[linux_servers]
server1 ansible_host=192.168.1.10
server2 ansible_host=192.168.1.11
server3 ansible_host=192.168.1.12

[web_servers:kinderen]
linux_servers

[db_servers:kinderen]
linux_servers

[web-servers:vars]
http_port=8080

[db-servers:vars]
db_port=3306
 

In dit voorbeeld hebben we een groep gemaakt met de naam linux-servers met drie hosts. We hebben vervolgens twee onderliggende groepen gedefinieerd, web-servers en db-servers, die beide erven van linux-servers. We hebben ook verschillende variabelen gedefinieerd voor elke onderliggende groep.

Wanneer we een Ansible-playbook uitvoeren dat gericht is op web-servers, zal Ansible het playbook uitvoeren tegen alle hosts in de web-servers-groep, wat alle hosts in de bovenliggende groep linux-servers omvat. Ansible zal ook de http_port-variabele gebruiken voor alle hosts in de web-servers-groep.

Op dezelfde manier, wanneer we een Ansible-playbook uitvoeren dat gericht is op db-servers, zal Ansible het playbook uitvoeren tegen alle hosts in de db-servers-groep, wat alle hosts in de bovenliggende groep linux-servers omvat. Ansible gebruikt ook de variabele db_port voor alle hosts in de groep db-servers.

Voorbeeld 2: Onderliggende groepen in de Windows Server-groep

Stel dat we een groep Windows-servers hebben die we willen verdelen in twee onderliggende groepen, dev-servers en prod-servers, en dat we verschillende verbindingsvariabelen willen definiëren voor elke onderliggende groep.

[windows_servers]
server1 ansible_host=192.168.1.20
server2 ansible_host=192.168.1.21
server3 ansible_host=192.168.1.22

[dev_servers:children]
windows_servers

[prod_servers:children]
windows_servers

[dev_servers:vars]
ansible_user=devuser
ansible_password=devpass

[prod_servers:vars]
ansible_user=produser
ansible_password=prodpass
 

In dit voorbeeld hebben we een groep genaamd windows-servers gemaakt met drie hosts. Vervolgens hebben we twee child groups gedefinieerd, dev-servers en prod-servers, die beide erven van windows-servers. We hebben ook verschillende verbindingsvariabelen gedefinieerd voor elke onderliggende groep.

Wanneer we een Ansible-playbook uitvoeren dat gericht is op dev-servers, zal Ansible het playbook uitvoeren op alle hosts in de dev-servers-groep, wat alle hosts in de bovenliggende groep windows-servers omvat. Ansible zal ook de variabelen ansible_user en ansible_password gebruiken voor alle hosts in de dev-servers-groep.

Op dezelfde manier, wanneer we een Ansible-playbook uitvoeren dat gericht is op prod-servers, zal Ansible het playbook uitvoeren op alle hosts in de prod-servers-groep, wat alle hosts in de bovenliggende groep windows-servers omvat. Ansible gebruikt ook de variabelen ansible_user en ansible_password voor alle hosts in de prod-servers-groep.

Ansible configureren voor het gebruik van keypair-authenticatie

Geef in het Ansible-configuratiebestand (ansible.cfg) de privésleutel op:

[defaults]
private_key_file = ~/.ssh/id_rsa

Of stel het in in het inventarisbestand (dit is de voorkeursmanier omdat het veel granulair)

Voeg de volgende vermelding toe aan de host of groep waar u zich wilt authenticeren met behulp van een sleutelpaar:

ansible_ssh_private_key_file=~/.ssh/id_rsa

Volledige voorbeeldregel:
kasm ansible_host=172.16.90.10 ansible_user=davy.cavens ansible_ssh_private_key_file=~/.ssh/id_rsa 

Oefenen!

U kunt de inventarissyntaxis oefenen met behulp van de volgende link:
https://legacy.kodekloud.com/p/ansible-practice-test/?scenario=questions_ansible_inventory

Laten we het proberen!