Hoe te werken met Ansible bij gebruik van andere voorwaarden

Als u Ansible-taken moet uitvoeren op basis van verschillende voorwaarden, dan staat u voor een traktatie. Ansible when en andere voorwaarden stellen u in staat om voorwaarden te evalueren, zoals op basis van het besturingssysteem, of als een taak afhankelijk is van de vorige taak.

In deze zelfstudie leert u hoe u kunt werken met Ansible when en andere voorwaarden, zodat u taken kunt uitvoeren zonder dingen te verpesten.

Laten we eraan beginnen!

Vereisten

Deze zelfstudie omvat praktische voorbeelden. Als u wilt meedoen, zorg er dan voor dat u het volgende hebt ingesteld:

  • Een Ansible-controllerhost – Deze zelfstudie maakt gebruik van Ansible v2.9.24 gehost op een Ubuntu 18.04.5 LTS-machine.
  • A remote computer to run commands.
  • U heeft een inventarisbestand nodig en één of meer hosts al geconfigureerd om Ansible-opdrachten en -playbooks uit te voeren. De zelfstudie zal een inventarisgroep genaamd web gebruiken.

Werken met Ansible when met Meerdere Taken in Playbook

Het hebben van meerdere taken in een playbook kan vervelend zijn als ze allemaal worden uitgevoerd zonder specifieke voorwaarden. Laten we deze tutorial beginnen door Ansible when-voorwaarden te definiëren in het Ansible playbook met meerdere taken.

1. Open een terminal op de Ansible-controllerhost.

2. Voer de onderstaande commando’s uit om een map te maken en geef deze een naam naar keuze in uw thuismap, en navigeer naar die map.

Voor dit voorbeeld wordt de map genaamd ansible_when_condition_demo. Deze map bevat het playbook dat u zult gebruiken om de when-voorwaarde binnen de Ansible-taak aan te roepen.

# Maak een map genaamd ~/ansible_when_condition_demo
mkdir ~/ansible_when_condition_demo
# Wijzig de werkmap naar ~/ansible_when_condition_demo
cd ~/ansible_when_condition_demo

3. In uw voorkeurscode-editor, maak een YAML-bestand aan in de ~/ansible_when_condition_demo map. In dit voorbeeld heet het bestand my_playbook.yml. Kopieer en plak de YAML playbook-inhoud hieronder naar het my_playbook.yml bestand.

In beide taken hieronder (Task-1 en Task-2), controleren de when-voorwaarden welk besturingssysteem elke externe host heeft. Het resultaat wordt vervolgens doorgegeven aan de ansible_os_family placeholder-variabele voor elke taak.

Als de waarde van de ansible_os_family-placeholders overeenkomt met RedHat of Debian, voert Ansible een van de taken uit om Apache te installeren.

---
- name: Ansible tasks to work on Ansible When
# Definieert de externe server waar Ansible zal worden uitgevoerd
  hosts: web
  remote_user: ubuntu # Gebruikt externe host als ubuntu
  become: true # Voert de taken uit als een verhoogde gebruiker (sudo)
  tasks:

# (Taak-1) Controleert of ansible_os_family gelijk is aan "RedHat" en installeert vervolgens Apache op de externe node
    - name: Install Apache on CentOS  Server
      yum: name=httpd  state=present
      become: yes
      when: ansible_os_family == "RedHat"

# (Taak-2) Controleert of ansible_os_family gelijk is aan "Debian" en installeert vervolgens Apache op de externe node
    - name: Install Apache on Ubuntu Server
      apt:name=apache2 state=present
      become: yes
      when: ansible_os_family == "Debian"

4. Voer nu het ansible-playbook commando hieronder uit om de taken uit te voeren die zijn gedefinieerd in het playbook (my_playbook.yml) op de externe host, gedefinieerd in je bestaande inventarisbestand.

ansible-playbook my_playbook.yml 

In de onderstaande schermafbeelding kun je zien dat:

  • De eerste TAAK gaf een OK-status, wat aangeeft dat de taak geen wijzigingen vereist.
  • De tweede TAAK gaf de status overslaan. Als de voorwaarde niet is vervuld, wordt de taak overgeslagen.
  • De derde TAAK gaf een gewijzigd-status, wat aangeeft dat de externe host niet in de juiste staat was (d.w.z., Apache is niet aanwezig) en is aangepast om Apache te installeren.
Invoking the ansible-playbook using ansible-playbook command

5. Open een SSH-sessie naar de externe host, die het doelwit was van het Ansible playbook, met behulp van je favoriete SSH-client om te verifiëren dat Apache is geïnstalleerd en actief is.

6. Voer tot slot het service-commando hieronder uit om te controleren of Apache is geïnstalleerd (status apache2) op de externe host.

service status apache2

Zoals je hieronder kunt zien, heb je de Apache-service op de externe machine geïnstalleerd.

Verifying the Apache service on the remote node

Werken met Ansible when en loops

Je hebt eerder Ansible-taken uitgevoerd volgens een Ansible when voor een specifieke parameter zoals ansible_os_family. Maar misschien moet je een conditie controleren met meerdere parameters gedefinieerd in een lijst. Zo ja, probeer dan een loop toe te voegen in een taak.

