đ©âđŹ 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:
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öÀ.
---
- 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:
---
- 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.
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.
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:
Ja toisen:
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: