HyppÀÀ sisÀltöön

đŸ‘©â€đŸ”Ź Curium

TĂ€rpit

Faktat

Ansible suorittaa Play-vaiheita edeltÀvÀn Fact Gathering prosessin, jossa se noutaa muuttujiin arvoja koneelta. Voit tarkastella JSON-muotoista raakamuotoa nÀin:

$ uv run ansible 192.168.64.62 -m ansible.builtin.setup

Playbookeissa nÀitÀ arvoja voi kÀyttÀÀ simppelisti jommalla kummalla alla nÀkyvistÀ tavoista. Huomaa, ettÀ ansible_facts dictionaryn arvot ovat saatavilla myös globaaleiksi muuttujiksi injektoituina. Niiden etuliitteenÀ on ansible_. LisÀksi löytyy nippu magic-muuttujia, kuten inventory_hostname tai group_names. NÀmÀ ovat varattuja sanoja (engl. reserved), jotka eivÀt ole ansible_facts -dictionaryssÀ. Et voi ylikirjoittaa niiden sisÀltöÀ.

playbook_facts.yml
---
- name: Gather facts
  hosts: localhost
  tasks:
    - name: Print processor architecture (injected)
      ansible.builtin.debug:
        msg: "Processor architecture is {{ ansible_processor }}"

    - name: Print processor architecture (from dictionary)
      ansible.builtin.debug:
        msg: "Processor architecture is {{ ansible_facts['processor'] }}"
...

Muuttujat

YllÀ mainitut faktat ovat jo itsesÀÀn muuttujia, mutta voit mÀÀritellÀ niitÀ itse lisÀÀ. Muuttujat voivat olla tyyppiÀ string, boolean, list tai dictionary. Playbookin sisÀllÀ tÀmÀn joko Play- tai Task-tasolla, mutta yhteensÀ eri tapoja mÀÀritellÀ muuttujia on kymmeniÀ, mukaan lukien erilliset vars_files:t, --extra-vars CLI optionit ja Ansible Vault-sÀilön. Jos pysytÀÀn kuitenkin Play- ja Task-tasolla, niin alla nÀkyvÀt kummatkin:

playbook_variables.yml
---
- name: This is my play
  hosts: localhost
  vars:
    play_level1: "aaa"
    play_level2: 123
    play_level3:
        - "Hello"
        - "World!"
  tasks: 
    - name: This is my task
      vars:
        task_level1: "ccc"
        task_level2: 456
        task_level3:
            goodbye: "Goodbye"
            world: "World!"
      debug:
        msg: |
            From task: {{ task_level1 }} and {{ task_level2 }} and {{ task_level3 }}
            From play: {{ play_level1 }} and {{ play_level2 }} and {{ play_level3 }}
...

Huomaat, ettÀ Playbookin ajaminen tuottaa seuraavan tulosteen:

TASK [This is my task] **********************
ok: [localhost] => {
    "msg": "From task: ccc and 456 and {'goodbye': 'Goodbye', 'world': 'World!'}\nFrom play: aaa and 123 and ['Hello', 'World!']\n"
}

Galaxy

Jos teet jotakin, mitÀ tavallisesti tehdÀÀn usein, sille löytyy todennÀköisesti moduuli. HyvÀ esimerkki tÀstÀ on SSH-avaimen lisÀÀminen authorized_keys-tiedostoon. TÀmÀ on niin yleinen toimenpide, ettÀ Ansiblella on sille oma moduuli, jota olisimme voineet kÀyttÀÀ aiemmin. Moduuli on FQDN:tÀÀn ansible.posix.authorized_key. Se asennettaisiin seuraavasti:

$ uv run ansible-galaxy collection install ansible.posix
Starting galaxy collection install process
Process install dependency map
Starting collection install process
Downloading https://galaxy.ansible.com/api/v3/.../artifacts/ansible-posix-2.0.0.tar.gz to /home/me/.ansible/tmp/.../tmp_vdehsjm/ansible-posix-2.0.0-43kkw7ue
Installing 'ansible.posix:2.0.0' to '/home/me/.ansible/collections/ansible_collections/ansible/posix'
ansible.posix:2.0.0 was installed successfully

Jos tÀmÀn kurssin tehtÀvÀt ohjaavat sinua kÀyttÀmÀÀn moduulia jostakin muusta namespace.collection-osoitteesta kuin ansible.builtin, voit asentaa sen samalla tavalla.

$ uv run ansible-galaxy collection install <namespace>.<collection>

TehtÀvÀt

TehtÀvÀ: Nginx

Luo playbook, configs/playbooks/nginx.yml, joka asentaa Nginxin ja kÀynnistÀÀ sen. KÀytÀ vain ja ainoastaan ansible.builtin collectionista löytyviÀ moduuleita. Kenties ansible.builtin.package ja/tai ansible.builtin.apt ratkaisee ongelman? Jos kumpikin toimii, missÀ tilanteessa suosisit toista? MitÀ mahtaa apt:n parametri update_cache tehdÀ, ja löytyykö sille vastaine package-moduulista?

Tarvitset kaksi play:tÀ, jotka voivat olla nimeltÀÀn esimerkiksi:

  • - name: Install nginx
  • - name: Ensure Nginx is running and enabled

Tarkista, ettÀ saat Welcome to nginx! -sivun auki selaimessa kummastakin IP-osoitteesta.

TehtÀvÀ: Nginx idempotenssi

