GNU/Linux >> Belajar Linux >  >> Linux

Seri Ansible RHCE #7:Template Jinja2

Pada tutorial sebelumnya tentang pengambilan keputusan di Ansible, Anda telah mempelajari cara melakukan modifikasi file sederhana dengan menggunakan blockinfile atau sebaris Modul yang memungkinkan.

Dalam tutorial ini, Anda akan mempelajari cara menggunakan Jinja2 mesin templating untuk melakukan modifikasi file yang lebih terlibat dan dinamis.

Anda akan belajar cara mengakses variabel dan fakta di template Jinja2. Selanjutnya, Anda akan mempelajari cara menggunakan pernyataan kondisional dan struktur loop di Jinja2.

Untuk mencoba contoh dalam tutorial ini, Anda harus mengikuti seluruh rangkaian tutorial RHCE Ansible dalam urutan yang benar.

Mengakses Variabel di Jinja2

Ansible akan mencari file template jinja2 di direktori proyek Anda atau di direktori bernama template di bawah direktori proyek Anda.

Mari buat direktori template agar semuanya lebih rapi dan teratur:

[[email protected] plays]$ mkdir templates
[[email protected] plays]$ cd templates/

Sekarang buat template Jinja2 pertama Anda dengan nama index.j2 :

[[email protected] templates]$ cat index.j2 
A message from {{ inventory_hostname }}
{{ webserver_message }}

Perhatikan bahwa nama file template Jinja2 harus diakhiri dengan ekstensi .j2.

inventory_hostname adalah variabel built-in Ansible (alias khusus atau ajaib) lain yang merujuk bahwa host 'saat ini' sedang diulang dalam permainan. pesan_server web adalah variabel yang akan Anda definisikan di buku pedoman Anda.

Sekarang mundur satu langkah ke direktori proyek Anda dan buat check-apache.yml berikut ini :

[[email protected] plays]$ cat check-apache.yml 
---
- name: Check if Apache is Working
  hosts: webservers
  vars:
    webserver_message: "I am running to the finish line."
  tasks:
    - name: Start httpd
      service:
        name: httpd
        state: started

    - name: Create index.html using Jinja2
      template:
        src: index.j2
        dest: /var/www/html/index.html

Perhatikan bahwa httpd paket sudah diinstal di tutorial sebelumnya.

Di playbook ini, pastikan dulu Apache berjalan di tugas pertama Start httpd . Kemudian gunakan templat modul di tugas kedua Create index.html menggunakan Jinja2untuk memproses dan mentransfer index.j2 File template Jinja2 yang Anda buat ke tujuan /var/www/html/index.html .

Silakan dan jalankan buku pedoman:

[[email protected] plays]$ ansible-playbook check-apache.yml 

PLAY [Check if Apache is Working] **********************************************

TASK [Gathering Facts] *********************************************************
ok: [node3]
ok: [node2]

TASK [Start httpd] *************************************************************
ok: [node2]
ok: [node3]

TASK [Create index.html using Jinja2] ******************************************
changed: [node3]
changed: [node2]

PLAY RECAP *********************************************************************
node2                      : ok=3    changed=1    unreachable=0    failed=0    skipped=0    
node3                      : ok=3    changed=1    unreachable=0    failed=0    skipped=0

Semuanya terlihat bagus sejauh ini; mari jalankan perintah Ansible ad-hoc cepat untuk memeriksa konten index.html pada node server web:

[[email protected] plays]$ ansible webservers -m command -a "cat /var/www/html/index.html"
node3 | CHANGED | rc=0 >>
A message from node3
I am running to the finish line.
node2 | CHANGED | rc=0 >>
A message from node2
I am running to the finish line.

Luar biasa! Perhatikan bagaimana Jinja2 dapat mengambil nilai dari inventory_hostname variabel bawaan dan webserver_message variabel dalam buku pedoman Anda.

Anda juga dapat menggunakan ikal perintah untuk melihat apakah Anda mendapat respons dari kedua server web:

[[email protected] plays]$ curl node2.linuxhandbook.local
A message from node2
I am running to the finish line.
[[email protected] plays]$ curl node3.linuxhandbook.local
A message from node3
I am running to the finish line.

Mengakses Fakta di Jinja2

Anda dapat mengakses fakta di templat Jinja2 dengan cara yang sama seperti Anda mengakses fakta dari buku pedoman Anda.

Untuk mendemonstrasikan, ubah ke templat . Anda direktori dan buat info.j2 File Jinja2 dengan isi sebagai berikut:

[[email protected] templates]$ cat info.j2 
Server Information Summary
--------------------------

hostname={{ ansible_facts['hostname'] }}
fqdn={{ ansible_facts['fqdn'] }}
ipaddr={{ ansible_facts['default_ipv4']['address'] }}
distro={{ ansible_facts['distribution'] }}
distro_version={{ ansible_facts['distribution_version'] }}
nameservers={{ ansible_facts['dns']['nameservers'] }}
totalmem={{ ansible_facts['memtotal_mb'] }}
freemem={{ ansible_facts['memfree_mb'] }}

