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.