Wéi Dir Ansible Plays a Playbooks erstellt - Deel 5
An dësem Deel 5 vun der Ansible Serie erkläre mir wéi een Ansible Plays a Playbooks erstellt mat Ansible Moduler.
Ansible Schëffer mat Standalone Skripte genannt Moduler déi a Playbooks benotzt gi fir spezialiséiert Aufgaben op Fernknoten auszeféieren.
Moduler kommen praktesch fir d'Automatiséierung vun Aufgaben wéi Package Management, Archivéieren a Kopie vun Dateien fir nëmmen e puer ze nennen. Si erlaben Iech Tweaks op Konfiguratiounsdateien ze maachen an Apparater wéi Router, Schalter, Lastbalancer, Firewalls an e Host vun aneren Apparater ze verwalten.
D'Zil vun dësem Ënnerthema ass Iech en Iwwerbléck iwwer verschidden Aufgaben ze ginn, déi duerch Ansible Moduler erfëllt kënne ginn:
Package Management am Linux
Package Management ass eng vun de wesentlechsten an heefegsten Aufgaben, déi vu Systemadministratoren gedroe ginn. Ansible Schëffer mat Moduler déi Iech hëllefen Package Management Aufgaben auszeféieren souwuel a RedHat an Debian baséiert Systemer.
Si si relativ einfach ze roden. Et gëtt den apt Modul fir YUM Package Management an dnf Modul verbonne mat méi neie RHEL Verdeelungen.
Drënner sinn e puer Beispiller wéi d'Moduler an engem Spillbuch benotzt kënne ginn:
--- - name: install Apache webserver hosts: webservers tasks: - name: install httpd dnf: name: httpd State: latest
--- - name: install Apache webserver hosts: databases tasks: - name: install Apache webserver apt: name: apache2 State: latest
Service Modul
D'Service Modul erlaabt System Administrateuren ze starten, stoppen, Aktualiséierung, Upgrade a Reload Servicer um System.
--- - name: Start service httpd, if not started service: name: httpd state: started
--- - name: Stop service httpd service: name: httpd state: stopped
--- - name: Restart network service for interface eth0 service: name: network state: restarted args: enp2s0
Modul kopéieren
Wéi den Numm et scho seet, kopéiert Modul kopéiert Dateien vun enger Plaz op der Fernmaschinn op eng aner Plaz op der selwechter Maschinn.
--- - name: Copy file with owner and permissions copy: src: /etc/files/tecmint.conf dest: /srv/tecmint.conf owner: tecmint group: tecmint mode: '0644'
D'Spillbuch kopéiert d'Configuratiounsdatei tecmint.conf vum /etc/files/ Verzeichnis an /srv/ Verzeichnis als tecmint Benotzer mat 0644 Permissiounen.
Permissiounen kënnen och mat symbolescher Representatioun vertruede ginn wéi an der leschter Zeil gewisen.
--- - name: Copy file with owner and permissions copy: src: /etc/files/tecmint.conf dest: /srv/tecmint.conf owner: tecmint group: tecmint mode: u=rw, g=r, o=r
D'Permissiounen am virege Beispill kënne vertruede sinn wéi an der leschter Zeil gewisen, De Benotzer gëtt Lies- a Schreifrechter zougewisen, de Grupp gëtt Schreifrechter zougewisen, an de Rescht vun der Welt gëtt Liesrechter zougewisen.
Datei Modul
De Dateimodul gëtt benotzt fir vill Dateioperatiounen ze droen, inklusiv Dateien & Verzeichnisser erstellen, Dateierechter ze ginn, a Symlinks astellen.
--- - name: Change file ownership, group, and permissions file: path: /etc/tecmint.conf owner: tecmint group: tecmint mode: '0644'
Déi uewe genannte Spill erstellt eng Datei mam Numm tecmint.conf am /etc Verzeichnis Permissiounen op 0644.
--- - name: Remove file (delete file) file: path: /etc/tecmint.conf state: absent
Dëst läscht oder läscht de Fichier tecmint.conf.
--- - name: create a directory if it doesn’t exist file: path: /etc/mydirectory State: directory mode: '0777'
Dëst erstellt e Verzeechnes am /etc Verzeichnis Permissiounen op 0777.
--- - name: Recursively deleting a directory file: path: /etc/tecmint.conf state: absent
Déi uewe genannte Spill läscht rekursiv e Verzeechnes.
Lineinfile Modul
De Lineinfile Modul ass hëllefräich wann Dir eng eenzeg Zeil an enger Datei wëllt änneren. Et kann eng existent Linn ersetzen.
--- - name: Ensure SELinux is set to enforcing mode lineinfile: path: /etc/selinux/config regexp: '^SELINUX=' line: SELINUX=disabled
D'Spill uewen setzt SELINUX Wäert op behënnert.
SELINUX=disabled
--- - name: Add a line to a file if the file does not exist, without passing regexp lineinfile: path: /etc/hosts line: 10.200.50.51 linux-console.net create: yes
Dëst füügt den Entrée 10.200.50.51 linux-console.net un d' /etc/hosts Datei.
Archiv Modul
En Archivmodul gëtt benotzt fir e kompriméierten Archiv vun enger eenzeger oder méi Dateien ze kreéieren. Et gëtt ugeholl datt d'Kompressiounsquell existéiert op der Zilziel präsent ass. No der Archivéierung kann d'Quelldatei spéider geläscht oder geläscht ginn mat der Ausso remove=True
.
- name: Compress directory /path/to/tecmint_dir/ into /path/to/tecmint.tgz archive: path: /path/to/tecmint_dir dest: /path/to/tecmint.tgz This compresses the /path/to/tecmint_dir directory to /path/to/tecmint.tgz
- name: Compress regular file /path/to/tecmint into /path/to/foo.gz and remove it archive: path: /path/to/tecmint dest: /path/to/tecmint.tgz remove: yes
Am uewe genannte Spill gëtt d'Quelldatei /path/to/tecmint geläscht nodeems den Archiv fäerdeg ass.
- name: Create a bz2 archive of /path/to/tecmint archive: path: /path/to/tecmint format: bz2
Dëst erstellt eng kompriméiert Datei am bz2 Format vun der /path/to/tecmint Datei.
Gitt Modul
De Modul geréiert Git Checkouts vu Software Repositories.
- git: repo: 'https://foosball.example.org/path/to/repo.git' dest: /srv/checkout version: release-0.22
Kommando Modul
Ee vun de meescht benotzt Moduler, de Kommando Modul hëlt de Kommando Numm a spéider gefollegt vun enger Lëscht vun Argumenter. De Kommando ass deeselwechte Wee wéi Dir an enger Linux Shell aginn hutt.
- name: Executing a command using the command module command: cat helloworld.txt
--- - name: Check the remote host uptime hosts: servers tasks: - name: Execute the Uptime command over Command module register: uptimeoutput command: "uptime" - debug: var: uptimeoutput.stdout_lines
De Kommando Modul recuperéiert d'Uptime vun Remote Serveren.
Variablen fir d'Resultater vu lafende Kommandoen ze recuperéieren
Normalerweis ginn Ansible Playbooks benotzt fir Aufgaben op geréiert Hosten auszeféieren ouni d'Ausgab op der Kommandozeil ze weisen. Et ginn awer Fäll, datt Dir verlaangt kann d'Ausgab oder d'Resultater erfaassen. An dëser Sektioun gi mir Iech duerch wéi Dir d'Ausgab vun engem Spillbuch an enger Variabel erfaasst a spéider weist.
En ansible Register gëtt benotzt fir d'Ausgab vun enger Aufgab z'erfaassen an et eng Variabel ze späicheren. D'Variabel wäert duerno de Stdout vun der Aufgab enthalen.
Zum Beispill, loosst eis unhuelen datt Dir d'Disknotzung vu verwalteten Noden a jeeweilege Root-Verzeichnungen iwwerpréift wëllt mam Kommando df -Th /
. Dir wäert de Modul 'Kommando'
benotzen fir de Kommando ze definéieren an 'Registréieren'
fir de std-Output an enger Variabel ze späicheren.
Fir de Kommando ze weisen, benotzt Dir de Modul 'Debug'
niewent dem stdout Retourwäert.
--- - hosts: all become: yes tasks: - name: Execute /boot usage on Hosts command: 'df -Th /' register: df - debug: var=df.stdout
Elo, loosst eis d'Spillbuch lafen. An dësem Fall hu mir eist Spillbuch check_disk_space.yml genannt.
# ansible-playbook check_disk_space.yml
Wéi Dir gesi hutt, ass d'Output alles verréckt a mécht et schwéier ze verfollegen.
Fir d'Ausgab ze alignéieren an et méi einfach ze liesen, ersetzt de stdout Retourwäert mat stdout_lines.
--- - hosts: all become: yes tasks: - name: Execute /boot usage on Hosts command: 'df -Th /' register: df - debug: var=df.stdout_lines
Benotzt Konditioune fir d'Spillausféierung ze kontrolléieren
Just wéi a Programméierungssproochen, ginn bedingt Aussoe benotzt wa méi wéi ee Resultat méiglech ass. Loosst eis e puer vun den allgemeng benotzte bedingte Aussoen an Ansible Playbooks kucken.
Heiansdo wëllt Dir vläicht Aufgaben op spezifesch Noden ausféieren an net anerer. D'wann
bedingt Ausso ass ganz einfach ze benotzen an an engem Spillbuch ëmzesetzen. Wann Dir d'wann
Klausel benotzt, deklaréiert einfach d'Konditioun niewent der Klausel wéi gewisen:
when: condition
Wann d'Konditioun zefridden ass, da gëtt d'Aufgab um Fernsystem ausgefouert.
Loosst eis e puer Beispiller kucken:
--- - hosts: all tasks: - name: Install Nginx on Debian apt: name=nginx state=present when: ansible_os_family == “Debian”
D'Spill uewen installéiert den Nginx Webserver op Hosten déi d'Debian Famill vun Distros lafen.
Dir kënnt och den ODER
an AND
Bedreiwer niewent dem wann d'bedingte Ausso benotzen.
--- - hosts: all tasks: - name: Install Nginx on Debian apt: name=nginx state=present when: ansible_os_family == “Debian” and ansible_distribution_version == “18.04”
Wann Dir den AND
Bedreiwer benotzt, musse béid Aussoen zefridden sinn fir d'Aufgab auszeféieren.
D'Spill hei uewen installéiert Nginx op Noden déi eng Debian Famill vun OS lafen déi Versioun 18.04 ass. Natierlech wäert dëst Ubuntu 18.04 sinn.
Mam ODER
Bedreiwer gëtt d'Aufgab ausgefouert wann ee vun de Konditioune erfëllt ass.
--- - hosts: all tasks: - name: Install Nginx on Debian apt: name=nginx state=present when: ansible_os_family == “Debian” or Ansible_os_family == “SUSE”
D'Spill uewen installéiert Nginx Webserver op entweder Debian oder SUSE Famill vun OS oder béid vun hinnen.
NOTÉIERT: Vergewëssert Iech ëmmer dat duebelt Gläichheetszeechen ==
ze benotzen wann Dir eng Konditioun testen.
Konditioune an Schleifen
Konditioune kënnen och an enger Loop benotzt ginn. Sot zum Beispill Dir hutt eng Lëscht vu verschidde Packagen déi op Fernknoten installéiert musse ginn.
Am Playbook hei drënner hu mir eng Array genannt Packagen mat enger Lëscht vu Packagen déi installéiert musse ginn. Dës Aufgabe ginn een nom aneren duerchgefouert wann déi erfuerderlech Klausel op True gesat ass.
--- - name: Install Software packages hosts: all vars: packages: • name: nginx required: True • name: mysql required: True • name: apache required: False tasks: • name: Install “{{ item.name }}”on Debian apt: name: “{{ item.name }}” state: present When: item.required == True loop: “{{ packages }}”
Fehlerhandlung konfiguréieren
Heiansdo feelen Aufgaben wann Dir Playbooks leeft. Loosst eis unhuelen datt Dir 5 Aufgaben op 3 Server leeft wéi am Playbook hei ënnen gewisen. Wann e Feeler op der Aufgab 3 geschitt (Start MySQL) um Server 2, wäert Ansible ophalen déi verbleiwen Aufgaben um Server 2 auszeféieren a probéiert déi verbleiwen Aufgaben op de Rescht vun de Serveren auszeféieren.
--- - name: Install Software packages hosts: server1, server2, server3 tasks: - name: Install dependencies << some code >> - name: Install MySQL database << some code >> - name: Start MySQL << some code >> - name: Install Nginx << some code >> - name: Start Nginx << some code >>
Wann Dir Konsistenz an der Ausféierung vum Spillbuch wëllt, zum Beispill, stoppen d'Ausféierung vun engem Spillbuch, wann ee vun de Serveren feelt, füügt d'Optioun dobäi.
--- - name: Install Software packages hosts: server1, server2, server3 any_errors_fatal: true tasks:
Op dës Manéier, wann eng Aufgab op engem Server feelt, stoppt Ansible d'Ausféierung vum ganze Playbook op all de Serveren a gitt eraus.
Wann Dir wëllt datt d'Spillbuch d'Feeler ignoréiert a weidergeet fir de verbleiwen Set vun Aufgaben auszeféieren, da benotzt d'Ignore_errors: True Optioun.
--- - name: Install Software packages hosts: server1, server2, server3 tasks: - name: Install dependencies << some code >> ignore_errors: True
Erstellt Playbooks fir Systemer an e spezifizéierte Staat ze konfiguréieren
An dëser Sektioun kucke mir e puer zousätzlech Optiounen déi verfügbar sinn wann Dir e Spillbuch leeft.
Loosst eis mam Check Modus oder Dry Run Optioun ufänken. D'Dréchent Run oder Check Modus Optioun gëtt benotzt wann Dir e Playbook leeft fir ze kontrolléieren ob Feeler begéint ginn an ob et Ännerunge gëtt déi op de verwalteten Hosten gemaach ginn. Et mécht awer keng Ännerungen un de Fernknoten.
Zum Beispill, fir e Spillbuch mam Numm httpd.yml
ze dréchen, deen den Apache Webserver installéiert a start:
# ansible-playbook httpd.yml --check
Déi aner Optioun, déi mir musse kucken, ass d'Optioun --start-at-task
. Dëst gëtt benotzt wann Dir den Numm vun der Aufgab spezifizéiert, op där d'Spillbuch soll ufänken oder ufänken.
Loosst eis e Beispill huelen: D'Spillbuch hei drënner schreift 2 Aufgaben aus: Dat éischt Spill installéiert Apache Webserver an dat zweet installéiert htop Utility.
--- - name: Install httpd hosts: all tasks: yum: name: httpd state: Installed - name: Install htop yum: name: htop state: started
Wann Dir d'Installatioun vum Apache Webserver wëllt iwwersprangen an amplaz htop Utility Run installéiere wëllt:
# ansible-playbook playbook.yml --start-at-task “Install htop”
Schlussendlech kënnt Dir Är Aufgaben oder Spiller markéieren andeems Dir d'Tagsoptioun an Äert Spillbuch bäidréit wéi gewisen. Dëst ass praktesch wann Dir e ganz grousst Spillbuch hutt an Dir wëllt spezifesch Aufgaben aus dem ganze Spillbuch lafen.
--- - name: Install httpd tags: Install and start hosts: all tasks: yum: name: httpd state: Installed tags: Install • service: name: httpd state: started
# ansible-playbook playbook.yml -tags "Install"
Fir d'Tags ofzeginn, benotzt d'--skip-tags
Optiounen wéi gewisen.
# ansible-playbook playbook.yml --skip-tags "Install"
An dësem Thema hu mir Iech duerch déi allgemeng benotzt Moduler an Ansible geholl, wéi Dir stdout aus der Ausféierung vun engem Playbook fir Analyse recuperéiert, Bedingungen am Playbook benotzt a wéi Dir Feeler verwalten déi kënne geschéien wann Dir Aufgaben leeft. Schlussendlech hu mir d'Konfiguratioun vun de Playbooks erstallt a wéi Dir zousätzlech Optiounen benotze kënnt fir ze entscheeden wéi eng Aufgaben ze lafen wann Dir net wëlles de ganze Playbook ze lafen.