Perhatikan bahwa info.j2 mengakses delapan fakta berbeda. Sekarang kembali ke direktori proyek Anda dan buat server-info.yml berikut ini buku pedoman:

[[email protected] plays]$ cat server-info.yml 
---
- name: Server Information Summary
  hosts: all
  tasks:
   - name: Create server-info.txt using Jinja2
     template:
       src: info.j2
       dest: /tmp/server-info.txt

Perhatikan bahwa Anda membuat /tmp/server-info.txt di semua host berdasarkan info.j2 berkas templat. Silakan dan jalankan buku pedoman:

[[email protected] plays]$ ansible-playbook server-info.yml 

PLAY [Server Information Summary] *******************************************

TASK [Gathering Facts] **********************************
ok: [node4]
ok: [node1]
ok: [node3]
ok: [node2]

TASK [Create server-info.txt using Jinja2] ********
changed: [node4]
changed: [node1]
changed: [node3]
changed: [node2]

PLAY RECAP *************************
node1                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    
node2                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    
node3                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    
node4                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0

Semuanya terlihat bagus! Sekarang mari kita jalankan perintah ad-hoc cepat untuk memeriksa konten /tmp/server-info.txt file di salah satu node:

[[email protected] plays]$ ansible node1 -m command -a "cat /tmp/server-info.txt"
node1 | CHANGED | rc=0 >>
Server Information Summary
--------------------------

hostname=node1
fqdn=node1.linuxhandbook.local
ipaddr=10.0.0.5
distro=CentOS
distro_version=8.2
nameservers=['168.63.129.16']
totalmem=1896
freemem=1087

Seperti yang Anda lihat, Jinja2 dapat mengakses dan memproses semua fakta.

Pernyataan bersyarat di Jinja2

Anda dapat menggunakan jika pernyataan bersyarat di Jinja2 untuk menguji berbagai kondisi dan membandingkan variabel. Ini memungkinkan Anda untuk menentukan alur eksekusi template file sesuai dengan kondisi pengujian Anda.

Untuk mendemonstrasikan, buka templat . Anda direktori dan buat selinux.j2 berikut ini templat:

[[email protected] templates]$ cat selinux.j2 
{% set selinux_status = ansible_facts['selinux']['status'] %}

{% if selinux_status == "enabled" %}
	"SELINUX IS ENABLED"
{% elif selinux_status == "disabled" %}
	"SELINUX IS DISABLED"
{% else %}
	"SELINUX IS NOT AVAILABLE"
{% endif %}

Pernyataan pertama dalam template membuat variabel baru selinux_statusand atur nilainya ke ansible_facts['selinux']['status'] .

Anda kemudian menggunakan selinux_status di jika . Anda kondisi pengujian untuk menentukan apakah SELinux diaktifkan, dinonaktifkan, atau tidak diinstal. Dalam masing-masing dari tiga kasus yang berbeda, Anda menampilkan pesan yang mencerminkan status Selinux.

Perhatikan bagaimana jika pernyataan di Jinja2 meniru if Python Python penyataan; jangan lupa gunakan {% endif %} .

Sekarang kembali ke direktori proyek Anda dan buat berikut selinux-status.yml buku pedoman:

[[email protected] plays]$ cat selinux-status.yml 
---
- name: Check SELinux Status
  hosts: all
  tasks:
    - name: Display SELinux Status
      debug:
        msg: "{{ ansible_facts['selinux']['status'] }}"

    - name: Create selinux.out using Jinja2
      template:
        src: selinux.j2
        dest: /tmp/selinux.out

Silakan dan jalankan buku pedoman:

[[email protected] plays]$ ansible-playbook selinux-status.yml 

PLAY [Check SELinux Status] ****************************************************

TASK [Gathering Facts] *********************************************************
ok: [node4]
ok: [node2]
ok: [node3]
ok: [node1]

TASK [Display SELinux Status] **************************************************
ok: [node1] => {
    "msg": "enabled"
}
ok: [node2] => {
    "msg": "disabled"
}
ok: [node3] => {
    "msg": "enabled"
}
ok: [node4] => {
    "msg": "Missing selinux Python library"
}

TASK [Create selinux.out using Jinja2] *****************************************
changed: [node4]
changed: [node1]
changed: [node3]
changed: [node2]

PLAY RECAP *********************************************************************
node1                      : ok=3    changed=1    unreachable=0    failed=0    skipped=0    
node2                      : ok=3    changed=1    unreachable=0    failed=0    skipped=0    
node3                      : ok=3    changed=1    unreachable=0    failed=0    skipped=0    node4                      : ok=3    changed=1    unreachable=0    failed=0    skipped=0  

Dari keluaran buku pedoman; Anda dapat melihat bahwa SELinux diaktifkan pada kedua node1 dan simpul3 . Saya menonaktifkan SELinux di node2 sebelum menjalankan playbook dan node4 tidak menginstal SELinux karena Ubuntu menggunakan AppArmor, bukan SELinux.

