Mengembangkan dan Menguji Peran yang Mungkin Menggunakan Molekul dan Podman

Salah satu keuntungan utama dari Red Hat Ansible Automation Platform adalah bahasa otomasinya tidak hanya dapat dibaca oleh beberapa guru, tetapi juga untuk hampir semua orang yang terlibat dalam TI. Oleh karena itu, setiap spesialis dapat berkontribusi pada otomatisasi, yang sangat memfasilitasi interaksi antar tim dan implementasi otomatisasi pada tingkat budaya perusahaan.







Namun, dengan banyaknya orang yang terlibat, sangat penting untuk menguji semuanya secara menyeluruh. Saat mengembangkan konten yang mungkin seperti pedoman, peran, atau koleksi, kami sangat menyarankan agar Anda menguji semuanya di lingkungan pengujian sebelum meluncurkannya ke produksi. Tujuan dari pengujian ini adalah untuk memastikan semuanya bekerja sebagaimana mestinya, untuk menghindari kejutan yang tidak menyenangkan pada sistem "produksi".



Menguji konten otomatisasi adalah hal yang rumit karena memerlukan penerapan infrastruktur pengujian khusus dan menyiapkan kondisi pengujian untuk memastikan bahwa pengujian itu sendiri relevan. Molecule adalah framework pengujian komprehensif yang membantu Anda mengembangkan dan menguji peran Ansible sehingga Anda dapat fokus pada pengembangan otomatisasi tanpa terganggu dengan mengelola infrastruktur pengujian Anda.



Inilah cara mendeklarasikannya dalam dokumentasi proyek:



"Molekul dirancang untuk membantu mengembangkan dan menguji peran yang Mungkin, dan mendorong pendekatan yang menghasilkan peran yang ditulis dengan baik yang ditulis dengan baik, mudah dipahami dan dipertahankan."


Molecule memungkinkan Anda menguji peran di beberapa instance target untuk mengujinya di berbagai sistem operasi dan lingkungan virtualisasi. Tanpanya, untuk setiap kombinasi ini, Anda harus membuat dan memelihara lingkungan pengujian terpisah, menyiapkan koneksi ke instance pengujian, dan mengembalikannya ke keadaan semula sebelum setiap pengujian. Molekul melakukan semuanya untuk Anda, dengan cara yang otomatis dan dapat direproduksi.



Dalam seri dua bagian ini, kami akan menunjukkan kepada Anda cara menggunakan Molekul untuk mengembangkan dan menguji peran yang Mungkin. Di bagian pertama, kita akan melihat penginstalan dan konfigurasi Molekul, di bagian kedua, mengembangkan peran dengannya.



Jika peran adalah bagian dari koleksi, gunakan pendekatan ini untuk mengembangkan dan menguji unit peran tersebut. Di artikel berikutnya, kami akan menunjukkan cara menggunakan Molekul untuk menjalankan pengujian terintegrasi pada koleksi.



Molecule menggunakan driver untuk mengirimkan instance target di berbagai teknologi, termasuk container Linux, mesin virtual, dan penyedia cloud. Secara default, ini hadir dengan tiga driver yang sudah diinstal sebelumnya: Docker dan Podman untuk kontainer, dan driver yang didelegasikan untuk membuat integrasi khusus. Driver untuk penyedia lain disediakan oleh komunitas pengembangan proyek.



Dalam posting ini, kami akan menggunakan driver Podmanuntuk mengembangkan dan menguji peran baru menggunakan container Linux. Podman adalah mesin kontainer ringan untuk Linux, tidak memerlukan daemon yang sedang berjalan, dan memungkinkan kontainer tanpa root untuk dijalankan, yang bagus untuk keamanan.



Menggunakan Molecule dengan driver Podman, kami akan mengembangkan dan menguji peran baru yang memungkinkan dari awal yang menerapkan aplikasi web berdasarkan server web Apache dan harus berjalan di Red Hat Enterprise Linux (RHEL) 8 atau Ubuntu 20.04



