{"id":37509,"date":"2026-01-07T08:40:52","date_gmt":"2026-01-07T05:40:52","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=37509"},"modified":"2026-01-07T08:40:52","modified_gmt":"2026-01-07T05:40:52","slug":"digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/","title":{"rendered":"DigitalOcean API v2&#8217;yi Ansible 2.0 ile Ubuntu 16.04 \u00dczerinde Kullanma"},"content":{"rendered":"<p><body><\/p>\n<h2>DigitalOcean API v2&#8217;yi Ansible 2.0 ile Ubuntu 16.04 \u00dczerinde Kullanma<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen dijital d\u00fcnyas\u0131nda, altyap\u0131 y\u00f6netimi giderek daha karma\u015f\u0131k hale gelmekte ve otomasyon, bu karma\u015f\u0131kl\u0131\u011f\u0131 y\u00f6netmenin anahtar\u0131 haline gelmektedir. Bulut sa\u011flay\u0131c\u0131lar\u0131, sunduklar\u0131 g\u00fc\u00e7l\u00fc API&#8217;ler arac\u0131l\u0131\u011f\u0131yla altyap\u0131n\u0131n programatik olarak y\u00f6netilmesine olanak tan\u0131rken, Ansible gibi otomasyon ara\u00e7lar\u0131 da bu API&#8217;leri kullanarak s\u00fcre\u00e7leri basitle\u015ftirmekte ve tekrarlanabilirli\u011fi sa\u011flamaktad\u0131r. Bu makale, DigitalOcean&#8217;\u0131n esnek ve g\u00fc\u00e7l\u00fc API v2&#8217;sini Ansible 2.0 ile Ubuntu 16.04 i\u015fletim sistemi \u00fczerinde nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ayr\u0131nt\u0131l\u0131 bir \u015fekilde ele alacakt\u0131r. Amac\u0131m\u0131z, DigitalOcean \u00fczerinde Droplet&#8217;ler (sanal makineler) olu\u015fturmaktan, y\u00f6netmeye ve silmeye kadar temel altyap\u0131 operasyonlar\u0131n\u0131 otomatikle\u015ftirmektir.<\/p>\n<h3>Giri\u015f: DigitalOcean, Ansible ve Otomasyonun G\u00fcc\u00fc<\/h3>\n<p>DigitalOcean, geli\u015ftiriciler ve k\u00fc\u00e7\u00fck i\u015fletmeler i\u00e7in tasarlanm\u0131\u015f, basit ve uygun maliyetli bir bulut altyap\u0131s\u0131 sa\u011flay\u0131c\u0131s\u0131d\u0131r. Droplet&#8217;ler, block storage, load balancer&#8217;lar, veritabanlar\u0131 ve daha fazlas\u0131 gibi \u00e7e\u015fitli hizmetler sunar. Bu hizmetlerin tamam\u0131, DigitalOcean API v2 arac\u0131l\u0131\u011f\u0131yla programatik olarak eri\u015filebilir ve y\u00f6netilebilir. API v2, RESTful mimariye sahip olup, HTTP istekleri ile kaynaklar\u0131 olu\u015fturma, okuma, g\u00fcncelleme ve silme (CRUD) i\u015flemlerini ger\u00e7ekle\u015ftirmeye olanak tan\u0131r.<\/p>\n<p>Ansible ise Red Hat taraf\u0131ndan geli\u015ftirilen, a\u00e7\u0131k kaynakl\u0131 bir BT otomasyon motorudur. Sunucu yap\u0131land\u0131rmas\u0131, uygulama da\u011f\u0131t\u0131m\u0131 ve g\u00f6rev otomasyonu gibi bir\u00e7ok alanda kullan\u0131l\u0131r. Ansible&#8217;\u0131n en \u00f6nemli \u00f6zelliklerinden biri, y\u00f6netilen d\u00fc\u011f\u00fcmlerde herhangi bir arac\u0131 (agent) gerektirmemesidir; SSH \u00fczerinden ba\u011flant\u0131 kurarak Python betikleri \u00e7al\u0131\u015ft\u0131r\u0131r. Bu, kurulumu ve kullan\u0131m\u0131 son derece kolay hale getirir. Ansible, YAML format\u0131nda yaz\u0131lan &#8220;playbook&#8221; ad\u0131 verilen dosyalar arac\u0131l\u0131\u011f\u0131yla otomasyon g\u00f6revlerini tan\u0131mlar.<\/p>\n<p>Ubuntu 16.04, uzun s\u00fcreli destek (LTS) sa\u011flayan, stabil ve yayg\u0131n olarak kullan\u0131lan bir Linux da\u011f\u0131t\u0131m\u0131d\u0131r. Ansible kontrol d\u00fc\u011f\u00fcm\u00fc olarak g\u00f6rev yapacak sunucumuz i\u00e7in sa\u011flam bir temel sunar. Ansible 2.0 ise, bu makale yaz\u0131ld\u0131\u011f\u0131 d\u00f6nemde yayg\u0131n olarak kullan\u0131lan ve DigitalOcean entegrasyonu i\u00e7in gerekli mod\u00fclleri i\u00e7eren bir s\u00fcr\u00fcmd\u00fcr.<\/p>\n<p>Bu \u00fc\u00e7 teknolojinin birle\u015fimi, altyap\u0131 ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc tamamen otomatikle\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc bir sinerji yarat\u0131r. Yeni bir uygulama i\u00e7in sunuculara ihtiyac\u0131n\u0131z oldu\u011funda, tek bir Ansible playbook&#8217;u \u00e7al\u0131\u015ft\u0131rarak t\u00fcm altyap\u0131y\u0131 saniyeler i\u00e7inde kurabilir, yap\u0131land\u0131rabilir ve kullan\u0131ma haz\u0131r hale getirebilirsiniz. Bu, manuel hatalar\u0131 azalt\u0131r, tutarl\u0131l\u0131\u011f\u0131 art\u0131r\u0131r ve da\u011f\u0131t\u0131m s\u00fcrelerini \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131salt\u0131r.<\/p>\n<h3>\u00d6n Ko\u015fullar ve Ortam Kurulumu<\/h3>\n<p>DigitalOcean API&#8217;sini Ansible ile kullanmaya ba\u015flamadan \u00f6nce, baz\u0131 \u00f6n ko\u015fullar\u0131n yerine getirilmesi ve geli\u015ftirme ortam\u0131n\u0131n haz\u0131rlanmas\u0131 gerekmektedir.<\/p>\n<h4>Ubuntu 16.04 Sunucusunun Haz\u0131rlanmas\u0131<\/h4>\n<p>Ansible&#8217;\u0131 \u00e7al\u0131\u015ft\u0131raca\u011f\u0131n\u0131z bir Ubuntu 16.04 sunucusuna ihtiyac\u0131n\u0131z var. Bu bir fiziksel sunucu, bir sanal makine veya DigitalOcean \u00fczerinde olu\u015fturulmu\u015f bir Droplet olabilir.<\/p>\n<p>1.  <strong>Sistem G\u00fcncellemesi:<\/strong> \u0130lk olarak, sisteminizi g\u00fcncelleyerek en son paketlere sahip oldu\u011funuzdan emin olun:<\/p>\n<pre><code class=\"language-bash\">sudo apt update\n    sudo apt upgrade -y<\/code><\/pre>\n<p>2.  <strong>Gerekli Ba\u011f\u0131ml\u0131l\u0131klar\u0131n Kurulumu:<\/strong> Ansible ve Python k\u00fct\u00fcphaneleri i\u00e7in baz\u0131 temel paketlere ihtiyac\u0131m\u0131z olacak. <code>python-minimal<\/code> ve <code>python-pip<\/code> temel Python ara\u00e7lar\u0131n\u0131 sa\u011flarken, <code>build-essential<\/code> baz\u0131 Python k\u00fct\u00fcphanelerinin derlenmesi i\u00e7in gerekli olabilir.<\/p>\n<pre><code class=\"language-bash\">sudo apt install -y python-minimal python-pip build-essential<\/code><\/pre>\n<h4>Ansible 2.0 Kurulumu<\/h4>\n<p>Ansible&#8217;\u0131 Python&#8217;\u0131n paket y\u00f6neticisi <code>pip<\/code> arac\u0131l\u0131\u011f\u0131yla kuraca\u011f\u0131z. Belirli bir s\u00fcr\u00fcm\u00fc hedeflemek i\u00e7in <code>==<\/code> operat\u00f6r\u00fcn\u00fc kullanaca\u011f\u0131z.<\/p>\n<pre><code class=\"language-bash\">sudo pip install ansible==2.0.0.2<\/code><\/pre>\n<p>Kurulumun ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 ve do\u011fru s\u00fcr\u00fcm\u00fcn y\u00fcklendi\u011fini kontrol etmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">ansible --version<\/code><\/pre>\n<p>\u00c7\u0131kt\u0131da <code>ansible 2.0.0.2<\/code> gibi bir ifade g\u00f6rmelisiniz.<\/p>\n<h4>DigitalOcean Python K\u00fct\u00fcphanesi Kurulumu<\/h4>\n<p>Ansible&#8217;\u0131n DigitalOcean mod\u00fclleri, DigitalOcean API&#8217;si ile etkile\u015fim kurmak i\u00e7in <code>python-digitalocean<\/code> k\u00fct\u00fcphanesini kullan\u0131r. Bu k\u00fct\u00fcphaneyi de <code>pip<\/code> ile kurmal\u0131y\u0131z.<\/p>\n<pre><code class=\"language-bash\">sudo pip install python-digitalocean<\/code><\/pre>\n<h4>DigitalOcean API Token Olu\u015fturma<\/h4>\n<p>DigitalOcean API&#8217;sine eri\u015fim i\u00e7in bir API token&#8217;\u0131na ihtiyac\u0131n\u0131z olacak. Bu token, API isteklerini kimli\u011finizi do\u011frulamak ve yetkilendirmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p>1.  <strong>DigitalOcean Hesab\u0131n\u0131za Giri\u015f Yap\u0131n:<\/strong> DigitalOcean kontrol panelinize (cloud.digitalocean.com) giri\u015f yap\u0131n.<br \/>\n2.  <strong>API B\u00f6l\u00fcm\u00fcne Gidin:<\/strong> Sol men\u00fcden &#8220;API&#8221; se\u00e7ene\u011fine t\u0131klay\u0131n.<br \/>\n3.  <strong>Yeni Token Olu\u015fturun:<\/strong> &#8220;Tokens\/Keys&#8221; sekmesi alt\u0131nda, &#8220;Generate New Token&#8221; d\u00fc\u011fmesine t\u0131klay\u0131n.<br \/>\n4.  <strong>Token Bilgilerini Girin:<\/strong><br \/>\n    *   <strong>Token Name:<\/strong> Token&#8217;\u0131n\u0131za anlaml\u0131 bir isim verin (\u00f6rne\u011fin, &#8220;ansible-automation&#8221;).<br \/>\n    *   <strong>Select Scopes:<\/strong> &#8220;Read&#8221; ve &#8220;Write&#8221; izinlerinin her ikisini de se\u00e7ti\u011finizden emin olun. DigitalOcean kaynaklar\u0131n\u0131 olu\u015fturmak ve y\u00f6netmek i\u00e7in &#8220;Write&#8221; izni gereklidir.<br \/>\n5.  <strong>Token&#8217;\u0131 Kopyalay\u0131n:<\/strong> Token olu\u015fturulduktan sonra, size g\u00f6sterilen uzun karakter dizisini kopyalay\u0131n. <strong>Bu token&#8217;\u0131 asla kaybetmeyin ve kimseyle payla\u015fmay\u0131n.<\/strong> Token sadece bir kez g\u00f6sterilir. Kaybolursa yenisini olu\u015fturman\u0131z gerekir. Bu token&#8217;\u0131 daha sonra Ansible playbook&#8217;lar\u0131n\u0131zda kullanaca\u011f\u0131z.<\/p>\n<h3>DigitalOcean API v2 ve Ansible Mod\u00fclleri<\/h3>\n<p>Ansible, DigitalOcean API&#8217;si ile etkile\u015fim kurmak i\u00e7in \u00f6zel mod\u00fcller sa\u011flar. Bu mod\u00fcller, API \u00e7a\u011fr\u0131lar\u0131n\u0131 soyutlayarak karma\u015f\u0131k HTTP istekleri yazmak yerine daha insan dostu YAML s\u00f6zdizimi kullanman\u0131za olanak tan\u0131r. Ansible 2.0 s\u00fcr\u00fcm\u00fcnde, DigitalOcean i\u00e7in ba\u015fl\u0131ca mod\u00fcller \u015funlard\u0131r:<\/p>\n<p>*   <code>digital_ocean_droplet<\/code>: Droplet&#8217;leri (sanal makineleri) olu\u015fturma, silme ve \u00f6zelliklerini sorgulama.<br \/>\n*   <code>digital_ocean_sshkey<\/code>: SSH anahtarlar\u0131n\u0131 DigitalOcean hesab\u0131n\u0131za ekleme veya silme.<br \/>\n*   <code>digital_ocean_domain<\/code>: Alan adlar\u0131n\u0131 (domain) DigitalOcean DNS hizmetine ekleme veya silme.<\/p>\n<p>Bu mod\u00fcller, <code>python-digitalocean<\/code> k\u00fct\u00fcphanesini arka planda kullanarak DigitalOcean API v2&#8217;ye istekler g\u00f6nderir. Ansible&#8217;\u0131n do\u011fas\u0131 gere\u011fi, bu mod\u00fcller de idempotent&#8217;tir; yani, bir i\u015flemi birden \u00e7ok kez \u00e7al\u0131\u015ft\u0131rmak, ilk \u00e7al\u0131\u015ft\u0131rmadan sonra ek bir yan etkiye neden olmaz. \u00d6rne\u011fin, zaten var olan bir Droplet&#8217;i olu\u015fturmaya \u00e7al\u0131\u015f\u0131rsan\u0131z, Ansible mevcut Droplet&#8217;i de\u011fi\u015ftirmeyecek ve ba\u015far\u0131l\u0131 bir \u015fekilde tamamlanacakt\u0131r.<\/p>\n<h3>API Token&#8217;\u0131 G\u00fcvenli Bir \u015eekilde Y\u00f6netme: Ansible Vault<\/h3>\n<p>API token&#8217;\u0131n\u0131z hassas bir bilgidir ve playbook&#8217;lar\u0131n\u0131zda do\u011frudan d\u00fcz metin olarak saklanmamal\u0131d\u0131r. Bu t\u00fcr hassas verileri y\u00f6netmek i\u00e7in Ansible Vault kullanmak en iyi uygulamad\u0131r. Ansible Vault, hassas verileri \u015fifrelemenize ve bunlar\u0131 s\u00fcr\u00fcm kontrol sisteminizde g\u00fcvenli bir \u015fekilde saklaman\u0131za olanak tan\u0131r.<\/p>\n<p>1.  <strong>Vault Dosyas\u0131 Olu\u015fturma:<\/strong><br \/>\n    \u00d6ncelikle, API token&#8217;\u0131n\u0131z\u0131 i\u00e7erecek bir vault dosyas\u0131 olu\u015ftural\u0131m.<\/p>\n<pre><code class=\"language-bash\">ansible-vault create vars\/digitalocean_vars.yml<\/code><\/pre>\n<p>    Bu komut, sizden bir parola belirlemenizi isteyecektir. Bu parolay\u0131 unutmay\u0131n, \u00e7\u00fcnk\u00fc vault dosyas\u0131n\u0131 her kulland\u0131\u011f\u0131n\u0131zda veya d\u00fczenledi\u011finizde buna ihtiyac\u0131n\u0131z olacak.<br \/>\n    Dosya a\u00e7\u0131ld\u0131\u011f\u0131nda, i\u00e7ine DigitalOcean API token&#8217;\u0131n\u0131z\u0131 ekleyin:<\/p>\n<pre><code class=\"language-yaml\"># vars\/digitalocean_vars.yml\n    digitalocean_api_token: \"sizin_digitalocean_api_tokeniniz_buraya\"<\/code><\/pre>\n<p>    Dosyay\u0131 kaydedin ve kapat\u0131n (genellikle <code>Ctrl+X<\/code>, <code>Y<\/code>, <code>Enter<\/code> ile).<\/p>\n<p>2.  <strong>Vault Dosyas\u0131n\u0131 D\u00fczenleme:<\/strong><br \/>\n    Vault dosyas\u0131n\u0131 daha sonra d\u00fczenlemek isterseniz:<\/p>\n<pre><code class=\"language-bash\">ansible-vault edit vars\/digitalocean_vars.yml<\/code><\/pre>\n<p>    Yine sizden vault parolas\u0131n\u0131 isteyecektir.<\/p>\n<h3>DigitalOcean Droplet Olu\u015fturma<\/h3>\n<p>\u015eimdi, Ansible kullanarak DigitalOcean \u00fczerinde bir Droplet olu\u015fturmak i\u00e7in bir playbook yazal\u0131m.<\/p>\n<h4>Playbook Yap\u0131s\u0131<\/h4>\n<p>Droplet olu\u015fturma playbook&#8217;umuz a\u015fa\u011f\u0131daki temel bile\u015fenlere sahip olacakt\u0131r:<\/p>\n<p>*   <code>hosts: localhost<\/code>: Ansible kontrol d\u00fc\u011f\u00fcm\u00fcm\u00fcz \u00fczerinden DigitalOcean API&#8217;sini \u00e7a\u011f\u0131raca\u011f\u0131m\u0131z i\u00e7in hedefimiz <code>localhost<\/code> olacakt\u0131r.<br \/>\n*   <code>connection: local<\/code>: <code>localhost<\/code> ile yerel bir ba\u011flant\u0131 kullanaca\u011f\u0131m\u0131z\u0131 belirtir.<br \/>\n*   <code>gather_facts: no<\/code>: <code>localhost<\/code> i\u00e7in sistem bilgilerini toplamak gereksiz oldu\u011fundan, bunu devre d\u0131\u015f\u0131 b\u0131rak\u0131r\u0131z.<br \/>\n*   <code>vars_files<\/code>: API token&#8217;\u0131m\u0131z\u0131 i\u00e7eren vault dosyam\u0131z\u0131 bu k\u0131s\u0131mda tan\u0131mlar\u0131z.<br \/>\n*   <code>tasks<\/code>: Droplet olu\u015fturma g\u00f6revini i\u00e7erecektir.<\/p>\n<h4>\u00d6rnek Playbook: <code>create_droplet.yml<\/code><\/h4>\n<pre><code class=\"language-yaml\">---\n- name: DigitalOcean'da bir Droplet olu\u015ftur\n  hosts: localhost\n  connection: local\n  gather_facts: no\n  vars_files:\n    - vars\/digitalocean_vars.yml # API token'\u0131m\u0131z\u0131 i\u00e7eren vault dosyas\u0131\n\n  tasks:\n    - name: Yeni bir Ubuntu Droplet olu\u015ftur\n      digital_ocean_droplet:\n        api_token: \"{{ digitalocean_api_token }}\"\n        name: my-ansible-droplet\n        region: fra1 # Frankfurt 1 b\u00f6lgesi\n        size: s-1vcpu-1gb # 1 vCPU, 1GB RAM\n        image: ubuntu-16-04-x64 # Ubuntu 16.04 64-bit imaj\u0131\n        ssh_keys: # Hesab\u0131n\u0131zdaki SSH anahtar\u0131n\u0131n parmak izi veya ad\u0131\n          - \"your_ssh_key_fingerprint_or_name\" # \u00d6rn: \"4c:2c:1e:...\" veya \"my-ssh-key\"\n        wait: yes # Droplet olu\u015fturulana kadar bekle\n        state: present # Droplet'in var olmas\u0131n\u0131 sa\u011fla\n      register: new_droplet_info\n\n    - name: Olu\u015fturulan Droplet'in IP adresini ve bilgilerini g\u00f6ster\n      debug:\n        msg: \"Droplet IP Adresi: {{ new_droplet_info.droplet.networks.v4[0].ip_address }}, ID: {{ new_droplet_info.droplet.id }}\"<\/code><\/pre>\n<p><strong><code>ssh_keys<\/code> Alan\u0131 Hakk\u0131nda \u00d6nemli Not:<\/strong><br \/>\n<code>ssh_keys<\/code> alan\u0131, DigitalOcean hesab\u0131n\u0131za \u00f6nceden y\u00fckledi\u011finiz SSH anahtarlar\u0131n\u0131n parmak izlerini (fingerprint) veya adlar\u0131n\u0131 bekler. Yeni bir SSH anahtar\u0131 eklemek i\u00e7in DigitalOcean kontrol panelini kullanabilir veya <code>digital_ocean_sshkey<\/code> Ansible mod\u00fcl\u00fcn\u00fc kullanabilirsiniz. Parmak izini veya ad\u0131, DigitalOcean kontrol panelinizdeki &#8220;Settings > Security&#8221; b\u00f6l\u00fcm\u00fcnden bulabilirsiniz. Bu, Droplet olu\u015fturuldu\u011funda otomatik olarak SSH eri\u015fimi sa\u011flamak i\u00e7in \u00f6nemlidir.<\/p>\n<h4>Playbook&#8217;u \u00c7al\u0131\u015ft\u0131rma<\/h4>\n<p>Playbook&#8217;u \u00e7al\u0131\u015ft\u0131rmak i\u00e7in a\u015fa\u011f\u0131daki komutu kullan\u0131n:<\/p>\n<pre><code class=\"language-bash\">ansible-playbook create_droplet.yml --ask-vault-pass<\/code><\/pre>\n<p>Komut sizden vault parolas\u0131n\u0131 isteyecektir. Do\u011fru parolay\u0131 girdikten sonra Ansible, Droplet&#8217;i olu\u015fturmaya ba\u015flayacakt\u0131r. <code>wait: yes<\/code> sayesinde Droplet tamamen haz\u0131r olana kadar bekleyecek ve ard\u0131ndan IP adresini ve ID&#8217;sini ekrana yazd\u0131racakt\u0131r.<\/p>\n<p>DigitalOcean kontrol panelinize giderek Droplet&#8217;in ba\u015far\u0131yla olu\u015fturuldu\u011funu do\u011frulayabilirsiniz.<\/p>\n<h3>Olu\u015fturulan Droplet&#8217;e Ba\u011flanma ve Yap\u0131land\u0131rma<\/h3>\n<p>Droplet&#8217;i olu\u015fturduktan sonra, genellikle \u00fczerine yaz\u0131l\u0131m kurmak veya yap\u0131land\u0131rma yapmak istersiniz. Ansible, <code>add_host<\/code> mod\u00fcl\u00fc ile yeni olu\u015fturulan Droplet&#8217;i dinamik olarak envanterine ekleyebilir ve ard\u0131ndan di\u011fer g\u00f6revleri bu Droplet \u00fczerinde \u00e7al\u0131\u015ft\u0131rabilir.<\/p>\n<p>A\u015fa\u011f\u0131daki playbook, yeni olu\u015fturulan Droplet&#8217;e Nginx web sunucusunu kuracakt\u0131r.<\/p>\n<pre><code class=\"language-yaml\">---\n- name: DigitalOcean'da bir Droplet olu\u015ftur ve yap\u0131land\u0131r\n  hosts: localhost\n  connection: local\n  gather_facts: no\n  vars_files:\n    - vars\/digitalocean_vars.yml\n\n  tasks:\n    - name: Yeni bir Ubuntu Droplet olu\u015ftur\n      digital_ocean_droplet:\n        api_token: \"{{ digitalocean_api_token }}\"\n        name: my-ansible-webserver\n        region: fra1\n        size: s-1vcpu-1gb\n        image: ubuntu-16-04-x64\n        ssh_keys:\n          - \"your_ssh_key_fingerprint_or_name\"\n        wait: yes\n        state: present\n      register: webserver_droplet_info\n\n    - name: Olu\u015fturulan Droplet'in IP adresini g\u00f6ster\n      debug:\n        msg: \"Web Sunucusu Droplet IP Adresi: {{ webserver_droplet_info.droplet.networks.v4[0].ip_address }}\"\n\n    - name: Yeni Droplet'i dinamik envantere ekle\n      add_host:\n        hostname: \"{{ webserver_droplet_info.droplet.networks.v4[0].ip_address }}\"\n        group: webservers\n        ansible_user: root # Droplet olu\u015fturulurken root kullan\u0131c\u0131s\u0131 varsay\u0131lan olarak gelir.\n        ansible_ssh_private_key_file: \"~\/.ssh\/id_rsa\" # SSH anahtar\u0131n\u0131z\u0131n yolu\n\n- name: Web sunucusunu yap\u0131land\u0131r\n  hosts: webservers\n  become: yes # G\u00f6revleri root ayr\u0131cal\u0131klar\u0131yla \u00e7al\u0131\u015ft\u0131r\n  gather_facts: yes\n\n  tasks:\n    - name: Nginx paketlerini g\u00fcncelle ve kur\n      apt:\n        name: nginx\n        state: latest\n        update_cache: yes\n\n    - name: Nginx servisini ba\u015flat ve ba\u015flang\u0131\u00e7ta etkinle\u015ftir\n      service:\n        name: nginx\n        state: started\n        enabled: yes\n\n    - name: Nginx varsay\u0131lan index.html dosyas\u0131n\u0131 de\u011fi\u015ftir\n      copy:\n        content: \"\"\n        dest: \/var\/www\/html\/index.nginx-debian.html\n        mode: '0644'\n\n    - name: Nginx servisini yeniden ba\u015flat\n      service:\n        name: nginx\n        state: restarted<\/code><\/pre>\n<p><strong><code>ansible_ssh_private_key_file<\/code> Hakk\u0131nda:<\/strong><br \/>\nBu k\u0131s\u0131m, Ansible&#8217;\u0131n yeni olu\u015fturulan Droplet&#8217;e SSH ile ba\u011flanmak i\u00e7in kullanaca\u011f\u0131 \u00f6zel anahtar dosyas\u0131n\u0131n yolunu belirtir. Genellikle bu, <code>~\/.ssh\/id_rsa<\/code> veya <code>~\/.ssh\/your_key_name<\/code> gibi bir yoldur. Droplet olu\u015fturulurken ekledi\u011finiz SSH anahtar\u0131n\u0131n kar\u015f\u0131l\u0131\u011f\u0131 olan \u00f6zel anahtar\u0131n kontrol d\u00fc\u011f\u00fcm\u00fcn\u00fczde bulundu\u011fundan emin olun.<\/p>\n<p>Bu playbook&#8217;u \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra, <code>webserver_droplet_info.droplet.networks.v4[0].ip_address<\/code> ile elde etti\u011finiz IP adresini bir web taray\u0131c\u0131s\u0131nda ziyaret ederek Nginx&#8217;in \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve \u00f6zel mesaj\u0131n\u0131z\u0131 g\u00f6rebilirsiniz.<\/p>\n<h3>DigitalOcean Droplet Y\u00f6netimi<\/h3>\n<p><code>digital_ocean_droplet<\/code> mod\u00fcl\u00fc, Droplet&#8217;leri olu\u015fturman\u0131n yan\u0131 s\u0131ra y\u00f6netmek i\u00e7in de kullan\u0131labilir.<\/p>\n<h4>Droplet Bilgilerini Alma<\/h4>\n<p>Var olan bir Droplet&#8217;in bilgilerini almak i\u00e7in <code>state: present<\/code> ile <code>register<\/code> kullanabilirsiniz. E\u011fer Droplet zaten varsa, Ansible onu de\u011fi\u015ftirmeyecek, ancak bilgilerini kaydedecektir.<\/p>\n<pre><code class=\"language-yaml\">---\n- name: Mevcut bir Droplet'in bilgilerini al\n  hosts: localhost\n  connection: local\n  gather_facts: no\n  vars_files:\n    - vars\/digitalocean_vars.yml\n\n  tasks:\n    - name: \"my-ansible-droplet\" isimli Droplet'in bilgilerini sorgula\n      digital_ocean_droplet:\n        api_token: \"{{ digitalocean_api_token }}\"\n        name: my-ansible-droplet\n        state: present # Sadece bilgi sorgulama amac\u0131yla da kullan\u0131labilir\n      register: existing_droplet_info\n\n    - name: Droplet bilgilerini g\u00f6ster\n      debug:\n        var: existing_droplet_info.droplet<\/code><\/pre>\n<h4>Droplet&#8217;i Yeniden Adland\u0131rma veya Boyutland\u0131rma<\/h4>\n<p><code>digital_ocean_droplet<\/code> mod\u00fcl\u00fc, Droplet&#8217;in ad\u0131n\u0131 veya boyutunu de\u011fi\u015ftirmek i\u00e7in de kullan\u0131labilir. Mod\u00fcl, <code>name<\/code> veya <code>size<\/code> parametresindeki bir de\u011fi\u015fikli\u011fi alg\u0131lad\u0131\u011f\u0131nda ilgili API \u00e7a\u011fr\u0131s\u0131n\u0131 yapacakt\u0131r. Boyutland\u0131rma (resizing) i\u015flemi i\u00e7in Droplet&#8217;in kapal\u0131 olmas\u0131 gerekebilir (DigitalOcean&#8217;\u0131n politikalar\u0131na g\u00f6re).<\/p>\n<pre><code class=\"language-yaml\">---\n- name: Droplet'i yeniden adland\u0131r ve boyutunu de\u011fi\u015ftir\n  hosts: localhost\n  connection: local\n  gather_facts: no\n  vars_files:\n    - vars\/digitalocean_vars.yml\n\n  tasks:\n    - name: Droplet'i kapat (boyutland\u0131rma i\u00e7in gerekebilir)\n      # Not: digital_ocean_droplet mod\u00fcl\u00fc do\u011frudan kapatma\/a\u00e7ma sa\u011flamaz.\n      # Bu t\u00fcr eylemler i\u00e7in DigitalOcean API'sine do\u011frudan 'uri' mod\u00fcl\u00fc ile \u00e7a\u011fr\u0131 yapman\u0131z veya\n      # daha yeni Ansible koleksiyonlar\u0131ndaki 'digitalocean_droplet_action' gibi mod\u00fclleri kullanman\u0131z gerekebilir.\n      # Ansible 2.0 i\u00e7in bu, elle veya 'uri' mod\u00fcl\u00fc ile yap\u0131labilir.\n      # Bu makale 2.0'a odakland\u0131\u011f\u0131ndan, bu k\u0131s\u0131m genellikle manuel m\u00fcdahale gerektirir veya\n      # 'uri' mod\u00fcl\u00fc ile karma\u015f\u0131k bir API \u00e7a\u011fr\u0131s\u0131 olurdu.\n      # Basitlik ad\u0131na, bu ad\u0131m\u0131 atlay\u0131p, boyutland\u0131rma i\u00e7in Droplet'in kapal\u0131 oldu\u011funu varsayal\u0131m.\n      debug:\n        msg: \"Droplet'in boyutland\u0131rma \u00f6ncesi kapal\u0131 oldu\u011fundan emin olun.\"\n\n    - name: Droplet'in ad\u0131n\u0131 ve boyutunu de\u011fi\u015ftir\n      digital_ocean_droplet:\n        api_token: \"{{ digitalocean_api_token }}\"\n        name: my-ansible-webserver # Eski isim\n        new_name: my-renamed-webserver # Yeni isim\n        size: s-1vcpu-2gb # Yeni boyut (\u00f6rne\u011fin 2GB RAM)\n        state: present\n        wait: yes\n      register: resized_droplet_info\n\n    - name: Yeniden adland\u0131r\u0131lan\/boyutland\u0131r\u0131lan Droplet bilgilerini g\u00f6ster\n      debug:\n        var: resized_droplet_info.droplet<\/code><\/pre>\n<p><strong>\u00d6nemli Not:<\/strong> Ansible 2.0&#8217;daki <code>digital_ocean_droplet<\/code> mod\u00fcl\u00fc do\u011frudan Droplet&#8217;i kapatma veya ba\u015flatma gibi eylemleri desteklemez; daha \u00e7ok <code>present<\/code> (olu\u015ftur\/var et) ve <code>absent<\/code> (sil) durumlar\u0131n\u0131 y\u00f6netir. Droplet boyutland\u0131rma gibi baz\u0131 i\u015flemler i\u00e7in Droplet&#8217;in kapal\u0131 olmas\u0131 gerekebilir. Bu t\u00fcr bir senaryoda, DigitalOcean API&#8217;sine do\u011frudan <code>uri<\/code> mod\u00fcl\u00fc ile bir <code>POST<\/code> iste\u011fi g\u00f6ndererek Droplet&#8217;i kapatman\u0131z veya ba\u015flatman\u0131z gerekebilir. Veya manuel olarak kontrol panelinden kapat\u0131p sonra Ansible ile boyutland\u0131rma i\u015flemini yapabilirsiniz. Ansible&#8217;\u0131n daha yeni s\u00fcr\u00fcmleri (\u00f6rne\u011fin 2.9+ ve <code>community.digitalocean<\/code> koleksiyonu) <code>digitalocean_droplet_action<\/code> gibi mod\u00fcllerle bu t\u00fcr eylemleri daha kolay y\u00f6netebilir.<\/p>\n<h3>DigitalOcean Droplet Silme<\/h3>\n<p>Bir Droplet&#8217;i silmek de <code>digital_ocean_droplet<\/code> mod\u00fcl\u00fc ile olduk\u00e7a basittir. <code>state: absent<\/code> parametresi kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-yaml\">---\n- name: DigitalOcean'da bir Droplet'i sil\n  hosts: localhost\n  connection: local\n  gather_facts: no\n  vars_files:\n    - vars\/digitalocean_vars.yml\n\n  tasks:\n    - name: \"my-renamed-webserver\" isimli Droplet'i sil\n      digital_ocean_droplet:\n        api_token: \"{{ digitalocean_api_token }}\"\n        name: my-renamed-webserver # Silinecek Droplet'in ad\u0131\n        state: absent # Droplet'in var olmamas\u0131n\u0131 sa\u011fla (yani sil)\n      register: deleted_droplet_info\n\n    - name: Silme i\u015fleminin sonucunu g\u00f6ster\n      debug:\n        var: deleted_droplet_info<\/code><\/pre>\n<p>Bu playbook&#8217;u \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, belirtti\u011finiz isimdeki Droplet DigitalOcean hesab\u0131n\u0131zdan silinecektir. <strong>Bu i\u015flem geri al\u0131namaz oldu\u011fundan dikkatli olun.<\/strong><\/p>\n<h3>Di\u011fer DigitalOcean Kaynaklar\u0131 ile \u00c7al\u0131\u015fma (K\u0131saca)<\/h3>\n<p>Ansible 2.0, Droplet&#8217;lerin yan\u0131 s\u0131ra DigitalOcean&#8217;daki di\u011fer baz\u0131 temel kaynaklar\u0131 y\u00f6netmek i\u00e7in de mod\u00fcller sunar.<\/p>\n<h4>SSH Anahtarlar\u0131 Ekleme\/Silme<\/h4>\n<p><code>digital_ocean_sshkey<\/code> mod\u00fcl\u00fc ile SSH anahtarlar\u0131n\u0131z\u0131 DigitalOcean hesab\u0131n\u0131za ekleyebilir veya kald\u0131rabilirsiniz.<\/p>\n<pre><code class=\"language-yaml\">---\n- name: DigitalOcean'a bir SSH anahtar\u0131 ekle\n  hosts: localhost\n  connection: local\n  gather_facts: no\n  vars_files:\n    - vars\/digitalocean_vars.yml\n\n  tasks:\n    - name: Yeni bir SSH anahtar\u0131 ekle\n      digital_ocean_sshkey:\n        api_token: \"{{ digitalocean_api_token }}\"\n        name: my-ansible-ssh-key\n        public_key: \"{{ lookup('file', '~\/.ssh\/id_rsa.pub') }}\" # Genel anahtar dosyan\u0131z\u0131n yolu\n        state: present\n      register: sshkey_info\n\n    - name: Eklenen SSH anahtar\u0131n\u0131n bilgilerini g\u00f6ster\n      debug:\n        var: sshkey_info<\/code><\/pre>\n<p><code>lookup('file', ...)<\/code> eklentisi, belirtilen dosyan\u0131n i\u00e7eri\u011fini okuyarak <code>public_key<\/code> parametresine aktar\u0131r.<\/p>\n<h4>Alan Adlar\u0131 (Domains) Y\u00f6netimi<\/h4>\n<p><code>digital_ocean_domain<\/code> mod\u00fcl\u00fc ile alan adlar\u0131n\u0131 DigitalOcean DNS hizmetinize ekleyebilir veya silebilirsiniz.<\/p>\n<pre><code class=\"language-yaml\">---\n- name: DigitalOcean'a bir alan ad\u0131 ekle\n  hosts: localhost\n  connection: local\n  gather_facts: no\n  vars_files:\n    - vars\/digitalocean_vars.yml\n\n  tasks:\n    - name: \"example.com\" alan ad\u0131n\u0131 ekle\n      digital_ocean_domain:\n        api_token: \"{{ digitalocean_api_token }}\"\n        name: example.com\n        ip_address: \"{{ my_webserver_ip }}\" # Alan ad\u0131n\u0131 y\u00f6nlendirece\u011finiz IP adresi\n        state: present\n      register: domain_info\n\n    - name: Eklenen alan ad\u0131n\u0131n bilgilerini g\u00f6ster\n      debug:\n        var: domain_info<\/code><\/pre>\n<p>Bu playbook&#8217;ta <code>my_webserver_ip<\/code> de\u011fi\u015fkenini, daha \u00f6nce olu\u015fturdu\u011funuz Droplet&#8217;in IP adresiyle de\u011fi\u015ftirmelisiniz.<\/p>\n<h3>Geli\u015fmi\u015f Konular ve \u0130yi Uygulamalar<\/h3>\n<p>DigitalOcean API&#8217;sini Ansible ile kullan\u0131rken verimlili\u011fi ve y\u00f6netilebilirli\u011fi art\u0131rmak i\u00e7in baz\u0131 geli\u015fmi\u015f konulara ve iyi uygulamalara de\u011finelim.<\/p>\n<h4>Idempotency&#8217;nin \u00d6nemi<\/h4>\n<p>Ansible mod\u00fclleri, do\u011falar\u0131 gere\u011fi idempotent&#8217;tir. Bu, bir playbook&#8217;u birden \u00e7ok kez \u00e7al\u0131\u015ft\u0131rman\u0131n her zaman ayn\u0131 sonucu verece\u011fi anlam\u0131na gelir. \u00d6rne\u011fin, zaten var olan bir Droplet&#8217;i olu\u015fturmaya \u00e7al\u0131\u015f\u0131rsan\u0131z, Ansible herhangi bir de\u011fi\u015fiklik yapmayacak ve g\u00f6revi &#8220;ok&#8221; olarak i\u015faretleyecektir. Bu \u00f6zellik, altyap\u0131n\u0131z\u0131n her zaman istedi\u011finiz durumda olmas\u0131n\u0131 sa\u011flamak i\u00e7in kritik \u00f6neme sahiptir ve tekrarlayan da\u011f\u0131t\u0131mlar veya yap\u0131land\u0131rma g\u00fcncellemeleri i\u00e7in idealdir.<\/p>\n<h4>Roller ve Yeniden Kullan\u0131labilirlik<\/h4>\n<p>Karma\u015f\u0131k altyap\u0131lar\u0131 y\u00f6netirken, playbook&#8217;lar\u0131n\u0131z\u0131 &#8220;roller&#8221; halinde d\u00fczenlemek iyi bir uygulamad\u0131r. Roller, g\u00f6revleri, de\u011fi\u015fkenleri, \u015fablonlar\u0131 ve dosyalar\u0131 mant\u0131ksal birimler halinde grupland\u0131rarak playbook&#8217;lar\u0131n\u0131z\u0131 daha mod\u00fcler, okunabilir ve yeniden kullan\u0131labilir hale getirir. \u00d6rne\u011fin, bir <code>digitalocean_droplet<\/code> rol\u00fc, bir Droplet&#8217;i olu\u015fturmak ve temel yap\u0131land\u0131rmas\u0131n\u0131 yapmak i\u00e7in t\u00fcm ad\u0131mlar\u0131 i\u00e7erebilir.<\/p>\n<pre><code class=\"language-bash\"># \u00d6rnek rol yap\u0131s\u0131\nmy_digitalocean_role\/\n\u251c\u2500\u2500 defaults\/\n\u2502   \u2514\u2500\u2500 main.yml\n\u251c\u2500\u2500 tasks\/\n\u2502   \u2514\u2500\u2500 main.yml\n\u251c\u2500\u2500 templates\/\n\u251c\u2500\u2500 handlers\/\n\u2514\u2500\u2500 meta\/<\/code><\/pre>\n<h4>Dinamik Envanter<\/h4>\n<p>Ansible&#8217;\u0131n dinamik envanter \u00f6zelli\u011fi, mevcut DigitalOcean Droplet&#8217;lerini otomatik olarak ke\u015ffederek envanterinize eklemenize olanak tan\u0131r. Bu, \u00f6zellikle s\u00fcrekli de\u011fi\u015fen veya \u00f6l\u00e7eklenen bulut altyap\u0131lar\u0131 i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131d\u0131r. Ansible 2.0 d\u00f6neminde bu genellikle Python&#8217;da yaz\u0131lm\u0131\u015f harici bir betik arac\u0131l\u0131\u011f\u0131yla yap\u0131l\u0131rd\u0131. Bu betik, DigitalOcean API&#8217;sini sorgulayarak mevcut Droplet&#8217;lerin bir listesini ve ilgili IP adreslerini Ansible&#8217;\u0131n anlayaca\u011f\u0131 bir JSON format\u0131nda d\u00f6nd\u00fcr\u00fcrd\u00fc. Bu sayede, playbook&#8217;lar\u0131n\u0131z\u0131 \u00f6nceden tan\u0131mlanm\u0131\u015f statik bir envanter dosyas\u0131 yerine, o anki ger\u00e7ek altyap\u0131 durumuna g\u00f6re \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/p>\n<h4>Hata Y\u00f6netimi ve <code>failed_when<\/code><\/h4>\n<p>Otomasyon s\u00fcre\u00e7lerinde hatalar\u0131 y\u00f6netmek \u00f6nemlidir. Ansible, g\u00f6revlerin ba\u015far\u0131s\u0131z olma ko\u015fullar\u0131n\u0131 tan\u0131mlamak i\u00e7in <code>failed_when<\/code> gibi direktifler sunar. \u00d6rne\u011fin, bir API \u00e7a\u011fr\u0131s\u0131n\u0131n belirli bir hata kodu d\u00f6nd\u00fcrmesi durumunda g\u00f6revi ba\u015far\u0131s\u0131z olarak i\u015faretleyebilirsiniz. Ayr\u0131ca, <code>ignore_errors: yes<\/code> kullanarak belirli g\u00f6revlerin hatalar\u0131n\u0131 yok sayabilir ve playbook&#8217;un \u00e7al\u0131\u015fmaya devam etmesini sa\u011flayabilirsiniz, ancak bu dikkatli kullan\u0131lmal\u0131d\u0131r.<\/p>\n<h4>S\u00fcr\u00fcm Kontrol\u00fc<\/h4>\n<p>Ansible playbook&#8217;lar\u0131n\u0131z\u0131, vault dosyalar\u0131n\u0131z\u0131 ve envanter dosyalar\u0131n\u0131z\u0131 Git gibi bir s\u00fcr\u00fcm kontrol sistemiyle y\u00f6netmek vazge\u00e7ilmez bir iyi uygulamad\u0131r. Bu, de\u011fi\u015fiklikleri izlemenize, i\u015fbirli\u011fi yapman\u0131za ve gerekti\u011finde \u00f6nceki s\u00fcr\u00fcmlere geri d\u00f6nmenize olanak tan\u0131r. Ansible Vault sayesinde hassas verileri bile Git deposunda g\u00fcvenle saklayabilirsiniz.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, DigitalOcean API v2&#8217;yi Ansible 2.0 ile Ubuntu 16.04 \u00fczerinde kullanarak altyap\u0131n\u0131z\u0131 nas\u0131l otomatikle\u015ftirebilece\u011finizi ad\u0131m ad\u0131m inceledik. DigitalOcean API token&#8217;\u0131 olu\u015fturmaktan, Ansible kontrol d\u00fc\u011f\u00fcm\u00fcn\u00fc haz\u0131rlamaya, Droplet&#8217;ler olu\u015fturmaya, yap\u0131land\u0131rmaya ve silmeye kadar temel i\u015flemleri ele ald\u0131k. Ayr\u0131ca SSH anahtarlar\u0131 ve alan adlar\u0131 gibi di\u011fer DigitalOcean kaynaklar\u0131n\u0131n y\u00f6netimine de k\u0131saca de\u011findik.<\/p>\n<p>Ansible&#8217;\u0131n g\u00fcc\u00fc ve DigitalOcean&#8217;\u0131n esnekli\u011fi bir araya geldi\u011finde, altyap\u0131 y\u00f6netimi s\u00fcre\u00e7lerinizde \u00f6nemli \u00f6l\u00e7\u00fcde verimlilik ve tutarl\u0131l\u0131k sa\u011flayabilirsiniz. Manuel hatalar\u0131 azalt\u0131r, da\u011f\u0131t\u0131m s\u00fcrelerini k\u0131salt\u0131r ve &#8220;altyap\u0131 kod olarak&#8221; (Infrastructure as Code &#8211; IaC) prensiplerini uygulayarak daha sa\u011flam ve s\u00fcrd\u00fcr\u00fclebilir bir altyap\u0131 elde edersiniz.<\/p>\n<p>Bu makaledeki \u00f6rnekler, DigitalOcean ve Ansible ile otomasyon yolculu\u011funuza ba\u015flaman\u0131z i\u00e7in sa\u011flam bir temel sunmaktad\u0131r. Daha karma\u015f\u0131k senaryolar i\u00e7in DigitalOcean API v2 dok\u00fcmantasyonunu ve Ansible&#8217;\u0131n DigitalOcean mod\u00fcllerine ait resmi dok\u00fcmantasyonu incelemeyi unutmay\u0131n. Otomasyon d\u00fcnyas\u0131 geni\u015ftir ve ke\u015ffedilmeyi bekleyen bir\u00e7ok olanak sunar.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"DigitalOcean API v2&#8217;yi Ansible 2.0 ile Ubuntu 16.04 \u00dczerinde Kullanma\nG\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen dijital d\u00fcnyas\u0131nda, altyap\u0131 y\u00f6netimi gidere","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-37509","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>DigitalOcean API v2&#039;yi Ansible 2.0 ile Ubuntu 16.04 \u00dczerinde Kullanma - 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\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"DigitalOcean API v2&#039;yi Ansible 2.0 ile Ubuntu 16.04 \u00dczerinde Kullanma\" \/>\n<meta property=\"og:description\" content=\"DigitalOcean API v2&#039;yi Ansible 2.0 ile Ubuntu 16.04 \u00dczerinde Kullanma G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen dijital d\u00fcnyas\u0131nda, altyap\u0131 y\u00f6netimi gidere\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-07T05:40:52+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\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"DigitalOcean API v2&#8217;yi Ansible 2.0 ile Ubuntu 16.04 \u00dczerinde Kullanma\",\"datePublished\":\"2026-01-07T05:40:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/\"},\"wordCount\":2531,\"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\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/\",\"name\":\"DigitalOcean API v2'yi Ansible 2.0 ile Ubuntu 16.04 \u00dczerinde Kullanma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-07T05:40:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DigitalOcean API v2&#8217;yi Ansible 2.0 ile Ubuntu 16.04 \u00dczerinde Kullanma\"}]},{\"@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":"DigitalOcean API v2'yi Ansible 2.0 ile Ubuntu 16.04 \u00dczerinde Kullanma - 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\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/","og_locale":"tr_TR","og_type":"article","og_title":"DigitalOcean API v2'yi Ansible 2.0 ile Ubuntu 16.04 \u00dczerinde Kullanma","og_description":"DigitalOcean API v2'yi Ansible 2.0 ile Ubuntu 16.04 \u00dczerinde Kullanma G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen dijital d\u00fcnyas\u0131nda, altyap\u0131 y\u00f6netimi gidere","og_url":"https:\/\/fatihsoysal.com\/blog\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-07T05:40:52+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\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"DigitalOcean API v2&#8217;yi Ansible 2.0 ile Ubuntu 16.04 \u00dczerinde Kullanma","datePublished":"2026-01-07T05:40:52+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/"},"wordCount":2531,"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\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/","url":"https:\/\/fatihsoysal.com\/blog\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/","name":"DigitalOcean API v2'yi Ansible 2.0 ile Ubuntu 16.04 \u00dczerinde Kullanma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-07T05:40:52+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/digitalocean-api-v2yi-ansible-2-0-ile-ubuntu-16-04-uzerinde-kullanma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"DigitalOcean API v2&#8217;yi Ansible 2.0 ile Ubuntu 16.04 \u00dczerinde Kullanma"}]},{"@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\/37509","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=37509"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37509\/revisions"}],"predecessor-version":[{"id":37510,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37509\/revisions\/37510"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37509"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37509"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37509"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}