{"id":33896,"date":"2025-11-08T15:40:47","date_gmt":"2025-11-08T12:40:47","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33896"},"modified":"2025-11-08T15:40:47","modified_gmt":"2025-11-08T12:40:47","slug":"ansible-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ansible-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/","title":{"rendered":"Ansible Rollerinin S\u00fcrekli Test Edilmesi: Molecule ve Travis CI ile U\u00e7tan Uca Bir Yakla\u015f\u0131m (Ubuntu 18.04)"},"content":{"rendered":"<p><body><\/p>\n<h2>Ansible Rollerinin S\u00fcrekli Test Edilmesi: Molecule ve Travis CI ile U\u00e7tan Uca Bir Yakla\u015f\u0131m (Ubuntu 18.04)<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen IT altyap\u0131lar\u0131nda otomasyon, operasyonel verimlilik ve tutarl\u0131l\u0131k sa\u011flaman\u0131n temel ta\u015f\u0131d\u0131r. Ansible, basit, g\u00fc\u00e7l\u00fc ve ajans\u0131z yap\u0131s\u0131yla konfig\u00fcrasyon y\u00f6netimi, uygulama da\u011f\u0131t\u0131m\u0131 ve orkestrasyon g\u00f6revleri i\u00e7in pop\u00fcler bir otomasyon arac\u0131d\u0131r. Ancak, otomasyonun kendisi yeterli de\u011fildir; otomasyon kodunun (bu durumda Ansible rolleri) g\u00fcvenilirli\u011fini ve beklenen \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 s\u00fcrekli olarak do\u011frulamak kritik \u00f6neme sahiptir. \u0130\u015fte bu noktada s\u00fcrekli test (Continuous Testing) devreye girer.<\/p>\n<p>Bu makale, Ansible rollerini geli\u015ftirenler ve y\u00f6netenler i\u00e7in u\u00e7tan uca bir s\u00fcrekli test stratejisi sunmaktad\u0131r. \u00d6zellikle Ubuntu 18.04 \u00fczerinde Molecule test \u00e7er\u00e7evesini kullanarak Ansible rollerini yerel olarak test etme ve ard\u0131ndan bu testleri Travis CI ile otomatikle\u015ftirerek her kod de\u011fi\u015fikli\u011finde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flama s\u00fcrecini ad\u0131m ad\u0131m a\u00e7\u0131klayaca\u011f\u0131z. Bu yakla\u015f\u0131m, hatalar\u0131 erken a\u015famada tespit etmenize, regresyonlar\u0131 \u00f6nlemenize ve Ansible otomasyonunuzun kalitesini art\u0131rman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>Neden Ansible Rolleri \u0130\u00e7in S\u00fcrekli Test?<\/h3>\n<p>Ansible rolleri, karma\u015f\u0131k altyap\u0131lar\u0131n temelini olu\u015fturur. Bu rollerin do\u011fru ve g\u00fcvenilir bir \u015fekilde \u00e7al\u0131\u015fmas\u0131, sistemlerin istikrarl\u0131 ve g\u00fcvenli olmas\u0131n\u0131 sa\u011flar. S\u00fcrekli test, bu g\u00fcvenilirli\u011fi sa\u011flamak i\u00e7in vazge\u00e7ilmezdir.<\/p>\n<h4>G\u00fcvenilirlik ve Tutarl\u0131l\u0131k<\/h4>\n<p>Testler, Ansible rollerinizin farkl\u0131 ortamlarda (\u00f6rne\u011fin, farkl\u0131 Linux da\u011f\u0131t\u0131mlar\u0131 veya versiyonlar\u0131) beklenen \u015fekilde davrand\u0131\u011f\u0131n\u0131 do\u011frular. Bu, da\u011f\u0131t\u0131mlar aras\u0131nda tutarl\u0131l\u0131k sa\u011flar ve beklenmeyen davran\u0131\u015flar\u0131 en aza indirir.<\/p>\n<h4>Hata Tespiti<\/h4>\n<p>Geli\u015ftirme s\u00fcrecinin erken a\u015famalar\u0131nda hatalar\u0131 tespit etmek, onlar\u0131 \u00fcretim ortam\u0131nda bulmaktan \u00e7ok daha ucuz ve kolayd\u0131r. S\u00fcrekli test, kod de\u011fi\u015fiklikleri yap\u0131l\u0131r yap\u0131lmaz potansiyel sorunlar\u0131 otomatik olarak ortaya \u00e7\u0131kar\u0131r.<\/p>\n<h4>Regresyon \u00d6nleme<\/h4>\n<p>Yeni \u00f6zellikler eklerken veya mevcut kodu iyile\u015ftirirken, daha \u00f6nce \u00e7al\u0131\u015fan i\u015flevselli\u011fi bozma riski her zaman vard\u0131r. Kapsaml\u0131 bir test paketi, yeni de\u011fi\u015fikliklerin mevcut davran\u0131\u015flar\u0131 olumsuz etkilemedi\u011finden emin olman\u0131z\u0131 sa\u011flayarak regresyonlar\u0131 \u00f6nler.<\/p>\n<h4>Geli\u015ftirme H\u0131zland\u0131rma<\/h4>\n<p>Geli\u015ftiriciler, kodlar\u0131nda yapt\u0131klar\u0131 de\u011fi\u015fikliklerin g\u00fcvenli oldu\u011funu bilerek daha h\u0131zl\u0131 ve daha g\u00fcvenle \u00e7al\u0131\u015fabilirler. Otomatik testler, manuel test s\u00fcre\u00e7lerine harcanan zaman\u0131 azalt\u0131r ve geli\u015ftirme d\u00f6ng\u00fcs\u00fcn\u00fc h\u0131zland\u0131r\u0131r.<\/p>\n<h4>Belgeleme ve Anla\u015f\u0131labilirlik<\/h4>\n<p>\u0130yi yaz\u0131lm\u0131\u015f testler, rol\u00fcn ne yapmas\u0131 gerekti\u011fini ve nas\u0131l davranmas\u0131 gerekti\u011fini a\u00e7\u0131k\u00e7a g\u00f6steren ya\u015fayan bir belge g\u00f6revi g\u00f6r\u00fcr. Bu, yeni ekip \u00fcyelerinin rol\u00fcn amac\u0131n\u0131 ve i\u015flevselli\u011fini anlamalar\u0131na yard\u0131mc\u0131 olur.<\/p>\n<h3>Temel Ara\u00e7lar<\/h3>\n<p>Bu s\u00fcrekli test \u00e7\u00f6z\u00fcm\u00fcn\u00fc uygulamak i\u00e7in birka\u00e7 temel araca ihtiyac\u0131m\u0131z olacak. Her birinin rol\u00fcn\u00fc k\u0131saca a\u00e7\u0131klayal\u0131m.<\/p>\n<h4>Ansible<\/h4>\n<p>Otomasyonun kalbinde yer alan Ansible, sunucular\u0131n, a\u011f cihazlar\u0131n\u0131n ve di\u011fer altyap\u0131 bile\u015fenlerinin konfig\u00fcrasyonunu y\u00f6netmek i\u00e7in kullan\u0131l\u0131r. Roller, Ansible&#8217;\u0131n yeniden kullan\u0131labilir otomasyon mant\u0131\u011f\u0131n\u0131 d\u00fczenlemek i\u00e7in kulland\u0131\u011f\u0131 yap\u0131d\u0131r.<\/p>\n<h4>Molecule<\/h4>\n<p>Molecule, Ansible rollerini test etmek i\u00e7in tasarlanm\u0131\u015f bir test \u00e7er\u00e7evesidir. Geli\u015ftiricilerin rol\u00fc birden fazla senaryoda, farkl\u0131 s\u00fcr\u00fcc\u00fcler (Docker, Vagrant, OpenStack vb.) ve do\u011frulay\u0131c\u0131lar (Testinfra, InSpec) kullanarak test etmelerini sa\u011flar. Molecule, yerel geli\u015ftirme ortam\u0131n\u0131zda tutarl\u0131 ve tekrarlanabilir test ortamlar\u0131 olu\u015fturmak ve y\u00f6netmek i\u00e7in m\u00fckemmeldir.<\/p>\n<h4>Travis CI<\/h4>\n<p>Travis CI, GitHub depolar\u0131yla sorunsuz bir \u015fekilde entegre olan bulut tabanl\u0131 bir s\u00fcrekli entegrasyon (CI) hizmetidir. Bir depoya yap\u0131lan her kod de\u011fi\u015fikli\u011finde (push veya pull request), Travis CI otomatik olarak bir sanal makine ba\u015flat\u0131r, ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckler ve testleri \u00e7al\u0131\u015ft\u0131r\u0131r. Bu, kodunuzun her zaman test edildi\u011finden ve da\u011f\u0131t\u0131ma haz\u0131r oldu\u011fundan emin olman\u0131z\u0131 sa\u011flar.<\/p>\n<h4>Docker<\/h4>\n<p>Molecule ile birlikte Docker, hafif ve izole test ortamlar\u0131 olu\u015fturmak i\u00e7in kullan\u0131l\u0131r. Her test \u00e7al\u0131\u015ft\u0131rmas\u0131 i\u00e7in yeni bir Docker kapsay\u0131c\u0131s\u0131 ba\u015flatmak, testlerin temiz bir ortamda \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar ve testler aras\u0131nda \u00e7ak\u0131\u015fmalar\u0131 \u00f6nler. Bu, test d\u00f6ng\u00fclerini h\u0131zland\u0131r\u0131r ve kaynak t\u00fcketimini azalt\u0131r.<\/p>\n<h4>Testinfra<\/h4>\n<p>Testinfra, Python tabanl\u0131 bir test \u00e7er\u00e7evesidir ve sunucular\u0131n durumunu test etmek i\u00e7in kullan\u0131l\u0131r. Molecule ile entegre olarak, Ansible rol\u00fcn\u00fcz\u00fcn bir sistemi ba\u015far\u0131yla yap\u0131land\u0131rd\u0131ktan sonra beklenen durumda olup olmad\u0131\u011f\u0131n\u0131 do\u011frulamak i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, bir servisin \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131, bir paketin kurulu olup olmad\u0131\u011f\u0131n\u0131 veya bir dosyan\u0131n i\u00e7eri\u011fini kontrol edebilirsiniz.<\/p>\n<h3>Ortam Kurulumu<\/h3>\n<p>Bu b\u00f6l\u00fcmde, Ansible rol testleri i\u00e7in gerekli ara\u00e7lar\u0131 Ubuntu 18.04 i\u015fletim sistemine nas\u0131l kuraca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<h4>Ubuntu 18.04 Haz\u0131rl\u0131\u011f\u0131<\/h4>\n<p>Varsay\u0131lan olarak, bir Ubuntu 18.04 sunucusuna veya sanal makinesine sahip oldu\u011funuzu varsay\u0131yoruz. \u0130lk ad\u0131m olarak, sisteminizi g\u00fcncelleyelim ve gerekli paketleri kural\u0131m:<\/p>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt upgrade -y\nsudo apt install -y python3 python3-pip python3-venv<\/code><\/pre>\n<p>Python&#8217;un varsay\u0131lan s\u00fcr\u00fcm\u00fcn\u00fc 3 olarak ayarlamak isteyebilirsiniz veya <code>python3<\/code> komutunu kullanmaya devam edebilirsiniz. Biz bu makalede <code>python3<\/code> ve <code>pip3<\/code> kullanaca\u011f\u0131z.<\/p>\n<h4>Ansible Kurulumu<\/h4>\n<p>Ansible&#8217;\u0131 Python&#8217;\u0131n paket y\u00f6neticisi pip arac\u0131l\u0131\u011f\u0131yla kurmak en iyi y\u00f6ntemdir, \u00e7\u00fcnk\u00fc bu, en g\u00fcncel s\u00fcr\u00fcm\u00fc edinmenizi sa\u011flar.<\/p>\n<pre><code class=\"language-bash\">pip3 install ansible<\/code><\/pre>\n<p>Kurulumu do\u011frulamak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">ansible --version<\/code><\/pre>\n<h4>Docker Kurulumu<\/h4>\n<p>Molecule&#8217;un Docker s\u00fcr\u00fcc\u00fcs\u00fcn\u00fc kullanabilmek i\u00e7in Docker Engine&#8217;\u0131 kurmam\u0131z gerekiyor:<\/p>\n<pre><code class=\"language-bash\">sudo apt install -y apt-transport-https ca-certificates curl software-properties-common\ncurl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo apt-key add -\nsudo add-apt-repository \"deb [arch=amd64] https:\/\/download.docker.com\/linux\/ubuntu bionic stable\"\nsudo apt update\nsudo apt install -y docker-ce docker-ce-cli containerd.io<\/code><\/pre>\n<p>Kullan\u0131c\u0131y\u0131 <code>docker<\/code> grubuna ekleyerek <code>sudo<\/code> olmadan Docker komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmas\u0131n\u0131 sa\u011flay\u0131n (de\u011fi\u015fikli\u011fin etkili olmas\u0131 i\u00e7in oturumu kapat\u0131p a\u00e7man\u0131z gerekebilir):<\/p>\n<pre><code class=\"language-bash\">sudo usermod -aG docker $USER<\/code><\/pre>\n<p>Docker&#8217;\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 test edin:<\/p>\n<pre><code class=\"language-bash\">docker run hello-world<\/code><\/pre>\n<h4>Molecule ve Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Kurulumu<\/h4>\n<p>\u015eimdi Molecule&#8217;u ve onun Docker s\u00fcr\u00fcc\u00fcs\u00fc ile Testinfra do\u011frulay\u0131c\u0131s\u0131n\u0131 kural\u0131m:<\/p>\n<pre><code class=\"language-bash\">pip3 install molecule docker testinfra<\/code><\/pre>\n<p>Kurulumu do\u011frulamak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">molecule --version<\/code><\/pre>\n<h3>Bir Ansible Rol\u00fc Olu\u015fturma<\/h3>\n<p>Test s\u00fcrecini g\u00f6stermek i\u00e7in basit bir Nginx kurulum rol\u00fc olu\u015fturaca\u011f\u0131z. Bu rol, bir Ubuntu sistemine Nginx&#8217;i kuracak ve servisi ba\u015flatacakt\u0131r.<\/p>\n<h4>\u00d6rnek Rol Senaryosu<\/h4>\n<p>Rol\u00fcm\u00fcz, Nginx web sunucusunu kuracak ve varsay\u0131lan olarak 80 numaral\u0131 portta \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olacakt\u0131r.<\/p>\n<h4>Rol Yap\u0131s\u0131<\/h4>\n<p>Ansible Galaxy komutunu kullanarak temel bir rol yap\u0131s\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>\u015eimdi <code>tasks\/main.yml<\/code> dosyas\u0131n\u0131 d\u00fczenleyerek Nginx kurulum g\u00f6revlerini ekleyelim:<\/p>\n<pre><code class=\"language-yaml\"># my_nginx_role\/tasks\/main.yml\n---\n- name: Nginx paketini kur\n  ansible.builtin.apt:\n    name: nginx\n    state: present\n    update_cache: yes\n\n- name: Nginx servisinin \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan ve ba\u015flang\u0131\u00e7ta etkin oldu\u011fundan emin ol\n  ansible.builtin.systemd:\n    name: nginx\n    state: started\n    enabled: yes<\/code><\/pre>\n<p>Basit bir handler ekleyelim (\u015fu an i\u00e7in kullan\u0131lmasa da, iyi bir uygulama \u00f6rne\u011fi):<\/p>\n<pre><code class=\"language-yaml\"># my_nginx_role\/handlers\/main.yml\n---\n- name: Nginx servisini yeniden ba\u015flat\n  ansible.builtin.systemd:\n    name: nginx\n    state: restarted<\/code><\/pre>\n<p>Varsay\u0131lan de\u011fi\u015fkenler i\u00e7in <code>defaults\/main.yml<\/code>:<\/p>\n<pre><code class=\"language-yaml\"># my_nginx_role\/defaults\/main.yml\n---\nnginx_port: 80<\/code><\/pre>\n<h3>Rol\u00fc Molecule ile Entegre Etme<\/h3>\n<p>\u015eimdi olu\u015fturdu\u011fumuz Nginx rol\u00fcn\u00fc Molecule ile test edilebilir hale getirece\u011fiz.<\/p>\n<h4>Molecule \u0130nitialization<\/h4>\n<p>Rol dizinimizin i\u00e7inde Molecule senaryosunu ba\u015flatal\u0131m. Docker s\u00fcr\u00fcc\u00fcs\u00fcn\u00fc ve varsay\u0131lan senaryo ad\u0131n\u0131 kullanaca\u011f\u0131z:<\/p>\n<pre><code class=\"language-bash\">molecule init scenario --scenario-name default --driver-name docker<\/code><\/pre>\n<p>Bu komut, <code>molecule\/default\/<\/code> dizini alt\u0131nda bir dizi dosya olu\u015fturacakt\u0131r:<\/p>\n<ul>\n<li><code>molecule.yml<\/code>: Molecule yap\u0131land\u0131rma dosyas\u0131.<\/li>\n<li><code>create.yml<\/code>: Test ortam\u0131n\u0131 olu\u015fturan playbook.<\/li>\n<li><code>destroy.yml<\/code>: Test ortam\u0131n\u0131 yok eden playbook.<\/li>\n<li><code>converge.yml<\/code>: Rol\u00fc test ortam\u0131na uygulayan playbook.<\/li>\n<li><code>verify.yml<\/code>: Testinfra testlerini \u00e7al\u0131\u015ft\u0131ran playbook.<\/li>\n<li><code>playbook.yml<\/code>: Rol\u00fc \u00e7a\u011f\u0131ran ana playbook.<\/li>\n<\/ul>\n<h4><code>molecule.yml<\/code> Yap\u0131land\u0131rmas\u0131<\/h4>\n<p>Olu\u015fturulan <code>molecule\/default\/molecule.yml<\/code> dosyas\u0131n\u0131 a\u00e7al\u0131m ve i\u00e7eri\u011fini kontrol edelim. Genellikle varsay\u0131lan ayarlar \u00e7o\u011fu senaryo i\u00e7in yeterlidir, ancak baz\u0131 de\u011fi\u015fiklikler yapabiliriz. \u00d6rne\u011fin, Ubuntu 18.04 tabanl\u0131 bir Docker imaj\u0131 kullanmak isteyebiliriz:<\/p>\n<pre><code class=\"language-yaml\"># my_nginx_role\/molecule\/default\/molecule.yml\n---\ndependency:\n  name: galaxy\ndriver:\n  name: docker\nplatforms:\n  - name: instance\n    image: ubuntu:18.04\n    # Nginx'in dinleyece\u011fi portu d\u0131\u015far\u0131ya a\u00e7al\u0131m\n    published_ports:\n      - \"{{ nginx_port }}:80\"\nprovisioner:\n  name: ansible\n  playbooks:\n    converge: converge.yml\nverifier:\n  name: testinfra<\/code><\/pre>\n<p>Burada <code>published_ports<\/code> ekledik, b\u00f6ylece Nginx&#8217;in \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 d\u0131\u015far\u0131dan kontrol edebiliriz.<\/p>\n<h4><code>playbook.yml<\/code><\/h4>\n<p>Bu dosya, <code>molecule converge<\/code> komutu \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda Molecule taraf\u0131ndan kullan\u0131lan ana playbook&#8217;tur. Rol\u00fcn\u00fcz\u00fc \u00e7a\u011f\u0131rd\u0131\u011f\u0131ndan emin olun:<\/p>\n<pre><code class=\"language-yaml\"># my_nginx_role\/molecule\/default\/playbook.yml\n---\n- name: my_nginx_role rol\u00fcn\u00fc test edin\n  hosts: all\n  gather_facts: false\n  roles:\n    - role: my_nginx_role<\/code><\/pre>\n<h4><code>verify.yml<\/code> (Testinfra Testleri)<\/h4>\n<p>Bu dosya, Molecule&#8217;un <code>verify<\/code> a\u015famas\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131lacak Testinfra testlerini i\u00e7erir. <code>molecule\/default\/tests\/test_default.py<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki testleri ekleyin:<\/p>\n<pre><code class=\"language-python\"># my_nginx_role\/molecule\/default\/tests\/test_default.py\nimport 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(request):\n    return test_host\n\ndef test_nginx_is_installed(host):\n    \"\"\"\n    Nginx paketinin kurulu olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.\n    \"\"\"\n    nginx = host.package(\"nginx\")\n    assert nginx.is_installed\n\ndef test_nginx_running_and_enabled(host):\n    \"\"\"\n    Nginx servisinin \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve ba\u015flang\u0131\u00e7ta etkin oldu\u011funu kontrol eder.\n    \"\"\"\n    nginx = host.service(\"nginx\")\n    assert nginx.is_running\n    assert nginx.is_enabled\n\ndef test_nginx_listens_on_port_80(host):\n    \"\"\"\n    Nginx'in 80 numaral\u0131 portu dinledi\u011fini kontrol eder.\n    \"\"\"\n    # Molecule.yml'deki nginx_port de\u011fi\u015fkenini varsay\u0131yoruz.\n    # Varsay\u0131lan de\u011fer 80 oldu\u011fu i\u00e7in direkt 80'i kontrol edebiliriz.\n    # E\u011fer farkl\u0131 bir port kullan\u0131l\u0131yorsa, o portu kontrol etmek gerekir.\n    assert host.socket(\"tcp:\/\/0.0.0.0:80\").is_listening\n\ndef test_nginx_welcome_page_accessible(host):\n    \"\"\"\n    Nginx'in varsay\u0131lan kar\u015f\u0131lama sayfas\u0131n\u0131n eri\u015filebilir oldu\u011funu kontrol eder.\n    \"\"\"\n    # curl komutu ile yerel olarak Nginx'e istek g\u00f6nderiyoruz.\n    # \u00c7\u0131kt\u0131da \"Welcome to nginx!\" ifadesinin olup olmad\u0131\u011f\u0131n\u0131 kontrol ediyoruz.\n    command = host.run(\"curl -s http:\/\/localhost\")\n    assert command.rc == 0\n    assert \"Welcome to nginx!\" in command.stdout<\/code><\/pre>\n<p>Bu testler, Nginx paketinin kurulu olup olmad\u0131\u011f\u0131n\u0131, servisinin \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131, 80 numaral\u0131 portu dinleyip dinlemedi\u011fini ve varsay\u0131lan kar\u015f\u0131lama sayfas\u0131n\u0131n eri\u015filebilir olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.<\/p>\n<h3>Local Testing with Molecule<\/h3>\n<p>Molecule ile yerel testler, kodunuzu GitHub&#8217;a g\u00f6ndermeden \u00f6nce h\u0131zl\u0131 geri bildirim alman\u0131z\u0131 sa\u011flar. Bu, geli\u015ftirme d\u00f6ng\u00fcs\u00fcn\u00fc h\u0131zland\u0131r\u0131r ve hatalar\u0131 erken a\u015famada yakalar.<\/p>\n<h4>Temel Molecule Komutlar\u0131<\/h4>\n<p>Molecule, bir dizi komut sa\u011flar:<\/p>\n<ul>\n<li><code>molecule create<\/code>: Test ortam\u0131n\u0131 (Docker kapsay\u0131c\u0131s\u0131) olu\u015fturur.<\/li>\n<li><code>molecule converge<\/code>: Ansible rol\u00fcn\u00fc olu\u015fturulan test ortam\u0131na uygular.<\/li>\n<li><code>molecule verify<\/code>: Testinfra testlerini \u00e7al\u0131\u015ft\u0131r\u0131r.<\/li>\n<li><code>molecule destroy<\/code>: Test ortam\u0131n\u0131 yok eder.<\/li>\n<li><code>molecule test<\/code>: <code>create<\/code>, <code>converge<\/code>, <code>verify<\/code> ve <code>destroy<\/code> ad\u0131mlar\u0131n\u0131 s\u0131ras\u0131yla \u00e7al\u0131\u015ft\u0131ran tam bir test d\u00f6ng\u00fcs\u00fcd\u00fcr. Bu, genellikle en \u00e7ok kullanaca\u011f\u0131n\u0131z komuttur.<\/li>\n<li><code>molecule login instance<\/code>: Test ortam\u0131na SSH ba\u011flant\u0131s\u0131 kurman\u0131z\u0131 sa\u011flar. Sorun giderme i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/li>\n<\/ul>\n<p>\u015eimdi rol\u00fcm\u00fcz\u00fc test edelim:<\/p>\n<pre><code class=\"language-bash\">cd my_nginx_role\nmolecule test<\/code><\/pre>\n<p>Bu komutun \u00e7\u0131kt\u0131s\u0131, Molecule&#8217;un Docker kapsay\u0131c\u0131s\u0131n\u0131 olu\u015fturdu\u011funu, Ansible rol\u00fcn\u00fc uygulad\u0131\u011f\u0131n\u0131, Testinfra testlerini \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131 ve ard\u0131ndan kapsay\u0131c\u0131y\u0131 yok etti\u011fini g\u00f6sterecektir. T\u00fcm testler ba\u015far\u0131l\u0131 olursa, \u00e7\u0131kt\u0131n\u0131n sonunda <code>Verifier completed successfully.<\/code> mesaj\u0131n\u0131 g\u00f6rmelisiniz.<\/p>\n<p>E\u011fer bir test ba\u015far\u0131s\u0131z olursa, Molecule size hangi testin ba\u015far\u0131s\u0131z oldu\u011funu ve nedenini bildirecektir. Bu durumda, kodu d\u00fczeltip tekrar <code>molecule test<\/code> komutunu \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/p>\n<h3>Travis CI Entegrasyonu<\/h3>\n<p>Yerel testler harika olsa da, s\u00fcrekli entegrasyon (CI) sistemleri, her kod de\u011fi\u015fikli\u011finde testlerin otomatik olarak \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 sa\u011flayarak otomasyonu bir ad\u0131m \u00f6teye ta\u015f\u0131r.<\/p>\n<h4>GitHub Deposu Haz\u0131rl\u0131\u011f\u0131<\/h4>\n<p>Ansible rol\u00fcn\u00fcz\u00fc bir GitHub deposuna y\u00fcklemeniz gerekmektedir. E\u011fer hen\u00fcz yapmad\u0131ysan\u0131z, bir GitHub deposu olu\u015fturun ve rol\u00fcn\u00fcz\u00fc buraya g\u00f6nderin:<\/p>\n<pre><code class=\"language-bash\">cd my_nginx_role\ngit init\ngit add .\ngit commit -m \"Initial commit of my_nginx_role\"\ngit remote add origin https:\/\/github.com\/your-username\/my_nginx_role.git # Kendi deponuzla de\u011fi\u015ftirin\ngit push -u origin master<\/code><\/pre>\n<h4>Travis CI Hesab\u0131 ve Depo Aktivasyonu<\/h4>\n<ol>\n<li>Travis CI web sitesine gidin (travis-ci.com).<\/li>\n<li>GitHub hesab\u0131n\u0131zla oturum a\u00e7\u0131n.<\/li>\n<li>Profil ayarlar\u0131n\u0131za gidin ve yeni deponuzu senkronize edin (genellikle otomatik olarak g\u00f6r\u00fcn\u00fcr).<\/li>\n<li>Deponuzu bulun ve yan\u0131ndaki anahtar\u0131 a\u00e7arak Travis CI entegrasyonunu etkinle\u015ftirin.<\/li>\n<\/ol>\n<h4><code>.travis.yml<\/code> Dosyas\u0131 Olu\u015fturma<\/h4>\n<p>Travis CI&#8217;\u0131n projenizi nas\u0131l test edece\u011fini bildi\u011fi yer, deponuzun k\u00f6k dizininde bulunan <code>.travis.yml<\/code> dosyas\u0131d\u0131r. Bu dosyay\u0131 <code>my_nginx_role<\/code> dizininin k\u00f6k\u00fcne olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-yaml\"># my_nginx_role\/.travis.yml\n---\nlanguage: python\npython:\n  - \"3.7\" # Ubuntu 18.04'te varsay\u0131lan Python 3.6 olsa da, Travis CI'da 3.7 yayg\u0131n kullan\u0131l\u0131r.\n          # Daha yeni versiyonlar\u0131 da kullanabilirsiniz.\n\nservices:\n  - docker # Molecule'un Docker s\u00fcr\u00fcc\u00fcs\u00fcn\u00fc kullanabilmesi i\u00e7in Docker servisini etkinle\u015ftirin\n\ninstall:\n  # Ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckle: Ansible, Molecule, Docker s\u00fcr\u00fcc\u00fcs\u00fc, Testinfra\n  - pip install ansible molecule docker testinfra\n\nscript:\n  # Molecule test komutunu \u00e7al\u0131\u015ft\u0131r\n  # Bu komut, create, converge, verify ve destroy ad\u0131mlar\u0131n\u0131 i\u00e7erir.\n  - molecule test\n\n<h2>\u0130ste\u011fe ba\u011fl\u0131: Ortam de\u011fi\u015fkenleri<\/h2>\nenv:\n  global:\n    # Ansible'\u0131n log seviyesini ayarlayabilirsiniz, hata ay\u0131klama i\u00e7in faydal\u0131 olabilir\n    - ANSIBLE_VERBOSITY=1\n\n<h2>\u0130ste\u011fe ba\u011fl\u0131: Bildirimler<\/h2>\nnotifications:\n  email:\n    recipients:\n      - your-email@example.com # Test sonu\u00e7lar\u0131n\u0131 almak istedi\u011finiz e-posta adresi\n    on_success: change # Ba\u015far\u0131l\u0131 oldu\u011funda sadece ilk de\u011fi\u015fimde veya ba\u015far\u0131s\u0131z olduktan sonra bildirim g\u00f6nder\n    on_failure: always # Ba\u015far\u0131s\u0131z oldu\u011funda her zaman bildirim g\u00f6nder<\/code><\/pre>\n<p>Bu <code>.travis.yml<\/code> dosyas\u0131 \u015funlar\u0131 yapar:<\/p>\n<ul>\n<li><code>language: python<\/code>: Projenin Python tabanl\u0131 oldu\u011funu belirtir.<\/li>\n<li><code>python: \"3.7\"<\/code>: Testlerin Python 3.7 ortam\u0131nda \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><code>services: docker<\/code>: Docker servisini ba\u015flat\u0131r, bu Molecule&#8217;un Docker kapsay\u0131c\u0131lar\u0131 olu\u015fturabilmesi i\u00e7in gereklidir.<\/li>\n<li><code>install<\/code>: Testler ba\u015flamadan \u00f6nce gerekli Python paketlerini (Ansible, Molecule, docker, testinfra) kurar.<\/li>\n<li><code>script<\/code>: Test \u00e7al\u0131\u015ft\u0131rma komutunu tan\u0131mlar. Burada <code>molecule test<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131yoruz.<\/li>\n<li><code>env<\/code> ve <code>notifications<\/code>: \u0130ste\u011fe ba\u011fl\u0131 olarak ortam de\u011fi\u015fkenleri ve bildirim ayarlar\u0131 ekleyebilirsiniz.<\/li>\n<\/ul>\n<h4>Travis CI \u00c7al\u0131\u015fma Ak\u0131\u015f\u0131<\/h4>\n<p><code>.travis.yml<\/code> dosyas\u0131n\u0131 deponuzun k\u00f6k\u00fcne ekledikten sonra, bu de\u011fi\u015fikli\u011fi GitHub&#8217;a g\u00f6nderin:<\/p>\n<pre><code class=\"language-bash\">git add .travis.yml\ngit commit -m \"Add .travis.yml for Travis CI\"\ngit push origin master<\/code><\/pre>\n<p>Bu <code>push<\/code> i\u015flemi, Travis CI taraf\u0131ndan otomatik olarak alg\u0131lanacak ve yeni bir derleme (build) ba\u015flat\u0131lacakt\u0131r. Travis CI aray\u00fcz\u00fcne giderek derlemenizin durumunu izleyebilirsiniz. Travis CI \u015funlar\u0131 yapacakt\u0131r:<\/p>\n<ol>\n<li>Yeni bir Ubuntu sanal makinesi (veya kapsay\u0131c\u0131s\u0131) ba\u015flat\u0131r.<\/li>\n<li><code>install<\/code> b\u00f6l\u00fcm\u00fcndeki komutlar\u0131 \u00e7al\u0131\u015ft\u0131rarak ba\u011f\u0131ml\u0131l\u0131klar\u0131 (Ansible, Molecule, Docker, Testinfra) kurar.<\/li>\n<li><code>script<\/code> b\u00f6l\u00fcm\u00fcndeki <code>molecule test<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131r. Bu, Molecule&#8217;un test Docker kapsay\u0131c\u0131s\u0131n\u0131 olu\u015fturmas\u0131n\u0131, Ansible rol\u00fcn\u00fc uygulamas\u0131n\u0131, Testinfra testlerini \u00e7al\u0131\u015ft\u0131rmas\u0131n\u0131 ve ard\u0131ndan kapsay\u0131c\u0131y\u0131 yok etmesini tetikler.<\/li>\n<li>T\u00fcm ad\u0131mlar ba\u015far\u0131l\u0131 olursa, derleme &#8220;Passed&#8221; olarak i\u015faretlenir. Herhangi bir ad\u0131m ba\u015far\u0131s\u0131z olursa (\u00f6rne\u011fin, bir Testinfra testi ba\u015far\u0131s\u0131z olursa), derleme &#8220;Failed&#8221; olarak i\u015faretlenir ve size e-posta veya ba\u015fka bir bildirim kanal\u0131 arac\u0131l\u0131\u011f\u0131yla bilgi verilir.<\/li>\n<\/ol>\n<p>Bu s\u00fcre\u00e7, her kod de\u011fi\u015fikli\u011finde rol\u00fcn\u00fcz\u00fcn kalitesini otomatik olarak do\u011frular ve s\u00fcrekli geri bildirim sa\u011flar.<\/p>\n<h3>\u0130leri Konular ve En \u0130yi Uygulamalar<\/h3>\n<p>S\u00fcrekli test stratejinizi daha da g\u00fc\u00e7lendirmek i\u00e7in baz\u0131 ileri konular\u0131 ve en iyi uygulamalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurabiliriz.<\/p>\n<h4>Farkl\u0131 Platformlarda Test<\/h4>\n<p>Ansible rollerinizin sadece Ubuntu 18.04&#8217;te de\u011fil, farkl\u0131 Linux da\u011f\u0131t\u0131mlar\u0131nda (\u00f6rne\u011fin, CentOS 7, Ubuntu 20.04) veya hatta farkl\u0131 s\u00fcr\u00fcmlerde de \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak isteyebilirsiniz. Molecule&#8217;un <code>platforms<\/code> b\u00f6l\u00fcm\u00fcn\u00fc kullanarak birden fazla test hedefi tan\u0131mlayabilirsiniz:<\/p>\n<pre><code class=\"language-yaml\"># my_nginx_role\/molecule\/default\/molecule.yml\n---\n<h2>... di\u011fer ayarlar ...<\/h2>\nplatforms:\n  - name: ubuntu-1804\n    image: ubuntu:18.04\n    published_ports:\n      - \"{{ nginx_port }}:80\"\n  - name: ubuntu-2004\n    image: ubuntu:20.04\n    published_ports:\n      - \"{{ nginx_port }}:80\"\n  - name: centos-7\n    image: centos:7\n    published_ports:\n      - \"{{ nginx_port }}:80\"\n<h2>...<\/code><\/pre>\n<\/h2>\n<p>Bu, <code>molecule test<\/code> komutunun her bir platform i\u00e7in ayr\u0131 ayr\u0131 testleri \u00e7al\u0131\u015ft\u0131rmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h4>\u00c7oklu Senaryolar<\/h4>\n<p>Bir rol\u00fcn farkl\u0131 konfig\u00fcrasyonlar\u0131n\u0131 veya iste\u011fe ba\u011fl\u0131 \u00f6zelliklerini test etmek i\u00e7in Molecule&#8217;da birden fazla senaryo olu\u015fturabilirsiniz. \u00d6rne\u011fin, Nginx&#8217;in SSL ile veya farkl\u0131 bir portta \u00e7al\u0131\u015ft\u0131\u011f\u0131 senaryolar:<\/p>\n<pre><code class=\"language-bash\">molecule init scenario --scenario-name ssl_nginx --driver-name docker<\/code><\/pre>\n<p>Bu, <code>molecule\/ssl_nginx\/<\/code> alt\u0131nda yeni bir dizin olu\u015fturur. Her senaryonun kendi <code>molecule.yml<\/code>, <code>playbook.yml<\/code> ve <code>tests<\/code> dizini olabilir. Testleri \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>molecule test -s ssl_nginx<\/code> komutunu kullan\u0131rs\u0131n\u0131z.<\/p>\n<h4>Test Kapsam\u0131<\/h4>\n<p>Testinfra ile sadece servisin \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 de\u011fil, daha derinlemesine kontroller yapabilirsiniz:<\/p>\n<ul>\n<li><strong>Dosya \u0130\u00e7erikleri:<\/strong> Nginx konfig\u00fcrasyon dosyas\u0131n\u0131n (<code>\/etc\/nginx\/nginx.conf<\/code>) belirli direktifleri i\u00e7erip i\u00e7ermedi\u011fini kontrol edin.<\/li>\n<li><strong>Kullan\u0131c\u0131 ve \u0130zinler:<\/strong> Nginx&#8217;in belirli bir kullan\u0131c\u0131 alt\u0131nda \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve ilgili dizinlerin do\u011fru izinlere sahip oldu\u011funu do\u011frulay\u0131n.<\/li>\n<li><strong>Idempotency Kontrol\u00fc:<\/strong> Ansible rol\u00fcn\u00fcn birden fazla kez \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda sistemde ek bir de\u011fi\u015fiklik yapmad\u0131\u011f\u0131n\u0131 do\u011frulay\u0131n. Molecule&#8217;un <code>idempotence<\/code> do\u011frulay\u0131c\u0131s\u0131 bu ama\u00e7la kullan\u0131labilir.<\/li>\n<li><strong>G\u00fcvenlik Duvar\u0131 Kurallar\u0131:<\/strong> Gerekli portlar\u0131n g\u00fcvenlik duvar\u0131nda a\u00e7\u0131l\u0131p a\u00e7\u0131lmad\u0131\u011f\u0131n\u0131 kontrol edin.<\/li>\n<\/ul>\n<h4>Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi<\/h4>\n<p>E\u011fer rol\u00fcn\u00fcz ba\u015fka Ansible rollerine ba\u011f\u0131ml\u0131ysa, bu ba\u011f\u0131ml\u0131l\u0131klar\u0131 <code>requirements.yml<\/code> dosyas\u0131na ekleyebilir ve Travis CI&#8217;da <code>ansible-galaxy install -r requirements.yml<\/code> komutuyla kurabilirsiniz. Bu komutu <code>.travis.yml<\/code> dosyas\u0131ndaki <code>install<\/code> b\u00f6l\u00fcm\u00fcne eklemeniz gerekir.<\/p>\n<h4>Performans Optimizasyonu<\/h4>\n<p>B\u00fcy\u00fck projelerde test s\u00fcreleri uzayabilir. Travis CI&#8217;da \u00f6nbellekleme kullanarak ba\u011f\u0131ml\u0131l\u0131klar\u0131n her seferinde yeniden indirilmesini \u00f6nleyebilirsiniz. Docker imajlar\u0131n\u0131 optimize etmek ve testleri daha k\u00fc\u00e7\u00fck, daha odakl\u0131 par\u00e7alara ay\u0131rmak da performans\u0131 art\u0131rabilir.<\/p>\n<h4>G\u00fcvenlik Tarama Entegrasyonu<\/h4>\n<p>Geli\u015fmi\u015f bir CI\/CD hatt\u0131nda, statik kod analizi ara\u00e7lar\u0131n\u0131 (\u00f6rne\u011fin, Ansible-lint) veya g\u00fcvenlik tarama ara\u00e7lar\u0131n\u0131 (\u00f6rne\u011fin, Trivy ile Docker imaj\u0131 tarama) Travis CI s\u00fcrecinize entegre ederek g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 otomatik olarak tespit edebilirsiniz.<\/p>\n<h4>Bildirimler<\/h4>\n<p>Travis CI, e-posta, Slack veya di\u011fer hizmetler arac\u0131l\u0131\u011f\u0131yla build durum bildirimleri g\u00f6nderebilir. <code>.travis.yml<\/code> dosyas\u0131ndaki <code>notifications<\/code> b\u00f6l\u00fcm\u00fcn\u00fc yap\u0131land\u0131rarak ekibinizin her zaman test sonu\u00e7lar\u0131ndan haberdar olmas\u0131n\u0131 sa\u011flayabilirsiniz.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Ansible rollerinin s\u00fcrekli testi, modern DevOps uygulamalar\u0131n\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r. Bu makalede, Molecule ve Travis CI&#8217;\u0131 kullanarak Ansible rolleriniz i\u00e7in sa\u011flam bir s\u00fcrekli test \u00e7er\u00e7evesini Ubuntu 18.04 \u00fczerinde nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011frendik.<\/p>\n<p>Molecule, yerel geli\u015ftirme ortam\u0131n\u0131zda h\u0131zl\u0131 ve tekrarlanabilir testler yapman\u0131z\u0131 sa\u011flarken, Travis CI, her kod de\u011fi\u015fikli\u011finde testlerin otomatik olarak \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 sa\u011flayarak g\u00fcvenilirli\u011fi ve tutarl\u0131l\u0131\u011f\u0131 art\u0131r\u0131r. Docker&#8217;\u0131n hafif ve izole test ortamlar\u0131 sunmas\u0131, test d\u00f6ng\u00fclerini h\u0131zland\u0131r\u0131r ve Testinfra, sistem durumunu do\u011frulama konusunda g\u00fc\u00e7l\u00fc bir esneklik sa\u011flar.<\/p>\n<p>Bu ara\u00e7lar\u0131 ve metodolojiyi benimseyerek, Ansible otomasyonunuzun kalitesini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir, hatalar\u0131 erken a\u015famada tespit edebilir, regresyonlar\u0131 \u00f6nleyebilir ve geli\u015ftirme ekiplerinizin daha h\u0131zl\u0131 ve daha g\u00fcvenle \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayabilirsiniz. S\u00fcrekli test, yaln\u0131zca otomasyon kodunuzun do\u011frulu\u011funu sa\u011flamakla kalmaz, ayn\u0131 zamanda altyap\u0131n\u0131z\u0131n genel istikrar\u0131na ve g\u00fcvenli\u011fine de katk\u0131da bulunur.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Ansible Rollerinin S\u00fcrekli Test Edilmesi: Molecule ve Travis CI ile U\u00e7tan Uca Bir Yakla\u015f\u0131m (Ubuntu 18.04)\nG\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen IT altya","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-33896","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 Rollerinin S\u00fcrekli Test Edilmesi: Molecule ve Travis CI ile U\u00e7tan Uca Bir Yakla\u015f\u0131m (Ubuntu 18.04) - 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-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ansible Rollerinin S\u00fcrekli Test Edilmesi: Molecule ve Travis CI ile U\u00e7tan Uca Bir Yakla\u015f\u0131m (Ubuntu 18.04)\" \/>\n<meta property=\"og:description\" content=\"Ansible Rollerinin S\u00fcrekli Test Edilmesi: Molecule ve Travis CI ile U\u00e7tan Uca Bir Yakla\u015f\u0131m (Ubuntu 18.04) G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen IT altya\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ansible-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-08T12:40:47+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=\"17 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Ansible Rollerinin S\u00fcrekli Test Edilmesi: Molecule ve Travis CI ile U\u00e7tan Uca Bir Yakla\u015f\u0131m (Ubuntu 18.04)\",\"datePublished\":\"2025-11-08T12:40:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/\"},\"wordCount\":2639,\"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-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ansible-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/\",\"name\":\"Ansible Rollerinin S\u00fcrekli Test Edilmesi: Molecule ve Travis CI ile U\u00e7tan Uca Bir Yakla\u015f\u0131m (Ubuntu 18.04) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-08T12:40:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ansible-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ansible Rollerinin S\u00fcrekli Test Edilmesi: Molecule ve Travis CI ile U\u00e7tan Uca Bir Yakla\u015f\u0131m (Ubuntu 18.04)\"}]},{\"@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 Rollerinin S\u00fcrekli Test Edilmesi: Molecule ve Travis CI ile U\u00e7tan Uca Bir Yakla\u015f\u0131m (Ubuntu 18.04) - 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-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/","og_locale":"tr_TR","og_type":"article","og_title":"Ansible Rollerinin S\u00fcrekli Test Edilmesi: Molecule ve Travis CI ile U\u00e7tan Uca Bir Yakla\u015f\u0131m (Ubuntu 18.04)","og_description":"Ansible Rollerinin S\u00fcrekli Test Edilmesi: Molecule ve Travis CI ile U\u00e7tan Uca Bir Yakla\u015f\u0131m (Ubuntu 18.04) G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen IT altya","og_url":"https:\/\/fatihsoysal.com\/blog\/ansible-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-08T12:40:47+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"17 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ansible-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ansible-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Ansible Rollerinin S\u00fcrekli Test Edilmesi: Molecule ve Travis CI ile U\u00e7tan Uca Bir Yakla\u015f\u0131m (Ubuntu 18.04)","datePublished":"2025-11-08T12:40:47+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ansible-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/"},"wordCount":2639,"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-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ansible-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/","url":"https:\/\/fatihsoysal.com\/blog\/ansible-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/","name":"Ansible Rollerinin S\u00fcrekli Test Edilmesi: Molecule ve Travis CI ile U\u00e7tan Uca Bir Yakla\u015f\u0131m (Ubuntu 18.04) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-08T12:40:47+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ansible-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ansible-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ansible-rollerinin-surekli-test-edilmesi-molecule-ve-travis-ci-ile-uctan-uca-bir-yaklasim-ubuntu-18-04\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ansible Rollerinin S\u00fcrekli Test Edilmesi: Molecule ve Travis CI ile U\u00e7tan Uca Bir Yakla\u015f\u0131m (Ubuntu 18.04)"}]},{"@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\/33896","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=33896"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33896\/revisions"}],"predecessor-version":[{"id":33897,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33896\/revisions\/33897"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33896"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33896"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33896"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}