Open het my_playbook.yml bestand dat je eerder hebt aangemaakt (stap drie onder “Werken met Ansible when met meerdere taken in playbook”). Vervang de inhoud van het my_playbook.yml bestand met de onderstaande code.

De taak in de onderstaande code (Taak-1) voert een loop uit waarbij de when-voorwaarde controleert of de itemwaarde groter is dan vijf en het resultaat teruggeeft.

---
- name: Ansible tasks to work on Ansible When
# Definiëren van de externe server waar Ansible zal draaien
  hosts: web
  remote_user: ubuntu   # Gebruik van Externe host als ubuntu
  become: true
  tasks:
  # (Taak -1) Controleren of de itemwaarde groter is dan 5
    - name: Run with items greater than 5
      ansible.builtin.command: echo {{ item }}
      loop: [ 0, 2, 4, 6, 8, 10 ]
      when: item > 5*

Voer nu het onderstaande commando uit om het playbook uit te voeren zoals je eerder hebt gedaan.

 ansible-playbook my_playbook.yml

Hieronder zie je de taak teruggegeven overslaan status voor wanneer de voorwaarde onwaar is en veranderd status voor wanneer de voorwaarde waar is.

Checking the when condition for multiple parameters

Werken met Ansible when en Ansible feiten

Misschien wil je meerdere voorwaarden toevoegen om een taak uit te voeren. Zo ja, leer dan hoe je Ansible feiten kunt gebruiken binnen de when-voorwaarde. Ansible feiten stellen je in staat om een voorwaardelijke verklaring toe te voegen om taken uit te voeren op basis van verzamelde feiten, zoals je besturingssysteem, IP-adressen, gekoppelde bestandssystemen, en meer.

Vervang de inhoud van het my_playbook.yml bestand met de onderstaande code.

In de onderstaande code voeren zowel taken (Taak-1 en Taak-2) alleen uit (systeem afsluiten) wanneer een van de onderstaande voorwaarden waar is:

  • Zowel de distributie als distributie_major_versie hebben een waarde van true geretourneerd.
  • De os_familie waarde is gelijk aan CentOS.
---
- name: Ansible When Single task example
  hosts: web
  remote_user: ubuntu
  become: true
  tasks:
# (Taak-1): Om de externe node af te sluiten als de distributie CentOS is met een major versie 6 
    - name: Shut down CentOS 6 systems
      ansible.builtin.command: /sbin/shutdown -t now
      when:
        - ansible_facts['distribution'] == "CentOS"
        - ansible_facts['distribution_major_version'] == "6"
# (Taak-2): Om de externe node af te sluiten als os_familie CentOS is. 
    - name: Shut down CentOS flavored systems
      ansible.builtin.command: /sbin/shutdown -t now
      when: ansible_facts['os_family'] == "CentOS"

Voer het playbook uit zoals je eerder deed met het onderstaande commando.

ansible-playbook my_playbook.yml

Merk op dat beide taken hieronder de overslaan status tonen omdat je in Ubuntu bent. De taak wordt alleen uitgevoerd als je in CentOS bent.

Executing the ansible-playbook with Ansible facts in Ansible when

Werken met Ansible when Gebaseerd op Geregistreerde Waarden

Soms wilt u een taak uitvoeren of overslaan op basis van het resultaat van een eerdere taak in een playbook. Bijvoorbeeld, u wilt mogelijk een service configureren na een eerdere upgrade-taak. In dat geval gebruikt u een geregistreerde variabele. Een geregistreerde variabele stelt u in staat om het resultaat van de eerdere taak te registreren als een variabele en deze te gebruiken voor de volgende taak als invoer.

1. Maak een lege map met de naam /home/ubuntu/hello.

2. Vervang de inhoud van het bestand my_playbook.yml door de onderstaande code, die het volgende uitvoert:

De eerste taak (Taak-1) toont de inhoud (bestanden en submappen) van de /etc/hosts-map in het geheugen en slaat dat resultaat op in de variabele contents1 via het register-commando.

De tweede taak (Taak-2) toont de inhoud (momenteel leeg) van de /home/ubuntu/hello-map in het geheugen en slaat die lijst op in de variabele contents2.

De derde taak (Taak-3) controleert en toont een bericht “Map is leeg” als het geregistreerde resultaat voor de variabele contents1 of contents2 leeg is.

De eigenschap stdout van de variabele contents1 en contents2 is de opgeslagen shell-uitvoer van het resultaat van het uitvoeren van de taakopdrachten.

---
- name: Ansible When Single task example
  hosts: web
  remote_user: ubuntu
  become: true
  tasks:
# (Taak-1): De inhoud van de directory in /etc/hosts weergeven
      - name: List contents of directory and Store in content1
        ansible.builtin.command: ls /etc/hosts
        register: contents1
# (Taak-2): De inhoud van de directory in /home/ubuntu/hello weergeven
      - name: List contents of directory and Store in content2
        ansible.builtin.command: ls /home/ubuntu/hello
        register: contents2