Kami menganalisis skenario tipikal ketika peran harus bekerja pada versi sistem operasi yang berbeda. Dengan menggunakan container Podman dan Linux, kita dapat membuat banyak instance untuk menguji peran tersebut pada versi OS yang berbeda. Karena ringannya, container memungkinkan Anda dengan cepat beralih melalui fungsionalitas peran selama pengembangan. Menggunakan container untuk menguji peran dapat diterapkan dalam situasi ini, karena peran tersebut hanya mengonfigurasi instance Linux yang sedang berjalan. Untuk pengujian pada sistem target atau infrastruktur cloud lain, Anda dapat menggunakan driver yang didelegasikan atau driver lain yang disediakan komunitas.



Apa yang kita butuhkan



Untuk contoh dalam artikel ini, Anda memerlukan mesin Linux fisik atau virtual dengan Python 3 dan Podman diinstal (kami menggunakan RHEL 8.2). Podman juga harus dikonfigurasi untuk menjalankan kontainer tanpa root. Instalasi Podman berada di luar cakupan artikel ini, lihat dokumentasi resmi untuk informasi terkait . Menginstal Podman di RHEL 8 juga tercakup dalam dokumentasi container RHEL 8 .



Mari kita mulai



Molekul dirancang sebagai paket Python dan oleh karena itu diinstal melalui pip. Langkah pertama adalah membuat lingkungan Python khusus dan menginstal Molekul kami ke dalamnya:



$ mkdir molecule-blog
$ cd molecule-blog
$ python3 -m venv molecule-venv
$ source molecule-venv/bin/activate
(molecule-venv) $ pip install "molecule[lint]"


Perhatikan bahwa kami menginstal Molecule dengan opsi "lint" sehingga pip juga akan menyediakan alat "yamllint" dan "ansible-lint", yang akan memungkinkan kami menggunakan Molecule untuk menganalisis kode peran secara statis terhadap standar pengkodean yang mungkin.



Penginstalan mengunduh semua dependensi yang diperlukan dari Internet, termasuk Ansible. Sekarang mari kita lihat apa yang telah kami instal:



$ molecule --version
molecule 3.0.4
   ansible==2.9.10 python==3.6


Nah, inilah saatnya menggunakan perintah "molekul" untuk menginisialisasi peran baru yang Mungkin.



Memulai peran baru yang Mungkin



Secara umum, saat mengembangkan peran baru yang mungkin, ini diinisialisasi dengan perintah "peran galaksi yang memungkinkan", tetapi kita akan menggunakan perintah "molekul" sebagai gantinya. Ini akan memberi kita struktur peran yang sama dengan perintah "ansible-galaxy", serta kode dasar untuk menjalankan uji Molekul.



Secara default, Molecule menggunakan driver Docker untuk menjalankan tes. Karena kita ingin menggunakan podman sebagai gantinya, saat menginisialisasi peran dengan perintah "molekul", kita harus menentukan driver yang sesuai menggunakan opsi "--driver-name = podman".



Beralih kembali ke direktori "molecule-blog" dan inisialisasi peran baru "mywebapp" dengan perintah berikut:



$ molecule init role mywebapp --driver-name=podman
--> Initializing new role mywebapp...
Initialized role in /home/ricardo/molecule-blog/mywebapp successfully.


Molekul membuat struktur peran kita di folder "mywebapp". Beralih ke folder ini dan lihat apa yang ada di sana:



$ cd mywebapp
$ tree
.
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── molecule
│   └── default
│       ├── converge.yml
│       ├── INSTALL.rst
│       ├── molecule.yml
│       └── verify.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml
 
10 directories, 12 files


Molekul meletakkan file konfigurasinya di subdirektori "molekul". Saat menginisialisasi peran baru, hanya ada satu skrip yang disebut "default". Nanti, Anda dapat menambahkan skrip Anda di sini untuk menguji berbagai kondisi. Pada artikel ini, kami hanya akan menggunakan script "default".