Terakhir, Anda dapat menjalankan perintah ad-hoc berikut untuk memeriksa isi selinux.out di semua host yang dikelola:

[[email protected] plays]$ ansible all -m command -a "cat /tmp/selinux.out"
node4 | CHANGED | rc=0 >>

	"SELINUX IS NOT AVAILABLE"
 
node2 | CHANGED | rc=0 >>

	"SELINUX IS DISABLED"
 
node3 | CHANGED | rc=0 >>

	"SELINUX IS ENABLED"
 
node1 | CHANGED | rc=0 >>

	"SELINUX IS ENABLED"

Perulangan di Jinja2

Anda dapat menggunakan untuk pernyataan di Jinja2 untuk mengulang item dalam daftar, rentang, dll. Misalnya, perulangan for berikut akan mengulangi angka dalam rentang(1,11) dan karenanya akan menampilkan angka dari 1->10:

{% for i in range(1,11) %}
	Number {{ i }}
{% endfor %}

Perhatikan bagaimana for loop di Jinja2 meniru sintaks for loop Python; sekali lagi jangan lupa untuk mengakhiri loop dengan {% endfor %} .

Sekarang mari kita buat contoh lengkap yang menunjukkan kekuatan loop for di Jinja2. Ubah ke direktori template Anda dan buat hosts.j2 berikut ini berkas templat:

[[email protected] templates]$ cat hosts.j2 
{% for host in groups['all'] %}
{{ hostvars[host].ansible_facts.default_ipv4.address }}  {{ hostvars[host].ansible_facts.fqdn }}  {{ hostvars[host].ansible_facts.hostname }}
{% endfor %}

Perhatikan di sini Anda menggunakan variabel khusus (ajaib) bawaan baru hostvars yang pada dasarnya adalah kamus yang berisi semua host dalam inventaris dan variabel yang ditugaskan padanya.

Anda mengulangi semua host di inventaris Anda dan kemudian untuk setiap host; Anda menampilkan nilai dari tiga variabel:

  1. {{ hostvars[host].ansible_facts.default_ipv4.address }}
  2. {{ hostvars[host].ansible_facts.fqdn }}
  3. {{ hostvars[host].ansible_facts.hostname }}

Perhatikan juga bahwa Anda harus memasukkan ketiga variabel tersebut pada baris yang sama berdampingan agar sesuai dengan format /etc/hosts berkas.

Sekarang kembali ke direktori proyek Anda dan buat yang berikut local-dns.yml buku pedoman:

[[email protected] plays]$ cat local-dns.yml 
---
- name: Dynamically Update /etc/hosts File
  hosts: all
  tasks:
    - name: Update /etc/hosts using Jinja2
      template:
        src: hosts.j2
        dest: /etc/hosts

Kemudian lanjutkan dan jalankan buku pedoman:

[[email protected] plays]$ ansible-playbook local-dns.yml 

PLAY [Dynamically Update /etc/hosts File] *********************************************

TASK [Gathering Facts] ***************************
ok: [node4]
ok: [node2]
ok: [node1]
ok: [node3]

TASK [Update /etc/hosts using Jinja2] ***********************************************
changed: [node4]
changed: [node3]
changed: [node1]
changed: [node2]

PLAY RECAP **********************
node1                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    
node2                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    
node3                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    
node4                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0 

Semuanya terlihat bagus sejauh ini; sekarang jalankan perintah ad-hoc berikut untuk memverifikasi bahwa /etc/hosts file diperbarui dengan benar di node1 :

[[email protected] plays]$ ansible node1 -m command -a "cat /etc/hosts"
node1 | CHANGED | rc=0 >>
10.0.0.5  node1.linuxhandbook.local  node1
10.0.0.6  node2.linuxhandbook.local  node2
10.0.0.7  node3.linuxhandbook.local  node3
10.0.0.8  node4.linuxhandbook.local  node4

Sempurna! Terlihat diformat dengan benar seperti yang Anda harapkan.

Saya harap Anda sekarang menyadari kekuatan template Jinja2 di Ansible. Nantikan tutorial berikutnya di mana Anda akan belajar melindungi informasi dan file sensitif menggunakan Ansible Vault.


Linux
  1. RHCE Ansible Series #8:Mengenkripsi Konten Dengan Ansible Vault

  2. RHCE Ansible Series #6:Pengambilan Keputusan di Ansible

  3. RHCE Ansible Series #5:Ansible Loops

  1. RHCE Ansible Series #4:Variabel Ansible, Fakta dan Register

  2. RHCE Ansible Series #11:Mengelola Sistem Dengan Ansible

  3. RHCE Ansible Series #10:Peran Sistem RHEL

  1. Mendekonstruksi buku pedoman Ansible

  2. Seri Ansible RHCE #9:Peran yang Mungkin

  3. Kemungkinan:sudo tanpa kata sandi