Aja yllÀ oleva skripti uusiksi ja tarkkaile, kuinka se kÀyttÀytyy. Pohdi erityisesti, mikÀ numerot n ja m ovat seuraavassa, ja miten ne eroavat ensimmÀisestÀ ajokerrasta:

PLAY RECAP ******************************************************* ...
192.168.xx.xx              : ok=n    changed=m    unreachable=0    ...
192.168.xx.xx              : ok=n    changed=m    unreachable=0    ...

Varmista, ettÀ osaat jatkossa selittÀÀ, mitÀ idempotentti tarkoittaa Ansiblessa - tai ylipÀÀtÀnsÀ tietojenkÀsittelyn kontekstissa. Apua saat vaikkapa Wikipediasta.

TehtÀvÀ: Nginx poisto

Luo Playbook, configs/playbooks/nginx-remove.yml, joka poistaa edellisen Playbookin asentaman nginx:n. Jos nginx:ÀÀ ei ole asennettuna, skripti ei saa antaa virheilmoitusta! KyllÀ, sen pitÀÀ olla idempotentti.

Sinun tulisi tarvita vain yksi Play, esimerkiksi:

  • - name: Remove Nginx package and its configuration

Tip

KÀytÀ purge-parametria, jotta kaikki asetustiedostot poistetaan.

Tip

Muista, ettÀ voit koska tahansa ottaa multipass shell -komennolla yhteyden koneeseen, jos haluat tutkia sen tilaa manuaalisesti.

TehtÀvÀ: Nginx with Hello World

Tee Playbook, configs/playbooks/nginx-hello.yml, joka asentaa Nginxin ja luo sille yksinkertaisen Hello World -sivun. Jos tutkit aiemman tehvÀtÀn tilassa olevaa palvelinta, huomaat, ettÀ /etc/nginx/sites-available/default tiedostossa mÀÀritellÀÀn default endpoint /var/www/html. TÀmÀ on siis se hakemisto, johon sivut tulisi asentaa.

/etc/nginx/sites-available/default
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;
    # ...
}

TÀmÀ tarkoittaa, ettÀ voimme vaihtaa etusivua siten, ettÀ kirjoitamme index.htm[l] -tiedoston /var/www/html -hakemistoon. PÀÀtetÀÀn samalla, ettÀ hakemiston ei tulisi olla root:root omistuksessa, vaan www-data:www-data. Syy on se, ettÀ jatkossa voimme pyörittÀÀ esimerkiksi staattista sivugeneraattoria kÀyttÀjÀllÀ www-data, jolloin se voi kirjoittaa hakemistoon ja sen tiedostoihin. Hakemiston omistajuuden tulisi olla 755 (drwxr-xr-x) ja tiedoston 644 (-rw-r--r--).

Playbookin pitÀisi siis tehdÀ seuraavat askeleet, joista kaksi ensimmÀistÀ olet jo kerran tehnyt:

  • ✅ Asenna Nginx (tuttu)
  • ✅ KĂ€ynnistĂ€ Nginx (tuttu)
  • 📂 Luo /var/www/html -hakemisto
    • Omistajaksi: www-data
    • Oikeudet: 755
  • 🌐 Luo /var/www/html/index.html -tiedosto
    • Sama omistaja kuin hakemistolla
    • Oikeudet: 644

Saat pÀÀttÀÀ HTML-tiedoston sisÀllön itse, kuten myös tavan, kuinka sen kirjoitat. Kenties haluat kÀyttÀÀ ansible.builtin.copy -moduulia ja mÀÀrittÀÀ sisÀllön YAML:n sisÀllÀ content-kentÀssÀ? Tai ehkÀ haluat kÀyttÀÀ template -moduulia ja noutaa tiedoston sisÀllön erillisestÀ tiedostosta? Valinta on sinun. Tiedoston sisÀllöksi riittÀÀ mikÀ tahansa simppeli HTML-dokumentti. Jos et osaa HTML-kieltÀ, kÀytÀ pohjana vaikkapa W3Schoolsin esimerkkiÀ.

Template?

Jos haluat kÀyttÀÀ templatea, tÀssÀ on vihje:

  - name: Create Index from Template
    ansible.builtin.template:
        src: ../templates/index.html.j2
        dest: TODO
        owner: TODO
        group: TODO
        mode: TODO
    vars:
        site_title: "Hello from Template!"
        computer_name: "{{ ansible_hostname }}"

YllÀ esitelty ansible_hostname on Ansiblen Special Variable, joka pengotaan koneesta Fact Gathering -vaiheessa. NÀin ensimmÀisen koneen ip vastaisi:

Hello World!
I am ansible-1`

Ja toisen:

Hello World!
I am ansible-2`
TehtÀvÀ: Ufw from Galaxy

Luo yksinkertainen Playbook, jossa:

  • Varmistat, ettĂ€ ufw on asennettu
  • LisÀÀ seuraavat sÀÀnnöt:
    • Default policy, joka kieltÀÀ kaiken liikenteen
    • Salli SSH
    • Salli HTTP
  • Varmista, ettĂ€ ufw on enabled

KÀytÀ tehtÀvÀssÀ community.general.ufw moduulia. SelvitÀ, kuinka asennat sen, ja mistÀ sen ohjeet löytyvÀt.

Voit tarkistaa, ettÀ sÀÀnnöt ovat voimassa komennolla:

# Ansible
$ uv run ansible all -a "ufw status" --become

# Multipass (jos suljet SSH-portin vahingossa)
$ multipass exec ansible-1 -- sudo ufw status
$ multipass exec ansible-2 -- sudo ufw status