Mari kita periksa konfigurasi dasar di file "molecule / default / molecule.yml":



$ cat molecule/default/molecule.yml 
---
dependency:
  name: galaxy
driver:
  name: podman
platforms:
  - name: instance
    image: docker.io/pycontribs/centos:7
    pre_build_image: true
provisioner:
  name: ansible
verifier:
  name: ansible


Seperti yang kami minta, file ini menyatakan bahwa driver Podman digunakan untuk pengujian. Di sinilah platform default untuk instance pengujian ditetapkan, melalui gambar container "docker.io/pycontribs/centos:7", yang akan kita ubah nanti.



Tidak seperti Molekul v2, Molekul v3 tidak mendefinisikan linter default. Oleh karena itu, buka file konfigurasi "molecule / default / molecule.yml" dan tambahkan konfigurasi lint di bagian akhir:



$ vi molecule/default/molecule.yml
...
verifier:
  name: ansible
lint: |
  set -e
  yamllint .
  ansible-lint .


Simpan dan tutup file, dan jalankan perintah "molekul lint" dari folder root proyek kita untuk menjalankan linter di seluruh proyek:



$ molecule lint


Kami mendapatkan beberapa kesalahan dalam keluaran, karena file "meta / main.yml" kekurangan sejumlah nilai yang diperlukan. Mari kita perbaiki: edit file "meta / main.yml", tambahkan "author", "company", "license", "platforms" dan hapus baris kosong di akhir. Untuk singkatnya, kami akan membuang komentar, dan kemudian "meta / main.yaml" kami akan terlihat seperti ini:



$ vi meta/main.yml
galaxy_info:
  author: Ricardo Gerardi
  description: Mywebapp role deploys a sample web app 
  company: Red Hat 
 
  license: MIT 
 
  min_ansible_version: 2.9
 
  platforms:
  - name: rhel
    versions:
    - 8 
  - name: ubuntu
    versions:
    - 20.04
 
  galaxy_tags: []
 
dependencies: []


Mari kita jalankan linter pada proyek lagi dan pastikan tidak ada lagi kesalahan.



$ molecule lint
--> Test matrix
    
└── default
    ├── dependency
    └── lint
    
--> Scenario: 'default'
--> Action: 'dependency'
Skipping, missing the requirements file.
Skipping, missing the requirements file.
--> Scenario: 'default'
--> Action: 'lint'
--> Executing: set -e
yamllint .
ansible-lint . 


Jadi, peran kami diinisialisasi dan konfigurasi dasar molekul juga diterapkan. Sekarang mari buat contoh uji.



Buat contoh uji



Secara default, Molekul hanya mendefinisikan satu instance, yang disebut "instance" dan dibuat dari gambar "Centos: 7". Peran kami, jika Anda ingat, harus berfungsi di RHEL 8 dan Ubuntu 20.04. Selain itu, karena menjalankan server web Apache sebagai layanan sistem, kami memerlukan image container dengan "systemd" yang diaktifkan.



Red Hat memiliki Gambar Dasar Universal resmi untuk RHEL 8 dengan "systemd" diaktifkan:



• registry.access.redhat.com/ubi8/ubi-init



Tidak ada gambar "systemd" resmi untuk Ubuntu, jadi kami akan menggunakan gambar yang dikelola oleh Jeff Geerling (Jeff Geerling) dari komunitas Ansible:



• geerlingguy / docker-ubuntu2004-ansible



Untuk mendapatkan instance dengan "systemd", mari edit file konfigurasi "molecule / default / molecule.yml" dengan menghapus instance "centos: 7" darinya dan menambahkan dua contoh baru:



$ vi molecule/default/molecule.yml
---
dependency:
  name: galaxy
driver:
  name: podman