# (Taak-3): Toon "Directory is empty" als een van de directories leeg is
# /etc/hosts of /home/ubuntu/hello is een lege directory
      - name: Check contents for emptiness for content1 or content2
        ansible.builtin.debug:
          msg: "Directory is empty"
        when: contents1.stdout == "" or contents2.stdout == ""

3. Voer ten slotte het playbook uit met het ansible-playbook-commando hieronder.

ansible-playbook my_playbook.yml

Zoals hieronder getoond, aangezien het geregistreerde resultaat voor de variabele contents2 leeg is, geeft de derde taak het bericht Directory is empty terug.

Running the Ansible playbook for Ansible when based on registered values

Werken met Ansible when in Ansible Roles

In dit laatste voorbeeld leer je hoe Ansible when werkt binnen Ansible roles. Ansible roles stellen je in staat om standaardconfiguraties opnieuw te gebruiken en zorgen voor een snellere implementatie. Lees verder om te begrijpen hoe een taak Ansible roles oproept alleen als de Ansible when-voorwaarde waar is.

1. Voer de onderstaande commando’s uit om een map met de naam ~/ansible_role_when_demo aan te maken in je thuismap en verander naar die map als de werkmap. De map ~/ansible_role_when_demo zal de demobestanden van dit voorbeeld bevatten.

# Maak een map met de naam ~/ansible_role_when_demo aan in je thuismap
mkdir ~/ansible_role_when_demo
# Verander naar de map ~/ansible_role_when_demo
cd ~/ansible_role_when_demo

2. Voer vervolgens de onderstaande commando’s uit om een map ~/ansible_role_when_demo/roles en ~/ansible_role_when_demo/roles/java/tasks aan te maken.

Hieronder staat wat elke map zal bevatten:

  • De map ~/ansible_role_when_demo/roles zal de rol bevatten die je moet implementeren.

Standaard zoekt Ansible naar rollen op twee locaties: in een map genaamd roles/ binnen de map waar het afspeelboek zich bevindt, of in /etc/ansible/roles. Als je rollen op verschillende paden wilt opslaan, declareer dan de paden met behulp van de parameter - role: in het afspeelboek.

  • De map ~/ansible_role_when_demo/roles/java/tasks zal een main.yml bestand bevatten dat je nodig hebt om een rol te implementeren.
# Maak een map genaamd rollen binnen de ~/ansible_role_when_demo map
mkdir -p roles
# Verander de werkmap naar de ~/ansible_role_when_demo/rollen map
cd roles 
# Maak de bovenliggende (-p) map genaamd java en een submap genaamd taken
mkdir -p java/tasks

Maak nu een bestand met de naam main.yml in de ~/ansible_role_when_demo/rollen/java/taken map, kopieer en plak vervolgens de onderstaande playbook code naar het main.yml bestand.

De playbook hieronder installeert Java op de externe node waarop het wordt uitgevoerd met behulp van de apt-module.

---
# Het installeren van Java (Open JDK) 
- name: Install Java 1.8
  apt: name=openjdk-8-jdk

4. Maak een ander YAML-bestand met een naam naar keuze en kopieer/plak de onderstaande code. Voor dit voorbeeld is het bestand genaamd ~/ansible_role_when_demo/java-setup.yml.

De onderstaande code implementeert de Ansible rol (java) naar de externe gebruiker (ubuntu) die alleen beheerdersrechten heeft wanneer de externe gebruiker op Debian OS is.

- name: Java Installation playbook
# Definiëren van de externe server waar het pakket zal worden geïmplementeerd 
  hosts: myserver
  remote_user: ubuntu   # Gebruik externe gebruiker als ubuntu
  become: true
  tasks:  
  roles:
     - role: java
       # Voer de taak alleen uit als de externe gebruiker op een Debian OS is.
       when: ansible_facts['os_family'] == 'Debian'

5. Voer het tree-commando uit om te controleren of alle vereiste mappen en bestanden aanwezig zijn in de ~/ansible_role_when_demo-directory.

Verifying all of the required folders in the ~/ansible_role_when_demo directory

6. Voer ten slotte het playbook uit met het ansible-playbook-commando hieronder. ansible-playbook java-setup.yml

ansible-playbook java-setup.yml

Hieronder heeft de taak een gewijzigde-status geretourneerd, wat aangeeft dat Java succesvol is geïnstalleerd, aangezien de externe node op een Debian OS staat. Voer het Ansible-playbook uit met Ansible when en Ansible-roles

Running the Ansible playbook using Ansible when with Ansible roles

Conclusie

In deze handleiding heb je verschillende manieren geleerd om Ansible when en andere voorwaarden te gebruiken. Je hebt ook geleerd hoe je Ansible when-voorwaarden kunt toepassen, van basis taken met behulp van Ansible facts tot het implementeren van Ansible roles.

Hoe zou je deze nieuwe kennis verder uitbreiden? Misschien tijd besparen bij het configureren van meerdere servers met Ansible-templates terwijl je Ansible when-voorwaarden toepast?

Source:
https://adamtheautomator.com/ansible-when/