{"id":36953,"date":"2025-12-25T11:40:49","date_gmt":"2025-12-25T08:40:49","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=36953"},"modified":"2025-12-25T11:40:49","modified_gmt":"2025-12-25T08:40:49","slug":"ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/","title":{"rendered":"Ansible Rollerini Molecule ile Ubuntu 16.04 \u00dczerinde Test Etme"},"content":{"rendered":"<p><body><\/p>\n<h2>Ansible Rollerini Molecule ile Ubuntu 16.04 \u00dczerinde Test Etme<\/h2>\n<p>Ansible, altyap\u0131 otomasyonu i\u00e7in g\u00fc\u00e7l\u00fc ve pop\u00fcler bir ara\u00e7t\u0131r. Rolleri, g\u00f6revleri ve \u015fablonlar\u0131 kullanarak sunucular\u0131 yap\u0131land\u0131rmak, uygulamalar\u0131 da\u011f\u0131tmak ve sistemleri y\u00f6netmek i\u00e7in kullan\u0131l\u0131r. Ancak, bir Ansible rol\u00fc yazmak sadece ba\u015flang\u0131\u00e7t\u0131r. Bir rol\u00fcn beklendi\u011fi gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan, farkl\u0131 senaryolarda do\u011fru davrand\u0131\u011f\u0131ndan ve en \u00f6nemlisi, sistemde istenmeyen yan etkiler yaratmad\u0131\u011f\u0131ndan emin olmak i\u00e7in kapsaml\u0131 bir \u015fekilde test edilmesi hayati \u00f6nem ta\u015f\u0131r. \u0130\u015fte bu noktada Molecule devreye girer. Bu makalede, Ansible rollerinizi Molecule kullanarak Ubuntu 16.04 \u00fczerinde nas\u0131l test edece\u011finizi detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>Giri\u015f: Neden Ansible Rollerini Test Etmeliyiz?<\/h3>\n<p>Ansible rolleri, karma\u015f\u0131k altyap\u0131 otomasyonunun temel yap\u0131 ta\u015flar\u0131d\u0131r. Bir rol, bir uygulaman\u0131n kurulumu, bir servisin yap\u0131land\u0131r\u0131lmas\u0131 veya bir kullan\u0131c\u0131n\u0131n olu\u015fturulmas\u0131 gibi belirli bir i\u015flevi yerine getiren bir dizi g\u00f6rev, \u015fablon ve de\u011fi\u015fken i\u00e7erir. Bu rollerin g\u00fcvenilirli\u011fi, t\u00fcm altyap\u0131n\u0131z\u0131n istikrar\u0131 i\u00e7in kritik \u00f6neme sahiptir. Test etmemek, potansiyel olarak \u00fcretim ortamlar\u0131nda b\u00fcy\u00fck sorunlara yol a\u00e7abilecek hatal\u0131 yap\u0131land\u0131rmalara, g\u00fcvenlik a\u00e7\u0131klar\u0131na veya performans d\u00fc\u015f\u00fc\u015flerine neden olabilir.<\/p>\n<p>Test etmenin ba\u015fl\u0131ca faydalar\u0131 \u015funlard\u0131r:<\/p>\n<p>*   <strong>G\u00fcvenilirlik:<\/strong> Rollerin beklendi\u011fi gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak.<br \/>\n*   <strong>Idempotence (Tekrar \u00c7al\u0131\u015ft\u0131rma Yetene\u011fi):<\/strong> Bir rol\u00fcn birden fazla kez \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda sistemin durumunu de\u011fi\u015ftirmemesi, sadece ilk \u00e7al\u0131\u015ft\u0131rmada gerekli de\u011fi\u015fiklikleri yapmas\u0131. Bu, otomasyonun temel prensiplerinden biridir.<br \/>\n*   <strong>Hata Yakalama:<\/strong> Potansiyel hatalar\u0131 erken a\u015famada tespit etmek ve d\u00fczeltmek.<br \/>\n*   <strong>S\u00fcrd\u00fcr\u00fclebilirlik:<\/strong> Rollerin zaman i\u00e7inde, ba\u011f\u0131ml\u0131l\u0131klar veya sistem de\u011fi\u015fiklikleri nedeniyle bozulmamas\u0131n\u0131 sa\u011flamak.<br \/>\n*   <strong>Dok\u00fcmantasyon:<\/strong> Testler, rol\u00fcn ne yapmas\u0131 gerekti\u011fine dair canl\u0131 bir dok\u00fcmantasyon g\u00f6revi g\u00f6r\u00fcr.<br \/>\n*   <strong>S\u00fcrekli Entegrasyon (CI):<\/strong> Otomatik testler, CI\/CD i\u015flem hatlar\u0131n\u0131n ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r ve kod de\u011fi\u015fikliklerinin an\u0131nda do\u011frulanmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Neden Molecule?<\/h3>\n<p>Molecule, Ansible rollerini test etmek i\u00e7in \u00f6zel olarak tasarlanm\u0131\u015f bir otomasyon \u00e7er\u00e7evesidir. Geli\u015ftiricilere, rolleri izole edilmi\u015f ortamlarda (Docker konteynerleri, Vagrant VM&#8217;leri, bulut \u00f6rnekleri vb.) \u00e7al\u0131\u015ft\u0131rma, do\u011frulama ve yok etme yetene\u011fi sunar. Molecule&#8217;\u00fc di\u011fer genel test yakla\u015f\u0131mlar\u0131ndan ay\u0131ran temel \u00f6zellikler \u015funlard\u0131r:<\/p>\n<p>*   <strong>\u00c7oklu Driver Deste\u011fi:<\/strong> Docker, Vagrant, OpenStack, EC2, Azure, GCE gibi farkl\u0131 sanalla\u015ft\u0131rma ve bulut platformlar\u0131n\u0131 destekler. Bu sayede rolleri farkl\u0131 ortamlarda test edebilirsiniz. Bu makalede Ubuntu 16.04 imaj\u0131 ile Docker driver&#8217;\u0131n\u0131 kullanaca\u011f\u0131z.<br \/>\n*   <strong>Entegre Test Ak\u0131\u015f\u0131:<\/strong> Bir rol\u00fcn olu\u015fturulmas\u0131ndan test edilmesine ve yok edilmesine kadar t\u00fcm ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc y\u00f6netir. <code>create<\/code>, <code>converge<\/code>, <code>verify<\/code>, <code>destroy<\/code> gibi komutlarla belirli ad\u0131mlar\u0131 kontrol edebilirsiniz.<br \/>\n*   <strong>\u00c7oklu Do\u011frulay\u0131c\u0131 Deste\u011fi:<\/strong> Testinfra, InSpec, Goss gibi farkl\u0131 test \u00e7er\u00e7evelerini kullanarak rol\u00fcn \u00e7\u0131kt\u0131s\u0131n\u0131 do\u011frulaman\u0131za olanak tan\u0131r. Testinfra, Python tabanl\u0131 oldu\u011fu i\u00e7in Ansible kullan\u0131c\u0131lar\u0131 aras\u0131nda olduk\u00e7a pop\u00fclerdir.<br \/>\n*   <strong>Senaryo Y\u00f6netimi:<\/strong> Farkl\u0131 test senaryolar\u0131 olu\u015fturarak bir rol\u00fcn \u00e7e\u015fitli durumlar\u0131n\u0131 (\u00f6rne\u011fin, ilk kurulum, g\u00fcncelleme, hata durumu) test etmenizi sa\u011flar.<br \/>\n*   <strong>Idempotence Kontrol\u00fc:<\/strong> <code>molecule check<\/code> komutu ile rol\u00fcn tekrar \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda sistemde herhangi bir de\u011fi\u015fiklik yapmad\u0131\u011f\u0131n\u0131 otomatik olarak do\u011frular. Bu, Ansible otomasyonunun kalbinde yer alan \u00f6nemli bir \u00f6zelliktir.<br \/>\n*   <strong>Linting:<\/strong> YAML ve Python kodlar\u0131n\u0131z i\u00e7in linting ara\u00e7lar\u0131n\u0131 entegre ederek kod kalitesini art\u0131r\u0131r.<\/p>\n<h3>\u00d6n Gereksinimler<\/h3>\n<p>Molecule ile Ansible rol testlerine ba\u015flamadan \u00f6nce sisteminizde baz\u0131 temel ara\u00e7lar\u0131n kurulu olmas\u0131 gerekir. Bu makalede Ubuntu 16.04 \u00fczerinde test edece\u011fimiz i\u00e7in, test ortam\u0131 olarak Docker konteynerlerini kullanaca\u011f\u0131z. Dolay\u0131s\u0131yla, ana makinenizde (geli\u015ftirme ortam\u0131n\u0131zda) Docker&#8217;\u0131n kurulu olmas\u0131 \u00f6nemlidir.<\/p>\n<p>1.  <strong>Ubuntu 16.04 \u0130\u015fletim Sistemi:<\/strong> Geli\u015ftirme ortam\u0131n\u0131z olarak Ubuntu 16.04 kullan\u0131yorsan\u0131z, ad\u0131mlar do\u011frudan uygulanabilir. Di\u011fer Linux da\u011f\u0131t\u0131mlar\u0131nda veya macOS \u00fczerinde de benzer ad\u0131mlarla ilerleyebilirsiniz.<br \/>\n2.  <strong>Python 3 ve pip:<\/strong> Molecule ve Testinfra Python tabanl\u0131 ara\u00e7lard\u0131r.<\/p>\n<pre><code class=\"language-bash\">sudo apt update\n    sudo apt install python3 python3-pip -y<\/code><\/pre>\n<p>3.  <strong>Docker:<\/strong> Test ortam\u0131 olarak Docker konteynerlerini kullanaca\u011f\u0131m\u0131z i\u00e7in Docker motorunun kurulu ve \u00e7al\u0131\u015f\u0131r durumda olmas\u0131 gerekir.<\/p>\n<pre><code class=\"language-bash\">sudo apt install apt-transport-https ca-certificates curl software-properties-common -y\n    curl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo apt-key add -\n    sudo add-apt-repository \"deb [arch=amd64] https:\/\/download.docker.com\/linux\/ubuntu xenial stable\"\n    sudo apt update\n    sudo apt install docker-ce -y\n    sudo usermod -aG docker $USER # Kullan\u0131c\u0131n\u0131z\u0131 docker grubuna ekleyin\n    newgrp docker # De\u011fi\u015fikliklerin hemen etkili olmas\u0131 i\u00e7in<\/code><\/pre>\n<p>    Docker&#8217;\u0131n do\u011fru kuruldu\u011fundan emin olmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">docker run hello-world<\/code><\/pre>\n<p>4.  <strong>Ansible:<\/strong> Molecule, Ansible&#8217;\u0131 arka planda kulland\u0131\u011f\u0131 i\u00e7in Ansible&#8217;\u0131n da kurulu olmas\u0131 gerekir.<\/p>\n<pre><code class=\"language-bash\">sudo pip3 install ansible<\/code><\/pre>\n<h3>Molecule Kurulumu<\/h3>\n<p>\u00d6n gereksinimleri tamamlad\u0131ktan sonra Molecule&#8217;\u00fc ve gerekli driver ile verifier eklentilerini kurabiliriz. Docker driver&#8217;\u0131 ve Testinfra verifier&#8217;\u0131 kullanaca\u011f\u0131m\u0131z i\u00e7in bunlar\u0131 da kurmal\u0131y\u0131z.<\/p>\n<pre><code class=\"language-bash\">sudo pip3 install molecule docker testinfra<\/code><\/pre>\n<p>Bu komut, Molecule&#8217;\u00fcn kendisini, Docker driver&#8217;\u0131n\u0131 ve Testinfra verifier&#8217;\u0131n\u0131 kuracakt\u0131r. Kurulumun ba\u015far\u0131l\u0131 oldu\u011funu do\u011frulamak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">molecule --version<\/code><\/pre>\n<p>\u00c7\u0131kt\u0131 olarak Molecule s\u00fcr\u00fcm numaras\u0131n\u0131 g\u00f6rmelisiniz.<\/p>\n<h3>Molecule Temel Kavramlar\u0131<\/h3>\n<p>Molecule&#8217;\u00fcn \u00e7al\u0131\u015fma mant\u0131\u011f\u0131n\u0131 anlamak i\u00e7in baz\u0131 temel kavramlar\u0131 bilmek \u00f6nemlidir:<\/p>\n<p>*   <strong>Driver (S\u00fcr\u00fcc\u00fc):<\/strong> Test ortam\u0131n\u0131 sa\u011flayan mekanizmad\u0131r. Docker, Vagrant, OpenStack, EC2 gibi se\u00e7enekler mevcuttur. Biz bu makalede <code>docker<\/code> driver&#8217;\u0131n\u0131 kullanaca\u011f\u0131z. Bu driver, test i\u00e7in hafif ve h\u0131zl\u0131 konteynerler olu\u015fturur.<br \/>\n*   <strong>Provisioner (Sa\u011flay\u0131c\u0131):<\/strong> Rol\u00fc test ortam\u0131nda \u00e7al\u0131\u015ft\u0131ran ara\u00e7t\u0131r. Varsay\u0131lan olarak ve neredeyse her zaman <code>ansible<\/code> kullan\u0131l\u0131r. Molecule, Ansible&#8217;\u0131 kullanarak rol\u00fcn\u00fcz\u00fc test konteynerine\/VM&#8217;ine uygular.<br \/>\n*   <strong>Verifier (Do\u011frulay\u0131c\u0131):<\/strong> Rol\u00fcn ba\u015far\u0131yla uyguland\u0131\u011f\u0131n\u0131 ve sistemin beklenen durumda oldu\u011funu kontrol eden test \u00e7er\u00e7evesidir. <code>testinfra<\/code>, <code>inspec<\/code> ve <code>goss<\/code> gibi se\u00e7enekler bulunur. <code>testinfra<\/code>, Python tabanl\u0131 ve kullan\u0131m\u0131 kolay oldu\u011fu i\u00e7in s\u0131k\u00e7a tercih edilir.<br \/>\n*   <strong>Scenario (Senaryo):<\/strong> Bir rol\u00fcn farkl\u0131 test durumlar\u0131n\u0131 tan\u0131mlamak i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, bir rol\u00fcn ilk kurulumunu test eden bir senaryo, daha sonra rol\u00fcn g\u00fcncellenmesini test eden ba\u015fka bir senaryo veya bir hata durumunu sim\u00fcle eden farkl\u0131 bir senaryo olu\u015fturabilirsiniz. Her senaryo kendi Molecule yap\u0131land\u0131rmas\u0131na ve test dosyalar\u0131na sahip olabilir. Varsay\u0131lan senaryo <code>default<\/code> olarak adland\u0131r\u0131l\u0131r.<br \/>\n*   <strong>Platform (Platform):<\/strong> Testin \u00e7al\u0131\u015ft\u0131r\u0131laca\u011f\u0131 sanal ortam\u0131 (konteyner veya VM) tan\u0131mlar. \u00d6rne\u011fin, <code>ubuntu:16.04<\/code> Docker imaj\u0131 veya belirli bir Vagrant kutusu.<\/p>\n<h3>Bir Ansible Rol\u00fc Olu\u015fturma<\/h3>\n<p>Test etmeye ba\u015flamadan \u00f6nce basit bir Ansible rol\u00fcne ihtiyac\u0131m\u0131z var. Nginx web sunucusunu kuran ve yap\u0131land\u0131ran basit bir rol olu\u015ftural\u0131m. Ansible Galaxy&#8217;yi kullanarak temel rol yap\u0131s\u0131n\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">ansible-galaxy init my_nginx_role\ncd my_nginx_role<\/code><\/pre>\n<p>Bu komut, <code>my_nginx_role<\/code> ad\u0131nda bir dizin olu\u015fturacak ve i\u00e7inde <code>tasks<\/code>, <code>handlers<\/code>, <code>vars<\/code>, <code>templates<\/code>, <code>defaults<\/code>, <code>meta<\/code> gibi standart Ansible rol dizinlerini ve dosyalar\u0131n\u0131 bar\u0131nd\u0131racakt\u0131r.<\/p>\n<p>\u015eimdi bu rol\u00fcn i\u00e7eri\u011fini d\u00fczenleyelim. Amac\u0131m\u0131z Nginx&#8217;i kurmak, basit bir yap\u0131land\u0131rma dosyas\u0131 kopyalamak ve servisi ba\u015flatmak.<\/p>\n<p><strong><code>my_nginx_role\/tasks\/main.yml<\/code>:<\/strong><\/p>\n<pre><code class=\"language-yaml\">---\n- name: Nginx paketini kur\n  apt:\n    name: nginx\n    state: present\n    update_cache: yes\n\n- name: Nginx yap\u0131land\u0131rma dosyas\u0131n\u0131 kopyala\n  template:\n    src: nginx.conf.j2\n    dest: \/etc\/nginx\/nginx.conf\n  notify: Nginx'i yeniden ba\u015flat\n\n- name: Nginx servisini ba\u015flat ve etkinle\u015ftir\n  service:\n    name: nginx\n    state: started\n    enabled: yes<\/code><\/pre>\n<p><strong><code>my_nginx_role\/handlers\/main.yml<\/code>:<\/strong><\/p>\n<pre><code class=\"language-yaml\">---\n- name: Nginx'i yeniden ba\u015flat\n  service:\n    name: nginx\n    state: restarted<\/code><\/pre>\n<p><strong><code>my_nginx_role\/templates\/nginx.conf.j2<\/code>:<\/strong><\/p>\n<pre><code class=\"language-nginx\">user www-data;\nworker_processes auto;\npid \/run\/nginx.pid;\ninclude \/etc\/nginx\/modules-enabled\/*.conf;\n\nevents {\n    worker_connections 768;\n    # multi_accept on;\n}\n\nhttp {\n    sendfile on;\n    tcp_nopush on;\n    tcp_nodelay on;\n    keepalive_timeout 65;\n    types_hash_max_size 2048;\n\n    include \/etc\/nginx\/mime.types;\n    default_type application\/octet-stream;\n\n    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE\n    ssl_prefer_server_ciphers on;\n\n    access_log \/var\/log\/nginx\/access.log;\n    error_log \/var\/log\/nginx\/error.log;\n\n    gzip on;\n\n    include \/etc\/nginx\/conf.d\/*.conf;\n    include \/etc\/nginx\/sites-enabled\/*;\n\n    server {\n        listen 80 default_server;\n        listen [::]:80 default_server;\n        root \/var\/www\/html;\n        index index.html index.htm index.nginx-debian.html;\n        server_name _;\n        location \/ {\n            try_files $uri $uri\/ =404;\n        }\n    }\n}<\/code><\/pre>\n<p>Bu basit rol, Nginx&#8217;i kuracak, varsay\u0131lan bir yap\u0131land\u0131rma dosyas\u0131 ile de\u011fi\u015ftirecek ve servisi ba\u015flatacakt\u0131r.<\/p>\n<h3>Molecule ile Rol\u00fc Ba\u015flatma<\/h3>\n<p>\u015eimdi s\u0131ra Molecule yap\u0131land\u0131rmas\u0131n\u0131 olu\u015fturmaya geldi. <code>my_nginx_role<\/code> dizini i\u00e7inde iken a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">molecule init scenario --driver docker --provisioner ansible --verifier testinfra<\/code><\/pre>\n<p>Bu komut, <code>my_nginx_role\/molecule\/default<\/code> dizinini olu\u015fturacak ve i\u00e7ine bir dizi yap\u0131land\u0131rma ve test dosyas\u0131 yerle\u015ftirecektir:<br \/>\n*   <code>molecule\/default\/molecule.yml<\/code>: Molecule&#8217;\u00fcn ana yap\u0131land\u0131rma dosyas\u0131.<br \/>\n*   <code>molecule\/default\/create.yml<\/code>: Test ortam\u0131n\u0131 olu\u015fturan playbook.<br \/>\n*   <code>molecule\/default\/converge.yml<\/code>: Test edilecek Ansible rol\u00fcn\u00fc \u00e7al\u0131\u015ft\u0131ran playbook.<br \/>\n*   <code>molecule\/default\/verify.py<\/code>: Testinfra testlerini i\u00e7eren Python dosyas\u0131.<br \/>\n*   <code>molecule\/default\/destroy.yml<\/code>: Test ortam\u0131n\u0131 yok eden playbook.<\/p>\n<h3><code>molecule.yml<\/code> Yap\u0131land\u0131rmas\u0131<\/h3>\n<p><code>molecule\/default\/molecule.yml<\/code> dosyas\u0131n\u0131 a\u00e7al\u0131m ve Ubuntu 16.04 \u00fczerinde test yapmak i\u00e7in d\u00fczenleyelim.<\/p>\n<pre><code class=\"language-yaml\">---\ndependency:\n  name: galaxy\ndriver:\n  name: docker\nplatforms:\n  - name: instance\n    image: ubuntu:16.04\n    pre_build_image: true\n    command: \"\/sbin\/init\" # Systemd i\u00e7in gerekli olabilir, ancak \u00e7o\u011fu durumda init yerine sleep de kullan\u0131labilir.\n    volumes:\n      - \/sys\/fs\/cgroup:\/sys\/fs\/cgroup:ro # Systemd i\u00e7in gerekli\nprovisioner:\n  name: ansible\n  playbooks:\n    converge: ${MOLECULE_SCENARIO_DIRECTORY}\/converge.yml\n  inventory:\n    group_vars:\n      all:\n        ansible_python_interpreter: \/usr\/bin\/python3 # Ubuntu 16.04'te varsay\u0131lan Python 2 olabilir.\nverifier:\n  name: testinfra\n  options:\n    verbose: true<\/code><\/pre>\n<p>Yukar\u0131daki yap\u0131land\u0131rman\u0131n \u00f6nemli noktalar\u0131:<\/p>\n<p>*   <strong><code>dependency<\/code><\/strong>: <code>galaxy<\/code> olarak ayarlanm\u0131\u015ft\u0131r. Bu, rol\u00fcn\u00fcz\u00fcn <code>meta\/main.yml<\/code> dosyas\u0131nda tan\u0131mlanan ba\u011f\u0131ml\u0131l\u0131klar\u0131 <code>ansible-galaxy install<\/code> komutu ile kurmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong><code>driver<\/code><\/strong>: <code>docker<\/code> olarak belirtilmi\u015ftir.<br \/>\n*   <strong><code>platforms<\/code><\/strong>: Test edilecek sanal ortamlar\u0131 tan\u0131mlar.<br \/>\n    *   <code>name: instance<\/code>: Test konteynerine verdi\u011fimiz isim.<br \/>\n    *   <code>image: ubuntu:16.04<\/code>: Konteyner i\u00e7in kullan\u0131lacak Docker imaj\u0131. Ubuntu 16.04&#8217;e \u00f6zel olarak bu imaj\u0131 kullan\u0131yoruz.<br \/>\n    *   <code>pre_build_image: true<\/code>: Docker imaj\u0131n\u0131n \u00f6nceden \u00e7ekilmesini sa\u011flar.<br \/>\n    *   <code>command: \"\/sbin\/init\"<\/code> ve <code>volumes: \/sys\/fs\/cgroup:\/sys\/fs\/cgroup:ro<\/code>: E\u011fer Nginx gibi bir servisi systemd ile y\u00f6netiyorsan\u0131z (ki Ubuntu 16.04&#8217;te systemd kullan\u0131l\u0131r), Docker konteynerinin systemd&#8217;yi do\u011fru \u00e7al\u0131\u015ft\u0131rmas\u0131 i\u00e7in bu ayarlar genellikle gereklidir. Aksi takdirde servisler d\u00fczg\u00fcn \u00e7al\u0131\u015fmayabilir.<br \/>\n*   <strong><code>provisioner<\/code><\/strong>: <code>ansible<\/code> olarak ayarlanm\u0131\u015ft\u0131r. <code>inventory<\/code> alt\u0131nda <code>ansible_python_interpreter: \/usr\/bin\/python3<\/code> belirtmek \u00f6nemlidir, \u00e7\u00fcnk\u00fc Ubuntu 16.04&#8217;te varsay\u0131lan Python s\u00fcr\u00fcm\u00fc Python 2 olabilir ve Ansible&#8217;\u0131n Python 3 ile \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamak isteyebiliriz.<br \/>\n*   <strong><code>verifier<\/code><\/strong>: <code>testinfra<\/code> olarak ayarlanm\u0131\u015ft\u0131r. <code>verbose: true<\/code> se\u00e7ene\u011fi test \u00e7\u0131kt\u0131s\u0131n\u0131 daha detayl\u0131 hale getirir.<\/p>\n<h3><code>converge.yml<\/code> Yap\u0131land\u0131rmas\u0131<\/h3>\n<p><code>molecule\/default\/converge.yml<\/code> dosyas\u0131, Molecule&#8217;\u00fcn test konteynerinde \u00e7al\u0131\u015ft\u0131raca\u011f\u0131 Ansible playbook&#8217;udur. Bu playbook, test etmek istedi\u011fimiz rol\u00fc \u00e7a\u011f\u0131r\u0131r.<\/p>\n<pre><code class=\"language-yaml\">---\n- name: Rol\u00fc test ortam\u0131nda uygula\n  hosts: all\n  gather_facts: false # \u0130lk kurulumda fact toplamay\u0131 atlayabiliriz, performans\u0131 art\u0131r\u0131r.\n  roles:\n    - role: my_nginx_role<\/code><\/pre>\n<p>Bu dosya, <code>my_nginx_role<\/code>&#8216;\u00fc <code>instance<\/code> adl\u0131 t\u00fcm host&#8217;larda \u00e7al\u0131\u015ft\u0131r\u0131r.<\/p>\n<h3>Testinfra ile Test Yazma (<code>verify.py<\/code>)<\/h3>\n<p>\u015eimdi s\u0131ra rol\u00fcm\u00fcz\u00fcn do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulayacak testleri yazmaya geldi. <code>molecule\/default\/verify.py<\/code> dosyas\u0131n\u0131 d\u00fczenleyelim.<\/p>\n<pre><code class=\"language-python\">import os\nimport pytest\nimport testinfra.utils.ansible_runner\n\ntest_host = testinfra.utils.ansible_runner.AnsibleRunner(\n    os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')[0]\n\n@pytest.fixture(scope='module')\ndef host(ansible_host):\n    return ansible_host\n\ndef test_nginx_package_installed(host):\n    \"\"\"\n    Nginx paketinin kurulu olup olmad\u0131\u011f\u0131n\u0131 kontrol et.\n    \"\"\"\n    assert host.package(\"nginx\").is_installed\n\ndef test_nginx_service_running_and_enabled(host):\n    \"\"\"\n    Nginx servisinin \u00e7al\u0131\u015f\u0131r durumda ve etkin olup olmad\u0131\u011f\u0131n\u0131 kontrol et.\n    \"\"\"\n    service = host.service(\"nginx\")\n    assert service.is_running\n    assert service.is_enabled\n\ndef test_nginx_config_file_exists(host):\n    \"\"\"\n    Nginx yap\u0131land\u0131rma dosyas\u0131n\u0131n var olup olmad\u0131\u011f\u0131n\u0131 kontrol et.\n    \"\"\"\n    config_file = host.file(\"\/etc\/nginx\/nginx.conf\")\n    assert config_file.exists\n    assert config_file.is_file\n    assert config_file.user == \"root\"\n    assert config_file.group == \"root\"\n    assert oct(config_file.mode) == \"0o644\" # Ya da istedi\u011finiz izinler\n\ndef test_nginx_config_file_content(host):\n    \"\"\"\n    Nginx yap\u0131land\u0131rma dosyas\u0131n\u0131n i\u00e7eri\u011fini kontrol et.\n    \"\"\"\n    config_file = host.file(\"\/etc\/nginx\/nginx.conf\")\n    assert config_file.contains(\"listen 80 default_server;\")\n    assert config_file.contains(\"user www-data;\")\n\ndef test_nginx_port_listening(host):\n    \"\"\"\n    Nginx'in 80 numaral\u0131 portta dinleyip dinlemedi\u011fini kontrol et.\n    \"\"\"\n    assert host.socket(\"tcp:\/\/0.0.0.0:80\").is_listening<\/code><\/pre>\n<p>Bu Testinfra testleri \u015funlar\u0131 kontrol eder:<br \/>\n*   <code>nginx<\/code> paketinin kurulu olup olmad\u0131\u011f\u0131n\u0131.<br \/>\n*   <code>nginx<\/code> servisinin \u00e7al\u0131\u015f\u0131r durumda ve sistem ba\u015flang\u0131c\u0131nda etkin olup olmad\u0131\u011f\u0131n\u0131.<br \/>\n*   <code>\/etc\/nginx\/nginx.conf<\/code> dosyas\u0131n\u0131n varl\u0131\u011f\u0131n\u0131, dosya tipini, sahipli\u011fini ve izinlerini.<br \/>\n*   Yap\u0131land\u0131rma dosyas\u0131n\u0131n belirli i\u00e7erikleri (\u00f6rne\u011fin, <code>listen 80<\/code> ve <code>user www-data<\/code>) i\u00e7erip i\u00e7ermedi\u011fini.<br \/>\n*   Nginx&#8217;in 80 numaral\u0131 portta dinleyip dinlemedi\u011fini.<\/p>\n<p>Bu testler, rol\u00fcm\u00fcz\u00fcn beklenen davran\u0131\u015flar\u0131 sergiledi\u011fini do\u011frulamak i\u00e7in yeterli bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r.<\/p>\n<h3>Molecule Komutlar\u0131 ve \u0130\u015f Ak\u0131\u015f\u0131<\/h3>\n<p>Molecule, test ak\u0131\u015f\u0131n\u0131 y\u00f6netmek i\u00e7in bir dizi komut sunar. <code>my_nginx_role<\/code> dizini i\u00e7inde bu komutlar\u0131 \u00e7al\u0131\u015ft\u0131rabilirsiniz:<\/p>\n<p>1.  <strong><code>molecule create<\/code><\/strong>: Test ortam\u0131n\u0131 (Docker konteynerini) olu\u015fturur. Bu ad\u0131m, <code>create.yml<\/code> playbook&#8217;unu \u00e7al\u0131\u015ft\u0131r\u0131r ve Docker imaj\u0131n\u0131 \u00e7eker.<\/p>\n<pre><code class=\"language-bash\">molecule create<\/code><\/pre>\n<p>2.  <strong><code>molecule converge<\/code><\/strong>: Ansible rol\u00fcn\u00fc test ortam\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131r. Bu ad\u0131m, <code>converge.yml<\/code> playbook&#8217;unu \u00e7al\u0131\u015ft\u0131r\u0131r ve rol\u00fcn\u00fcz\u00fc uygular.<\/p>\n<pre><code class=\"language-bash\">molecule converge<\/code><\/pre>\n<p>3.  <strong><code>molecule verify<\/code><\/strong>: Rol\u00fcn do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulamak i\u00e7in Testinfra testlerini \u00e7al\u0131\u015ft\u0131r\u0131r. Bu ad\u0131m, <code>verify.py<\/code> dosyas\u0131ndaki testleri \u00e7al\u0131\u015ft\u0131r\u0131r.<\/p>\n<pre><code class=\"language-bash\">molecule verify<\/code><\/pre>\n<p>4.  <strong><code>molecule destroy<\/code><\/strong>: Test ortam\u0131n\u0131 (Docker konteynerini) yok eder. Bu ad\u0131m, <code>destroy.yml<\/code> playbook&#8217;unu \u00e7al\u0131\u015ft\u0131r\u0131r ve konteyneri siler.<\/p>\n<pre><code class=\"language-bash\">molecule destroy<\/code><\/pre>\n<p>5.  <strong><code>molecule test<\/code><\/strong>: T\u00fcm bu ad\u0131mlar\u0131 s\u0131ras\u0131yla otomatik olarak \u00e7al\u0131\u015ft\u0131ran ana komuttur: <code>dependency<\/code>, <code>lint<\/code>, <code>destroy<\/code>, <code>create<\/code>, <code>converge<\/code>, <code>check<\/code>, <code>verify<\/code>, <code>destroy<\/code>. Bu, genellikle s\u00fcrekli entegrasyon (CI) ortamlar\u0131nda kullan\u0131lan komuttur.<\/p>\n<pre><code class=\"language-bash\">molecule test<\/code><\/pre>\n<p>    Bu komut, rol\u00fcn\u00fcz\u00fc u\u00e7tan uca test eder ve her ad\u0131m\u0131n ba\u015far\u0131l\u0131 oldu\u011fundan emin olur.<\/p>\n<p>6.  <strong><code>molecule login<\/code><\/strong>: Hata ay\u0131klama i\u00e7in test konteynerine veya VM&#8217;e SSH\/exec ile ba\u011flanman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-bash\">molecule login<\/code><\/pre>\n<p>    Bu komutu \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra, test ortam\u0131n\u0131zdaki <code>instance<\/code> konteynerinin kabu\u011funa d\u00fc\u015feceksiniz. Burada Nginx servisinin durumunu kontrol edebilir, dosyalar\u0131 inceleyebilir veya sorunlar\u0131 giderebilirsiniz. \u00c7\u0131kmak i\u00e7in <code>exit<\/code> yazman\u0131z yeterlidir.<\/p>\n<p>7.  <strong><code>molecule check<\/code><\/strong>: Rol\u00fcn idempotence&#8217;\u0131n\u0131 (tekrar \u00e7al\u0131\u015ft\u0131r\u0131labilirlik) test eder. Rol\u00fc iki kez \u00e7al\u0131\u015ft\u0131r\u0131r ve ikinci \u00e7al\u0131\u015ft\u0131rmada herhangi bir de\u011fi\u015fikli\u011fin yap\u0131lmad\u0131\u011f\u0131ndan emin olur. Bu, Ansible rollerinin temel bir gereksinimidir.<\/p>\n<pre><code class=\"language-bash\">molecule check<\/code><\/pre>\n<p>    Bu komutun \u00e7\u0131kt\u0131s\u0131, rol\u00fcn\u00fcz\u00fcn ikinci \u00e7al\u0131\u015ft\u0131rmada &#8220;changed=0&#8221; veya &#8220;ok&#8221; durumunda olmas\u0131 gerekti\u011fini g\u00f6sterecektir. E\u011fer herhangi bir g\u00f6rev &#8220;changed&#8221; olarak i\u015faretlenirse, rol\u00fcn\u00fcz idempotence ilkesini ihlal ediyor demektir ve d\u00fczeltilmesi gerekir.<\/p>\n<p>8.  <strong><code>molecule lint<\/code><\/strong>: YAML ve Python kodlar\u0131n\u0131z i\u00e7in linting ara\u00e7lar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r. Bu, kod kalitesini art\u0131rmak ve yayg\u0131n hatalar\u0131 \u00f6nlemek i\u00e7in faydal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-bash\">molecule lint<\/code><\/pre>\n<h3>Idempotence (Tekrar \u00c7al\u0131\u015ft\u0131rma) Testi<\/h3>\n<p>Ansible otomasyonunun en \u00f6nemli prensiplerinden biri idempotence&#8217;t\u0131r. Bir Ansible rol\u00fc, bir sistemi istenen duruma getirmek i\u00e7in tasarlanm\u0131\u015ft\u0131r. Bu rol\u00fcn bir kez \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 ile on kez \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 aras\u0131nda, sistemin son durumu a\u00e7\u0131s\u0131ndan hi\u00e7bir fark olmamal\u0131d\u0131r. Yani, ilk \u00e7al\u0131\u015ft\u0131rmadan sonra yap\u0131lan ek \u00e7al\u0131\u015ft\u0131rmalar sistemde herhangi bir de\u011fi\u015fiklik yapmamal\u0131d\u0131r.<\/p>\n<p>Molecule, bu \u00f6zelli\u011fi <code>molecule check<\/code> komutu ile test etmenizi sa\u011flar. Bu komutun \u00e7al\u0131\u015fma prensibi \u015f\u00f6yledir:<br \/>\n1.  Test ortam\u0131n\u0131 olu\u015fturur (<code>create<\/code>).<br \/>\n2.  Rol\u00fc ilk kez uygular (<code>converge<\/code>).<br \/>\n3.  Rol\u00fc ikinci kez uygular (<code>converge<\/code> ad\u0131m\u0131n\u0131 tekrar \u00e7al\u0131\u015ft\u0131r\u0131r), ancak bu kez Ansible&#8217;\u0131n raporlad\u0131\u011f\u0131 de\u011fi\u015fiklikleri kontrol eder.<br \/>\n4.  E\u011fer ikinci \u00e7al\u0131\u015ft\u0131rmada herhangi bir g\u00f6rev &#8220;changed&#8221; olarak raporlan\u0131rsa, test ba\u015far\u0131s\u0131z olur. Bu, rol\u00fcn\u00fcz\u00fcn idempotence&#8217;\u0131 ihlal etti\u011fi anlam\u0131na gelir.<br \/>\n5.  Testleri \u00e7al\u0131\u015ft\u0131r\u0131r (<code>verify<\/code>).<br \/>\n6.  Test ortam\u0131n\u0131 yok eder (<code>destroy<\/code>).<\/p>\n<p>Idempotence testi, \u00f6zellikle bir rol\u00fcn birden fazla kez \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 gereken s\u00fcrekli da\u011f\u0131t\u0131m (CD) senaryolar\u0131nda kritik \u00f6neme sahiptir. \u00d6rne\u011fin, bir sunucuya yeni bir yap\u0131land\u0131rma da\u011f\u0131tt\u0131ktan sonra, ayn\u0131 yap\u0131land\u0131rman\u0131n zaten mevcut oldu\u011fu durumlarda rol\u00fcn gereksiz yere kaynaklar\u0131 yeniden yap\u0131land\u0131rmamas\u0131 veya servisleri yeniden ba\u015flatmamas\u0131 gerekir.<\/p>\n<h3>\u00c7oklu Platform ve Senaryolar<\/h3>\n<p>Molecule sadece tek bir platformda test yapmakla kalmaz, ayn\u0131 zamanda farkl\u0131 i\u015fletim sistemlerinde veya farkl\u0131 senaryolarda da test yapma yetene\u011fi sunar.<\/p>\n<h4>\u00c7oklu Platform Testi<\/h4>\n<p><code>molecule.yml<\/code> dosyas\u0131ndaki <code>platforms<\/code> b\u00f6l\u00fcm\u00fcne birden fazla giri\u015f ekleyerek rol\u00fcn\u00fcz\u00fc farkl\u0131 Ubuntu s\u00fcr\u00fcmlerinde veya hatta farkl\u0131 da\u011f\u0131t\u0131mlarda test edebilirsiniz:<\/p>\n<pre><code class=\"language-yaml\">platforms:\n  - name: instance-ubuntu1604\n    image: ubuntu:16.04\n    pre_build_image: true\n    command: \"\/sbin\/init\"\n    volumes:\n      - \/sys\/fs\/cgroup:\/sys\/fs\/cgroup:ro\n    # Di\u011fer platform\n  - name: instance-ubuntu1804\n    image: ubuntu:18.04\n    pre_build_image: true\n    command: \"\/sbin\/init\"\n    volumes:\n      - \/sys\/fs\/cgroup:\/sys\/fs\/cgroup:ro<\/code><\/pre>\n<p>Bu yap\u0131land\u0131rma ile <code>molecule test<\/code> komutu, rol\u00fcn\u00fcz\u00fc hem Ubuntu 16.04 hem de Ubuntu 18.04 konteynerlerinde ayr\u0131 ayr\u0131 test edecektir. Bu, rol\u00fcn\u00fcz\u00fcn farkl\u0131 ortamlarda uyumlu oldu\u011funu do\u011frulamak i\u00e7in \u00e7ok de\u011ferlidir.<\/p>\n<h4>\u00c7oklu Senaryolar<\/h4>\n<p>Bir rol\u00fcn farkl\u0131 kullan\u0131m durumlar\u0131n\u0131 veya yap\u0131land\u0131rmalar\u0131n\u0131 test etmek i\u00e7in birden fazla senaryo olu\u015fturabilirsiniz. \u00d6rne\u011fin, Nginx rol\u00fcm\u00fcz i\u00e7in:<br \/>\n*   <code>default<\/code> senaryosu: Varsay\u0131lan Nginx kurulumu.<br \/>\n*   <code>custom-port<\/code> senaryosu: Nginx&#8217;i 8080 portunda dinleyecek \u015fekilde yap\u0131land\u0131rma.<br \/>\n*   <code>uninstall<\/code> senaryosu: Nginx&#8217;i kald\u0131rma ve sistemden tamamen temizleme.<\/p>\n<p>Yeni bir senaryo olu\u015fturmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">molecule init scenario custom-port --driver docker --provisioner ansible --verifier testinfra<\/code><\/pre>\n<p>Bu komut, <code>molecule\/custom-port<\/code> dizinini olu\u015fturacak ve kendi <code>molecule.yml<\/code>, <code>converge.yml<\/code>, <code>verify.py<\/code> dosyalar\u0131n\u0131 i\u00e7erecektir. <code>custom-port\/converge.yml<\/code> i\u00e7inde rol\u00fc \u00e7a\u011f\u0131r\u0131rken farkl\u0131 de\u011fi\u015fkenler ge\u00e7irebilir veya <code>custom-port\/verify.py<\/code> i\u00e7inde bu \u00f6zel durumu do\u011frulayan testler yazabilirsiniz.<\/p>\n<p>\u00d6rne\u011fin, <code>custom-port<\/code> senaryosunun <code>converge.yml<\/code> dosyas\u0131nda:<\/p>\n<pre><code class=\"language-yaml\">---\n- name: Rol\u00fc \u00f6zel port ile uygula\n  hosts: all\n  gather_facts: false\n  roles:\n    - role: my_nginx_role\n      vars:\n        nginx_port: 8080 # Rol i\u00e7indeki bir de\u011fi\u015fkeni override etme<\/code><\/pre>\n<p>Ve <code>custom-port\/verify.py<\/code> i\u00e7inde 8080 portunu kontrol eden bir test ekleyebilirsiniz:<\/p>\n<pre><code class=\"language-python\">def test_nginx_custom_port_listening(host):\n    assert host.socket(\"tcp:\/\/0.0.0.0:8080\").is_listening<\/code><\/pre>\n<p>Belirli bir senaryoyu \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>molecule --scenario custom-port test<\/code> komutunu kullanabilirsiniz.<\/p>\n<h3>Hata Ay\u0131klama ve Sorun Giderme<\/h3>\n<p>Testleriniz ba\u015far\u0131s\u0131z oldu\u011funda veya rol\u00fcn\u00fcz beklendi\u011fi gibi \u00e7al\u0131\u015fmad\u0131\u011f\u0131nda, Molecule hata ay\u0131klama s\u00fcrecini kolayla\u015ft\u0131rmak i\u00e7in birka\u00e7 ara\u00e7 sunar:<\/p>\n<p>*   <strong><code>molecule login<\/code><\/strong>: Bu komut, test konteynerine veya VM&#8217;e do\u011frudan SSH\/exec eri\u015fimi sa\u011flar. Konteyner i\u00e7inde dosya sistemini inceleyebilir, servis durumlar\u0131n\u0131 kontrol edebilir, loglar\u0131 okuyabilir ve sorunlar\u0131 manuel olarak ay\u0131klayabilirsiniz.<br \/>\n*   <strong><code>--debug<\/code> veya <code>-d<\/code> flag&#8217;i<\/strong>: Molecule komutlar\u0131na <code>--debug<\/code> eklemek, daha ayr\u0131nt\u0131l\u0131 \u00e7\u0131kt\u0131 alman\u0131z\u0131 sa\u011flar. Bu, \u00f6zellikle Ansible veya Testinfra&#8217;dan gelen hata mesajlar\u0131n\u0131 anlamak i\u00e7in faydal\u0131d\u0131r. \u00d6rne\u011fin: <code>molecule --debug test<\/code>.<br \/>\n*   <strong>Ansible Verbosity<\/strong>: <code>MOLECULE_ANSIBLE_VERBOSITY<\/code> ortam de\u011fi\u015fkenini ayarlayarak Ansible&#8217;\u0131n daha fazla ayr\u0131nt\u0131 vermesini sa\u011flayabilirsiniz. \u00d6rne\u011fin, <code>MOLECULE_ANSIBLE_VERBOSITY=-vvv molecule converge<\/code> komutu, Ansible&#8217;\u0131n daha detayl\u0131 g\u00f6rev \u00e7\u0131kt\u0131lar\u0131n\u0131 g\u00f6sterecektir.<br \/>\n*   <strong>Loglar\u0131 \u0130nceleme<\/strong>: Konteyner i\u00e7indeki servislerin loglar\u0131n\u0131 (<code>\/var\/log\/nginx\/error.log<\/code> gibi) kontrol etmek, sorunlar\u0131n kayna\u011f\u0131n\u0131 bulmada yard\u0131mc\u0131 olabilir.<br \/>\n*   <strong>Ad\u0131m Ad\u0131m \u00c7al\u0131\u015ft\u0131rma<\/strong>: <code>molecule create<\/code>, <code>molecule converge<\/code>, <code>molecule verify<\/code> gibi komutlar\u0131 tek tek \u00e7al\u0131\u015ft\u0131rarak sorunun hangi ad\u0131mda ortaya \u00e7\u0131kt\u0131\u011f\u0131n\u0131 izole edebilirsiniz. \u00d6zellikle <code>converge<\/code> ad\u0131m\u0131ndan sonra <code>molecule login<\/code> ile ba\u011flan\u0131p durumu kontrol etmek, testleri \u00e7al\u0131\u015ft\u0131rmadan \u00f6nce rol\u00fcn do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in faydal\u0131d\u0131r.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Ansible rolleri, modern altyap\u0131 otomasyonunun vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r. Ancak bu rollerin g\u00fcvenilirli\u011fini ve tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flamak i\u00e7in kapsaml\u0131 testler yapmak hayati \u00f6nem ta\u015f\u0131r. Molecule, bu g\u00f6revi basitle\u015ftiren ve otomatikle\u015ftiren g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Ubuntu 16.04 gibi belirli bir i\u015fletim sistemi \u00fczerinde Docker konteynerlerini kullanarak, rol\u00fcn\u00fcz\u00fcn bu ortamda beklenen \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olabilirsiniz.<\/p>\n<p>Bu makalede, Molecule&#8217;\u00fcn temel kavramlar\u0131n\u0131, kurulumunu, Nginx rol\u00fc \u00f6rne\u011fiyle nas\u0131l kullan\u0131laca\u011f\u0131n\u0131, <code>molecule.yml<\/code> yap\u0131land\u0131rmas\u0131n\u0131, Testinfra ile test yazmay\u0131 ve temel Molecule komutlar\u0131n\u0131 ele ald\u0131k. Ayr\u0131ca idempotence testinin \u00f6nemini ve \u00e7oklu platform\/senaryo testlerinin nas\u0131l yap\u0131laca\u011f\u0131n\u0131 da inceledik.<\/p>\n<p>Molecule&#8217;\u00fc CI\/CD i\u015flem hatlar\u0131n\u0131za entegre ederek, Ansible kodunuzdaki de\u011fi\u015fikliklerin otomatik olarak do\u011frulanmas\u0131n\u0131 sa\u011flayabilir, b\u00f6ylece \u00fcretim ortamlar\u0131n\u0131z\u0131n kararl\u0131l\u0131\u011f\u0131n\u0131 ve g\u00fcvenli\u011fini art\u0131rabilirsiniz. Unutmay\u0131n, iyi test edilmi\u015f bir Ansible rol\u00fc, g\u00fcvenilir bir altyap\u0131n\u0131n temelidir.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Ansible Rollerini Molecule ile Ubuntu 16.04 \u00dczerinde Test Etme\nAnsible, altyap\u0131 otomasyonu i\u00e7in g\u00fc\u00e7l\u00fc ve pop\u00fcler bir ara\u00e7t\u0131r. Rolleri, g\u00f6re","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1468],"tags":[],"class_list":{"0":"post-36953","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ubuntu","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Ansible Rollerini Molecule ile Ubuntu 16.04 \u00dczerinde Test Etme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ansible Rollerini Molecule ile Ubuntu 16.04 \u00dczerinde Test Etme\" \/>\n<meta property=\"og:description\" content=\"Ansible Rollerini Molecule ile Ubuntu 16.04 \u00dczerinde Test Etme Ansible, altyap\u0131 otomasyonu i\u00e7in g\u00fc\u00e7l\u00fc ve pop\u00fcler bir ara\u00e7t\u0131r. Rolleri, g\u00f6re\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-25T08:40:49+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Ansible Rollerini Molecule ile Ubuntu 16.04 \u00dczerinde Test Etme\",\"datePublished\":\"2025-12-25T08:40:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/\"},\"wordCount\":2691,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Ubuntu\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/\",\"name\":\"Ansible Rollerini Molecule ile Ubuntu 16.04 \u00dczerinde Test Etme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-25T08:40:49+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ansible Rollerini Molecule ile Ubuntu 16.04 \u00dczerinde Test Etme\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Ansible Rollerini Molecule ile Ubuntu 16.04 \u00dczerinde Test Etme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/","og_locale":"tr_TR","og_type":"article","og_title":"Ansible Rollerini Molecule ile Ubuntu 16.04 \u00dczerinde Test Etme","og_description":"Ansible Rollerini Molecule ile Ubuntu 16.04 \u00dczerinde Test Etme Ansible, altyap\u0131 otomasyonu i\u00e7in g\u00fc\u00e7l\u00fc ve pop\u00fcler bir ara\u00e7t\u0131r. Rolleri, g\u00f6re","og_url":"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-25T08:40:49+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Ansible Rollerini Molecule ile Ubuntu 16.04 \u00dczerinde Test Etme","datePublished":"2025-12-25T08:40:49+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/"},"wordCount":2691,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Ubuntu"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/","url":"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/","name":"Ansible Rollerini Molecule ile Ubuntu 16.04 \u00dczerinde Test Etme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-25T08:40:49+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ansible-rollerini-molecule-ile-ubuntu-16-04-uzerinde-test-etme\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ansible Rollerini Molecule ile Ubuntu 16.04 \u00dczerinde Test Etme"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36953","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=36953"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36953\/revisions"}],"predecessor-version":[{"id":36954,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36953\/revisions\/36954"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36953"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36953"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36953"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}