platforms:
  - name: rhel8
    image: registry.access.redhat.com/ubi8/ubi-init
    tmpfs:
      - /run
      - /tmp
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
    capabilities:
      - SYS_ADMIN
    command: "/usr/sbin/init"
    pre_build_image: true
  - name: ubuntu
    image: geerlingguy/docker-ubuntu2004-ansible
    tmpfs:
      - /run
      - /tmp
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
    capabilities:
      - SYS_ADMIN
    command: "/lib/systemd/systemd"
    pre_build_image: true
provisioner:
  name: ansible
verifier:
  name: ansible
lint: |
  set -e
  yamllint .
  ansible-lint .


Dengan parameter ini kami memasang untuk setiap instance sistem file sementara "/ run" dan "/ tmp", serta volume "cgroup". Selain itu, kami menyertakan fungsi "SYS_ADMIN", yang diperlukan untuk menjalankan kontainer dengan Systemd.



Jika Anda melakukan semuanya dengan cerdas dan menjalankan contoh ini pada mesin RHEL 8 dengan SELinux diaktifkan, Anda juga perlu menyetel parameter boolean "container_manage_cgroup" ke true sehingga container dapat menjalankan Systemd (lihat dokumentasi RHEL 8 untuk detail selengkapnya ):



sudo setsebool -P container_manage_cgroup 1


Molecule menggunakan Ansible Playbook untuk menginisialisasi instance ini. Mari kita ubah dan tambahkan parameter inisialisasi dengan mengubah kamus "provisioner" dalam file konfigurasi "molecule / default / molecule.yml".



Ia menerima opsi konfigurasi yang sama seperti yang ditentukan dalam file konfigurasi "ansible.cfg". Misalnya, mari perbarui konfigurasi penyedia dengan menambahkan bagian "default". Setel penerjemah Python ke "auto_silent" untuk menonaktifkan peringatan. Mari kita sertakan plugin callback "profile_tasks", "timer" dan "yaml" sehingga informasi profiler disertakan dalam keluaran Playbook. Terakhir, tambahkan bagian "ssh_connection" dan nonaktifkan pipelining SSH karena tidak berfungsi dengan Podman:



provisioner:
  name: ansible
  config_options:
    defaults:
      interpreter_python: auto_silent
      callback_whitelist: profile_tasks, timer, yaml
    ssh_connection:
      pipelining: false


Mari simpan file ini dan buat instance dengan perintah "pembuatan molekul" dari direktori root peran kita:



$ molecule create


Molekul akan menjalankan buku pedoman init dan membuat kedua contoh kami. Mari kita periksa dengan perintah "daftar molekul":



$ molecule list
Instance Name    Driver Name    Provisioner Name    Scenario Name    Created    Converged
---------------  -------------  ------------------  ---------------  ---------  -----------
rhel8            podman         ansible             default          true       false
ubuntu           podman         ansible             default          true       false


Mari kita juga memeriksa apakah kedua kontainer berjalan di Podman:



$ podman ps
CONTAINER ID  IMAGE                                                   COMMAND               CREATED             STATUS                 PORTS  NAMES
2e2f14eaa37b  docker.io/geerlingguy/docker-ubuntu2004-ansible:latest  /lib/systemd/syst...  About a minute ago  Up About a minute ago         ubuntu
2ce0a0ea8692  registry.access.redhat.com/ubi8/ubi-init:latest         /usr/sbin/init        About a minute ago  Up About a minute ago         rhel8


Saat mengembangkan peran, Molekul menggunakan instance yang sedang berjalan untuk mengujinya. Jika pengujian gagal atau beberapa kesalahan menyebabkan perubahan yang tidak dapat diubah, karena itu semuanya harus dimulai dari awal, Anda dapat menghentikan instance ini kapan saja dengan perintah "penghancuran molekul" dan membuatnya lagi dengan perintah "pembuatan molekul".



Kesimpulan



Jika Anda tidak sabar dan ingin menggali lebih dalam tentang topik pengembangan dan pengujian peran, atau topik otomatisasi yang mungkin, maka kami merekomendasikan sumber daya berikut:






All Articles