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.
- Eerst genereren we een standaardconfiguratiebestand ansible.cfg. De volgende opdracht genereert een bestand met alle instellingen uitgeschakeld:
ansible-config init --disabled > ansible.cfg
- 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
- 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
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!