{"id":421,"date":"2026-09-01T13:19:52","date_gmt":"2026-09-01T13:19:52","guid":{"rendered":"https:\/\/www.vps.tc\/blog\/?p=421"},"modified":"2026-09-01T09:50:05","modified_gmt":"2026-09-01T09:50:05","slug":"cloud-init-nedir-vps-kurulumunu-otomatiklestirme","status":"publish","type":"post","link":"https:\/\/www.vps.tc\/blog\/tr\/cloud-init-nedir-vps-kurulumunu-otomatiklestirme\/","title":{"rendered":"Cloud-Init Nedir? VPS Kurulumunu Otomatikle\u015ftirme"},"content":{"rendered":"<div class=\"aiw-toc\" style=\"border:1px solid #dbe3ea;border-radius:8px;padding:16px 20px;margin:0 0 28px\"><strong>\u0130\u00e7indekiler<\/strong><\/p>\n<ol style=\"margin:10px 0 0;padding-left:22px\">\n<li><a href=\"#cloud-init-nedir-ve-vps-kurulumunda-ne-ise-yarar\">Cloud-init nedir ve VPS kurulumunda ne i\u015fe yarar?<\/a><\/li>\n<li><a href=\"#ilk-acilista-hangi-parcalar-calisir\">\u0130lk a\u00e7\u0131l\u0131\u015fta hangi par\u00e7alar \u00e7al\u0131\u015f\u0131r?<\/a><\/li>\n<li><a href=\"#cloud-image-metadata-ve-user-data\">Cloud image, metadata ve user-data<\/a><\/li>\n<li><a href=\"#ilk-calisan-user-data-dosyasi\">\u0130lk \u00e7al\u0131\u015fan user-data dosyas\u0131<\/a><\/li>\n<li><a href=\"#dosya-yazma-servis-baslatma-ve-runcmd-tuzaklari\">Dosya yazma, servis ba\u015flatma ve runcmd tuzaklar\u0131<\/a><\/li>\n<li><a href=\"#cloud-init-ile-klasik-kurulum-scripti-ayni-sey-degil\">Cloud-init ile klasik kurulum script&#039;i ayn\u0131 \u015fey de\u011fil<\/a><\/li>\n<li><a href=\"#cloud-init-neden-calismadi\">Cloud-init neden \u00e7al\u0131\u015fmad\u0131?<\/a><\/li>\n<li><a href=\"#guvenlik-ve-uretim-kullanimi\">G\u00fcvenlik ve \u00fcretim kullan\u0131m\u0131<\/a><\/li>\n<li><a href=\"#gercek-bir-vps-akisi-nasil-gorunur\">Ger\u00e7ek bir VPS ak\u0131\u015f\u0131 nas\u0131l g\u00f6r\u00fcn\u00fcr?<\/a><\/li>\n<li><a href=\"#hangi-isleri-cloud-inite-birakmalisiniz\">Hangi i\u015fleri cloud-init&#039;e b\u0131rakmal\u0131s\u0131n\u0131z?<\/a><\/li>\n<li><a href=\"#cloud-init-kullanmaya-nereden-baslamali\">Cloud-init kullanmaya nereden ba\u015flamal\u0131?<\/a><\/li>\n<li><a href=\"#sik-sorulan-sorular\">S\u0131k Sorulan Sorular<\/a><\/li>\n<\/ol>\n<\/div>\n<h2 id=\"cloud-init-nedir-ve-vps-kurulumunda-ne-ise-yarar\">Cloud-init nedir ve VPS kurulumunda ne i\u015fe yarar?<\/h2>\n<p>Yeni bir VPS a\u00e7t\u0131\u011f\u0131n\u0131zda ilk birka\u00e7 saat \u00e7o\u011fu zaman ayn\u0131 i\u015fleri tekrar ederek ge\u00e7er: paket listelerini g\u00fcncellemek, y\u00f6netim kullan\u0131c\u0131s\u0131 olu\u015fturmak, SSH anahtar\u0131n\u0131 eklemek, saat dilimini ayarlamak, swap haz\u0131rlamak ve temel servisleri kurmak. Bir sunucuda bu b\u00fcy\u00fck bir sorun de\u011fildir. Be\u015finci, onuncu veya ayn\u0131 \u00f6zelliklerle a\u00e7\u0131lacak ellinci VPS&#8217;te ise elle yap\u0131lan her i\u015flem yeni bir hata ihtimali ta\u015f\u0131r.<\/p>\n<p>Cloud-init burada i\u015fe yarar. Linux tabanl\u0131 bulut sunucular\u0131n ilk a\u00e7\u0131l\u0131\u015fta temel i\u015fletim sistemi ve kullan\u0131c\u0131 ayarlar\u0131n\u0131 otomatik uygulayan servisidir. VPS sa\u011flay\u0131c\u0131s\u0131ndan ald\u0131\u011f\u0131 metadata ile sizin g\u00f6nderdi\u011finiz user-data&#8217;y\u0131 okuyarak hostname, kullan\u0131c\u0131, SSH anahtar\u0131, a\u011f ayarlar\u0131, paketler ve ilk \u00e7al\u0131\u015ft\u0131r\u0131lacak komutlarla ilgili i\u015flemleri y\u00fcr\u00fct\u00fcr.<\/p>\n<p>Kritik ayr\u0131nt\u0131 \u015fu: Cloud-init \u00e7o\u011fu zaman i\u015fletim sistemi kurmaz. Sa\u011flay\u0131c\u0131n\u0131n sundu\u011fu cloud image zaten diske yaz\u0131lm\u0131\u015f ve ilk a\u00e7\u0131l\u0131\u015fa haz\u0131rd\u0131r. Cloud-init bu haz\u0131r imaj\u0131 sizin istedi\u011finiz sunucuya d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.<\/p>\n<p>\u0130lk kulland\u0131\u011f\u0131mda onu k\u00fc\u00e7\u00fck bir Ansible dosyas\u0131 gibi d\u00fc\u015f\u00fcnm\u00fc\u015ft\u00fcm. K\u0131sa s\u00fcrede yan\u0131ld\u0131\u011f\u0131m\u0131 g\u00f6rd\u00fcm. Cloud-init makine ilk kez a\u00e7\u0131l\u0131rken \u00e7al\u0131\u015f\u0131r; Ansible ise genellikle SSH eri\u015fimi haz\u0131r olan sisteme sonradan ba\u011flan\u0131r. Ba\u015flang\u0131\u00e7 noktalar\u0131 farkl\u0131d\u0131r.<\/p>\n<h2 id=\"ilk-acilista-hangi-parcalar-calisir\">\u0130lk a\u00e7\u0131l\u0131\u015fta hangi par\u00e7alar \u00e7al\u0131\u015f\u0131r?<\/h2>\n<p>Cloud-init, da\u011f\u0131t\u0131m ve s\u00fcr\u00fcme g\u00f6re baz\u0131 ayr\u0131nt\u0131lar\u0131 de\u011fi\u015fse de i\u015flemleri birka\u00e7 a\u015famada y\u00fcr\u00fct\u00fcr. Bir VPS&#8217;in a\u00e7\u0131l\u0131\u015f\u0131n\u0131 incelerken bu s\u0131ralamay\u0131 bilmek, &#8220;kullan\u0131c\u0131 neden olu\u015fmad\u0131?&#8221; veya &#8220;paket kurulumu neden bekliyor?&#8221; sorular\u0131n\u0131 daralt\u0131r.<\/p>\n<ul>\n<li><strong>Generator ve local a\u015famas\u0131:<\/strong> Sistem, cloud-init&#8217;in \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmayaca\u011f\u0131n\u0131 ve hangi veri kayna\u011f\u0131n\u0131 kullanaca\u011f\u0131n\u0131 belirler.<\/li>\n<li><strong>Network a\u015famas\u0131:<\/strong> A\u011f haz\u0131rland\u0131ktan sonra instance metadata ve user-data al\u0131nabilir.<\/li>\n<li><strong>Config a\u015famas\u0131:<\/strong> Kullan\u0131c\u0131lar, SSH anahtarlar\u0131, paket depolar\u0131, hostname ve dosyalar gibi ayarlar uygulan\u0131r.<\/li>\n<li><strong>Final a\u015famas\u0131:<\/strong> <code>runcmd<\/code> gibi ilk a\u00e7\u0131l\u0131\u015f komutlar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. Paket kurulumu tamamlanmad\u0131ysa bu a\u015fama bekledi\u011finizden ge\u00e7 bitebilir.<\/li>\n<\/ul>\n<p>Ubuntu cloud image \u00fczerinde ilgili servisleri \u015fu komutlarla g\u00f6rebilirsiniz:<\/p>\n<pre><code>systemctl status cloud-init-local.service\nsystemctl status cloud-init.service\nsystemctl status cloud-config.service\nsystemctl status cloud-final.service<\/code><\/pre>\n<p>Son sat\u0131rdaki servis \u00f6zellikle de\u011ferlidir. <code>runcmd<\/code> komutlar\u0131 benim kulland\u0131\u011f\u0131m Ubuntu imajlar\u0131nda \u00e7o\u011funlukla <code>cloud-final.service<\/code> a\u015famas\u0131nda \u00e7al\u0131\u015f\u0131yor. Bir testte SSH ba\u011flant\u0131s\u0131 gelir gelmez sistem haz\u0131r sand\u0131m; paket kurulumu h\u00e2l\u00e2 devam ediyordu. Ard\u0131ndan verdi\u011fim komutlar beklenmedik bi\u00e7imde ba\u015far\u0131s\u0131z oldu. Erken ba\u011flanmak, haz\u0131r olmak demek de\u011fil.<\/p>\n<h2 id=\"cloud-image-metadata-ve-user-data\">Cloud image, metadata ve user-data<\/h2>\n<p>Cloud-init&#8217;i anlamak i\u00e7in \u00fc\u00e7 par\u00e7ay\u0131 ay\u0131r\u0131n. Cloud image, i\u015fletim sisteminin bulut kullan\u0131m\u0131na haz\u0131rlanm\u0131\u015f imaj\u0131d\u0131r. Metadata, makinenin ad\u0131, instance kimli\u011fi, a\u011f bilgileri ve sa\u011flay\u0131c\u0131ya \u00f6zg\u00fc tan\u0131mlard\u0131r. User-data ise sizin g\u00f6nderdi\u011finiz yap\u0131land\u0131rmad\u0131r.<\/p>\n<p>Sa\u011flay\u0131c\u0131 bu verileri farkl\u0131 y\u00f6ntemlerle sunabilir. OpenStack ve bir\u00e7ok ticari bulut platformu metadata servisi kullan\u0131r. Evdeki Proxmox laboratuvar\u0131mda ise NoCloud veri kayna\u011f\u0131yla \u00e7al\u0131\u015f\u0131yorum. Bu y\u00f6ntemde bir seed ISO veya uygun bir disk \u00fczerinde <code>user-data<\/code> ve <code>meta-data<\/code> dosyalar\u0131 bulunur.<\/p>\n<p>Proxmox&#8217;taki her sanal makine cloud-init ile kendili\u011finden uyumlu olmaz. Bir cloud image indirmeniz, onu template&#8217;e d\u00f6n\u00fc\u015ft\u00fcrmeniz, cloud-init diskini eklemeniz ve IP, gateway ile DNS gibi bilgileri sa\u011flaman\u0131z gerekir. Haz\u0131rl\u0131k bir kez yap\u0131l\u0131r; sonras\u0131nda template&#8217;ten olu\u015fturulan makinelerde user-data kullanabilirsiniz.<\/p>\n<p>Ben template do\u011frulamas\u0131n\u0131 bir kez aceleye getirip kapal\u0131 VM&#8217;den klon ald\u0131m. Klon a\u00e7\u0131ld\u0131, fakat hostname ve a\u011f ayarlar\u0131 bekledi\u011fim gibi de\u011fildi; seri konsolda eski makineye ait ayarlar\u0131 g\u00f6r\u00fcyordum. Sorun user-data&#8217;da de\u011fil, template&#8217;i temizlemeden ve test klonu a\u00e7madan kullanmamdayd\u0131. O g\u00fcnden beri her template i\u00e7in k\u00fc\u00e7\u00fck bir klon a\u00e7\u0131yor, hostname, a\u011f ve SSH eri\u015fimini kontrol etmeden onu \u00fcretim kayna\u011f\u0131 yapm\u0131yorum.<\/p>\n<h2 id=\"ilk-calisan-user-data-dosyasi\">\u0130lk \u00e7al\u0131\u015fan user-data dosyas\u0131<\/h2>\n<p>User-data \u00e7o\u011funlukla YAML bi\u00e7iminde yaz\u0131l\u0131r ve ilk sat\u0131rda <code>#cloud-config<\/code> bulunur. YAML girintiye kar\u015f\u0131 hassast\u0131r; sekme kullanmay\u0131n. Dosyay\u0131 \u00f6nce bir YAML do\u011frulay\u0131c\u0131dan ge\u00e7iriyor, sonra k\u00fc\u00e7\u00fck bir test VM&#8217;inde deniyorum. Tek bo\u015fluk bile yanl\u0131\u015f mod\u00fcl\u00fcn atlanmas\u0131na yetebilir.<\/p>\n<pre><code>#cloud-config\nhostname: web-01\nmanage_etc_hosts: true\n\nusers:\n  - name: deploy\n    gecos: Deployment User\n    groups: [adm, sudo]\n    shell: \/bin\/bash\n    sudo: \"ALL=(ALL) NOPASSWD:ALL\"\n    lock_passwd: true\n    ssh_authorized_keys:\n      - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... kullanici@laptop\n\npackage_update: true\npackage_upgrade: false\npackages:\n  - nginx\n  - curl\n  - vim\n\nwrite_files:\n  - path: \/etc\/motd\n    owner: root:root\n    permissions: '0644'\n    content: |\n      Managed by cloud-init\n\nruncmd:\n  - systemctl enable --now nginx\n  - [ sh, -c, \"echo 'cloud-init tamamlandi' &gt;&gt; \/var\/log\/first-boot.log\" ]<\/code><\/pre>\n<p>Bu \u00f6rnekte <code>deploy<\/code> kullan\u0131c\u0131s\u0131 parola ile giri\u015f yapam\u0131yor, SSH anahtar\u0131yla ba\u011flan\u0131yor ve sudo yetkisine sahip oluyor. Ger\u00e7ek anahtar\u0131 k\u0131salt\u0131lm\u0131\u015f bi\u00e7imde g\u00f6sterdim. User-data sa\u011flay\u0131c\u0131 panelinde, metadata servisinde veya seed ISO&#8217;da tutulabilece\u011fi i\u00e7in \u00f6zel anahtar\u0131n\u0131z\u0131 kesinlikle bu dosyaya koymay\u0131n.<\/p>\n<p><code>package_update<\/code> paket listelerini g\u00fcnceller, <code>packages<\/code> listesi istenen paketleri kurar. <code>package_upgrade: true<\/code> ilk a\u00e7\u0131l\u0131\u015fta b\u00fct\u00fcn sistemi y\u00fckseltebilir; \u00fcretim template&#8217;lerinde bunu geli\u015fig\u00fczel a\u00e7m\u0131yorum. Kernel veya kritik k\u00fct\u00fcphane g\u00fcncellemeleri yeniden ba\u015flatma ihtiyac\u0131 do\u011furabilir.<\/p>\n<h3>users b\u00f6l\u00fcm\u00fcyle g\u00fcvenli ba\u015flang\u0131\u00e7<\/h3>\n<p>Bir\u00e7ok cloud image varsay\u0131lan kullan\u0131c\u0131yla gelir. Ubuntu&#8217;da bu kullan\u0131c\u0131 \u00e7o\u011fu zaman <code>ubuntu<\/code>, Debian imajlar\u0131nda ise <code>debian<\/code> olabilir. Sa\u011flay\u0131c\u0131n\u0131n dok\u00fcmantasyonuna bakmadan do\u011frudan <code>root<\/code> ile SSH a\u00e7mak yerine ilk user-data i\u00e7inde ki\u015fisel bir y\u00f6netim kullan\u0131c\u0131s\u0131 olu\u015fturmay\u0131 tercih ederim.<\/p>\n<p>Parola ile SSH eri\u015fimini kapatmak i\u00e7in \u015fu ayarlar\u0131 kullanabilirsiniz:<\/p>\n<pre><code>ssh_pwauth: false\n\nusers:\n  - default\n  - name: sysadmin\n    groups: [sudo]\n    shell: \/bin\/bash\n    lock_passwd: true\n    ssh_authorized_keys:\n      - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... sysadmin@workstation<\/code><\/pre>\n<p><code>users: - default<\/code> sat\u0131r\u0131 cloud image&#8217;\u0131n varsay\u0131lan kullan\u0131c\u0131s\u0131n\u0131 korur. Bu sat\u0131r\u0131 kald\u0131rd\u0131\u011f\u0131n\u0131zda da\u011f\u0131t\u0131ma g\u00f6re ilk eri\u015fim hesab\u0131n\u0131 kaybedebilirsiniz. SSH portunu de\u011fi\u015ftirmek tek ba\u015f\u0131na g\u00fcvenlik de\u011fildir; do\u011fru anahtar kullan\u0131m\u0131, parola giri\u015finin kapat\u0131lmas\u0131, g\u00fcncel paketler ve firewall kurallar\u0131 birlikte d\u00fc\u015f\u00fcn\u00fclmelidir.<\/p>\n<h2 id=\"dosya-yazma-servis-baslatma-ve-runcmd-tuzaklari\">Dosya yazma, servis ba\u015flatma ve runcmd tuzaklar\u0131<\/h2>\n<p><code>write_files<\/code>, ilk a\u00e7\u0131l\u0131\u015fta belirli i\u00e7erikleri belirli dosyalara yazmak i\u00e7in kullan\u0131\u015fl\u0131d\u0131r. Nginx site tan\u0131m\u0131, systemd unit dosyas\u0131 veya uygulaman\u0131n k\u00fc\u00e7\u00fck bir konfig\u00fcrasyonu bu \u015fekilde yerle\u015ftirilebilir.<\/p>\n<pre><code>write_files:\n  - path: \/etc\/systemd\/system\/example.service\n    permissions: '0644'\n    content: |\n      [Unit]\n      Description=Example service\n      After=network-online.target\n\n      [Service]\n      Type=simple\n      ExecStart=\/usr\/local\/bin\/example\n      Restart=on-failure\n      User=deploy\n\n      [Install]\n      WantedBy=multi-user.target\n\nruncmd:\n  - [ systemctl, daemon-reload ]\n  - [ systemctl, enable, --now, example.service ]<\/code><\/pre>\n<p>Servis dosyas\u0131 yaz\u0131lmadan \u00f6nce ilgili binary&#8217;nin ger\u00e7ekten mevcut oldu\u011fundan emin olun. <code>write_files<\/code> dosyay\u0131 olu\u015fturur; program\u0131 kurmaz. <code>runcmd<\/code> komutlar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131lmak \u00fczere kaydeder ve \u00e7o\u011funlukla final a\u015famas\u0131nda y\u00fcr\u00fct\u00fcr.<\/p>\n<p>Shell de\u011fi\u015fkenleri ve \u00f6zel karakterler ba\u015fka bir tuzakt\u0131r. YAML i\u00e7inde \u015fu kullan\u0131m bekledi\u011finiz sonucu vermeyebilir:<\/p>\n<pre><code>runcmd:\n  - echo $HOME &gt; \/tmp\/home.txt<\/code><\/pre>\n<p>Komutun hangi shell ortam\u0131nda ve hangi kullan\u0131c\u0131yla \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 varsaymak yerine a\u00e7\u0131k yaz\u0131n:<\/p>\n<pre><code>runcmd:\n  - [ sh, -c, 'printf \"%sn\" \"$HOME\" &gt; \/tmp\/home.txt' ]<\/code><\/pre>\n<p>Komutlar\u0131 tekrar \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda sistemi bozmayacak \u015fekilde tasarlay\u0131n. Bir dosyaya her a\u00e7\u0131l\u0131\u015fta sat\u0131r ekleyen <code>echo ... &gt;&gt;<\/code> komutu, ayn\u0131 instance i\u00e7in yeniden \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda gereksiz tekrarlar \u00fcretir. Cloud-init ilk kurulum i\u00e7in uygundur; s\u00fcrekli konfig\u00fcrasyon y\u00f6netimi gerekti\u011finde Ansible&#8217;a ge\u00e7mek daha temizdir. <a href=\"https:\/\/www.vps.tc\/blog\/tr\/vps-docker-kurulumu-ilk-konteyner\/\">VPS&#8217;te Docker Kurulumu ve \u0130lk Konteyneri \u00c7al\u0131\u015ft\u0131rma<\/a> yaz\u0131s\u0131ndaki kurulum ad\u0131mlar\u0131n\u0131 user-data ile ba\u015flatabilirsiniz, fakat Docker servisinin ve grup de\u011fi\u015fikliklerinin ilk a\u00e7\u0131l\u0131\u015fta ne zaman etkili oldu\u011funu test etmeden canl\u0131 sisteme ta\u015f\u0131may\u0131n.<\/p>\n<h2 id=\"cloud-init-ile-klasik-kurulum-scripti-ayni-sey-degil\">Cloud-init ile klasik kurulum script&#8217;i ayn\u0131 \u015fey de\u011fil<\/h2>\n<p>\u0130lk bak\u0131\u015fta ikisi de sunucu a\u00e7\u0131l\u0131nca komut \u00e7al\u0131\u015ft\u0131r\u0131yor gibi g\u00f6r\u00fcn\u00fcr. Fark, cloud-init&#8217;in i\u015fletim sistemi ve bulut metadata s\u00fcrecinin par\u00e7as\u0131 olmas\u0131d\u0131r. Sa\u011flay\u0131c\u0131n\u0131n verdi\u011fi instance kimli\u011fini, a\u011f bilgisini ve SSH anahtarlar\u0131n\u0131 kullanabilir; mod\u00fclleri belirli a\u015famalarda \u00e7al\u0131\u015ft\u0131r\u0131r ve bir\u00e7ok i\u015flem i\u00e7in durum kayd\u0131 tutar.<\/p>\n<table>\n<thead>\n<tr>\n<th>Y\u00f6ntem<\/th>\n<th>G\u00fc\u00e7l\u00fc taraf\u0131<\/th>\n<th>Dikkat edilmesi gereken<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Cloud-init<\/td>\n<td>\u0130lk a\u00e7\u0131l\u0131\u015fta kullan\u0131c\u0131, paket ve temel sistem ayarlar\u0131n\u0131 yapar<\/td>\n<td>Cloud image ve do\u011fru datasource gerekir<\/td>\n<\/tr>\n<tr>\n<td>Shell script<\/td>\n<td>Basit ve h\u0131zl\u0131 prototip haz\u0131rlan\u0131r<\/td>\n<td>Hata y\u00f6netimi, tekrar \u00e7al\u0131\u015ft\u0131rma ve i\u015flem s\u0131ras\u0131 size kal\u0131r<\/td>\n<\/tr>\n<tr>\n<td>Ansible<\/td>\n<td>Tekrarlanabilir, okunabilir ve mevcut makineleri de y\u00f6netebilir<\/td>\n<td>SSH eri\u015fimi, Python ve ayr\u0131 bir kontrol makinesi gerekir<\/td>\n<\/tr>\n<tr>\n<td>Terraform<\/td>\n<td>VPS ve a\u011f gibi altyap\u0131 kaynaklar\u0131n\u0131 tan\u0131mlar<\/td>\n<td>\u0130\u015fletim sistemi i\u00e7i ayr\u0131nt\u0131lar i\u00e7in tek ba\u015f\u0131na yeterli de\u011fildir<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Benim pratik ak\u0131\u015f\u0131m genellikle \u015f\u00f6yle: Terraform veya sa\u011flay\u0131c\u0131 paneliyle VPS&#8217;i olu\u015fturmak, cloud-init ile ilk eri\u015fim ve temel g\u00fcvenli\u011fi haz\u0131rlamak, ard\u0131ndan Ansible ile uygulama katman\u0131n\u0131 kurmak. Tek VPS i\u00e7in YAML ve Ansible birlikte fazla gelebilir. Ayn\u0131 kurulumu \u00fc\u00e7\u00fcnc\u00fc kez elle yap\u0131yorsan\u0131z otomasyon borcunuz birikmi\u015ftir.<\/p>\n<h2 id=\"cloud-init-neden-calismadi\">Cloud-init neden \u00e7al\u0131\u015fmad\u0131?<\/h2>\n<p>\u0130lk bakaca\u011f\u0131m yer loglard\u0131r. Sunucuyu yeniden ba\u015flatmak \u00e7o\u011fu zaman sorunu \u00e7\u00f6zmez; yaln\u0131zca nedenini g\u00f6rmeyi zorla\u015ft\u0131rabilir.<\/p>\n<pre><code>cloud-init status --long\ncloud-init query ds\njournalctl -u cloud-init -u cloud-config -u cloud-final --no-pager\nless \/var\/log\/cloud-init.log\nless \/var\/log\/cloud-init-output.log<\/code><\/pre>\n<p><code>cloud-init status --long<\/code> \u00e7\u0131kt\u0131s\u0131nda <code>status: done<\/code> g\u00f6rmeniz i\u015flemin tamamland\u0131\u011f\u0131n\u0131 s\u00f6yler; yap\u0131land\u0131rman\u0131n do\u011fru oldu\u011fu anlam\u0131na gelmez. <code>cloud-init-output.log<\/code>, \u00f6zellikle <code>runcmd<\/code> \u00e7\u0131kt\u0131s\u0131n\u0131 ve komutlar\u0131n standart hata mesajlar\u0131n\u0131 bulmak i\u00e7in yararl\u0131d\u0131r. Ben bir seferinde &#8220;done&#8221; sat\u0131r\u0131n\u0131 ba\u015far\u0131 kabul edip uygulama servisini kontrol etmeden bilgi verdim. Logun ilerleyen sat\u0131rlar\u0131nda paket deposunun DNS \u00e7\u00f6zemedi\u011fini g\u00f6rd\u00fcm.<\/p>\n<p><code>cloud-init query ds<\/code> komutu her imajda ayn\u0131 \u00e7\u0131kt\u0131y\u0131 vermeyebilir. NoCloud kullan\u0131rken metadata dosyas\u0131ndaki instance kimli\u011fi ve seed diskinin ba\u011flant\u0131s\u0131 \u00f6nemlidir. Ayn\u0131 instance ID ile snapshot veya template klonlamak da cloud-init&#8217;in bu makineyi daha \u00f6nce g\u00f6rd\u00fc\u011f\u00fcn\u00fc d\u00fc\u015f\u00fcnmesine yol a\u00e7abilir.<\/p>\n<p>YAML bi\u00e7imini yerel makinenizde kontrol edebilirsiniz:<\/p>\n<pre><code>python3 - &lt;&lt;'PY'\nimport sys\ntry:\n    import yaml\nexcept ImportError:\n    print(\"PyYAML kurulu de\u011fil\", file=sys.stderr)\n    sys.exit(1)\nwith open(\"user-data\", encoding=\"utf-8\") as f:\n    yaml.safe_load(f)\nprint(\"YAML tamam\")\nPY<\/code><\/pre>\n<p>Bu kontrol yaln\u0131zca YAML s\u00f6zdizimini do\u011frular. <code>sudo<\/code> bi\u00e7iminin do\u011fru olmas\u0131, paketin da\u011f\u0131t\u0131m deposunda bulunmas\u0131 veya komutun do\u011fru kullan\u0131c\u0131yla \u00e7al\u0131\u015fmas\u0131 gibi ayr\u0131nt\u0131lar\u0131 denetlemez.<\/p>\n<h3>Bir kez mi \u00e7al\u0131\u015f\u0131r, tekrar \u00e7al\u0131\u015ft\u0131r\u0131labilir mi?<\/h3>\n<p>Cloud-init bir\u00e7ok mod\u00fcl i\u00e7in instance kimli\u011fi ve durum dosyalar\u0131 tutar. User-data&#8217;y\u0131 de\u011fi\u015ftirip ayn\u0131 VPS&#8217;i yeniden ba\u015flatt\u0131\u011f\u0131n\u0131zda b\u00fct\u00fcn ayarlar\u0131n tekrar uygulanmas\u0131n\u0131 beklemeyin. Test s\u0131ras\u0131nda s\u0131f\u0131rlamak i\u00e7in \u015fu komut kullan\u0131labilir:<\/p>\n<pre><code>sudo cloud-init clean --logs --seed\nsudo reboot<\/code><\/pre>\n<p>Bu komutu \u00fcretim makinesinde rastgele \u00e7al\u0131\u015ft\u0131rmay\u0131n. Cloud-init&#8217;i yeni bir ilk a\u00e7\u0131l\u0131\u015f gibi davranmaya zorlayabilir ve user-data i\u00e7indeki paket, kullan\u0131c\u0131 veya servis i\u015flemlerini yeniden tetikleyebilir. Test VM&#8217;inde i\u015fe yarayan y\u00f6ntem, canl\u0131 VPS&#8217;te bak\u0131m plan\u0131 olmadan uygulanacak bir d\u00fczeltme de\u011fildir.<\/p>\n<p>Yeni instance olu\u015fturmak \u00e7o\u011fu durumda mevcut makinenin state bilgisini silmekten daha g\u00fcvenlidir. Template haz\u0131rlarken cloud-init temizlenmeli, eski SSH host anahtarlar\u0131 ve makineye \u00f6zel kimlik bilgileri imaja g\u00f6m\u00fclmemelidir.<\/p>\n<h2 id=\"guvenlik-ve-uretim-kullanimi\">G\u00fcvenlik ve \u00fcretim kullan\u0131m\u0131<\/h2>\n<p>User-data&#8217;n\u0131n nerede sakland\u0131\u011f\u0131n\u0131 biliyor musunuz? Baz\u0131 bulut sa\u011flay\u0131c\u0131lar\u0131nda instance metadata servisine yetkili s\u00fcre\u00e7ler eri\u015febilir. Panel ge\u00e7mi\u015fi, Terraform state dosyas\u0131 veya debug \u00e7\u0131kt\u0131s\u0131 i\u00e7inde de user-data kalabilir. Parolalar\u0131, API anahtarlar\u0131n\u0131 ve \u00f6zel SSH anahtarlar\u0131n\u0131 d\u00fcz metin olarak yazmay\u0131n.<\/p>\n<ul>\n<li>SSH i\u00e7in parola yerine anahtar tabanl\u0131 eri\u015fim kullan\u0131n.<\/li>\n<li>\u0130lk kullan\u0131c\u0131ya yaln\u0131zca gereken sudo yetkisini verin; m\u00fcmk\u00fcnse ayr\u0131cal\u0131kl\u0131 komutlar\u0131 s\u0131n\u0131rlay\u0131n.<\/li>\n<li>API anahtar\u0131 gerekiyorsa secret manager, sa\u011flay\u0131c\u0131n\u0131n secret mekanizmas\u0131 veya k\u0131sa \u00f6m\u00fcrl\u00fc token kullan\u0131n.<\/li>\n<li>Cloud-init ile kurulan firewall kurallar\u0131n\u0131n mevcut SSH oturumunu kesmeyece\u011fini test edin.<\/li>\n<li>Cloud image ve cloud-init paketini g\u00fcncel tutun, fakat y\u00fckseltmeyi kontrols\u00fcz bi\u00e7imde t\u00fcm \u00fcretim makinelerine yaymay\u0131n.<\/li>\n<li>\u0130lk a\u00e7\u0131l\u0131\u015f loglar\u0131nda token, parola veya \u00f6zel anahtar kalmad\u0131\u011f\u0131n\u0131 kontrol edin.<\/li>\n<\/ul>\n<p>Temel g\u00fcvenlik ad\u0131mlar\u0131n\u0131 otomasyona eklemek istiyorsan\u0131z <a href=\"https:\/\/www.vps.tc\/blog\/tr\/linux-sunucu-guvenligi-icin-zorunlu-10-temel-adim\/\">Linux Sunucu G\u00fcvenli\u011fi i\u00e7in Zorunlu 10 Temel Ad\u0131m<\/a> yaz\u0131s\u0131ndaki maddeleri user-data ve Ansible g\u00f6revlerine ay\u0131rabilirsiniz. Ben firewall ve SSH ayar\u0131n\u0131 cloud-init ile m\u00fcmk\u00fcn oldu\u011funca erken yap\u0131yorum; uygulama servislerinin ayr\u0131nt\u0131lar\u0131n\u0131 daha sonra y\u00f6netiyorum. \u0130lk a\u00e7\u0131l\u0131\u015f ba\u015far\u0131s\u0131z olsa bile eri\u015fim ve te\u015fhis kanallar\u0131 b\u00f6ylece daha belirgin kal\u0131yor.<\/p>\n<h2 id=\"gercek-bir-vps-akisi-nasil-gorunur\">Ger\u00e7ek bir VPS ak\u0131\u015f\u0131 nas\u0131l g\u00f6r\u00fcn\u00fcr?<\/h2>\n<p>Ubuntu 24.04 cloud image \u00fczerinden web sunucusu a\u00e7aca\u011f\u0131n\u0131z\u0131 d\u00fc\u015f\u00fcnelim. \u00d6nce sa\u011flay\u0131c\u0131n\u0131n cloud-init deste\u011fini, kabul etti\u011fi user-data bi\u00e7imini ve a\u011f ayarlar\u0131n\u0131n otomatik verilip verilmedi\u011fini kontrol edin. Ard\u0131ndan k\u00fc\u00e7\u00fck bir yap\u0131land\u0131rmayla ba\u015flay\u0131n: kullan\u0131c\u0131, SSH anahtar\u0131, hostname ve tek bir test paketi.<\/p>\n<pre><code>#cloud-config\nhostname: web-01\nfqdn: web-01.example.net\nmanage_etc_hosts: true\nssh_pwauth: false\npackage_update: true\npackages:\n  - nginx\n\nusers:\n  - default\n  - name: deploy\n    groups: [sudo]\n    shell: \/bin\/bash\n    lock_passwd: true\n    sudo: \"ALL=(ALL) NOPASSWD:ALL\"\n    ssh_authorized_keys:\n      - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... deploy@laptop\n\nruncmd:\n  - [ systemctl, enable, --now, nginx ]\n  - [ sh, -c, \"printf '%sn' 'first boot ok' &gt; \/var\/log\/first-boot-check.log\" ]<\/code><\/pre>\n<p>Makineye ba\u011fland\u0131ktan sonra yaln\u0131zca Nginx&#8217;in \u00e7al\u0131\u015fmas\u0131na bakmay\u0131n. Kullan\u0131c\u0131 anahtarla giri\u015f yapabiliyor mu, hostname do\u011fru mu, apt i\u015flemi tamamland\u0131 m\u0131, cloud-init hata kaydetmi\u015f mi kontrol edin:<\/p>\n<pre><code>hostnamectl\nid deploy\nsudo systemctl is-active nginx\nsudo cloud-init status --long\nsudo tail -n 30 \/var\/log\/cloud-init-output.log<\/code><\/pre>\n<p>Bu kontrolleri bir shell script&#8217;i veya Ansible do\u011frulama g\u00f6revi haline getirebilirsiniz. <a href=\"https:\/\/www.vps.tc\/blog\/tr\/vps-mysql-kurulumu-guvenli-yapilandirma\/\">VPS&#8217;te MySQL Kurulumu ve G\u00fcvenli Yap\u0131land\u0131rma<\/a> gibi hassas servislerde uzun bir <code>runcmd<\/code> listesi yerine \u00f6nce temel sistemi kurup ard\u0131ndan konfig\u00fcrasyon y\u00f6netimiyle ilerlemeyi daha g\u00fcvenli buluyorum. MySQL root parolas\u0131n\u0131 user-data&#8217;ya koymak \u00f6zellikle k\u00f6t\u00fc bir fikirdir.<\/p>\n<h2 id=\"hangi-isleri-cloud-inite-birakmalisiniz\">Hangi i\u015fleri cloud-init&#8217;e b\u0131rakmal\u0131s\u0131n\u0131z?<\/h2>\n<p>\u0130lk a\u00e7\u0131l\u0131\u015f\u0131n do\u011fas\u0131na uygun i\u015fler k\u0131sa, \u00f6ng\u00f6r\u00fclebilir ve makinenin temel eri\u015fimiyle ilgili olmal\u0131. Kullan\u0131c\u0131 olu\u015fturma, SSH anahtar\u0131, hostname, timezone, paket deposu, birka\u00e7 paket ve basit systemd aktivasyonu iyi adaylard\u0131r.<\/p>\n<p>Uygulaman\u0131n b\u00fct\u00fcn da\u011f\u0131t\u0131m\u0131n\u0131 tek bir <code>runcmd<\/code> blo\u011funa s\u0131k\u0131\u015ft\u0131rmak k\u0131r\u0131lgan bir yap\u0131 kurar. Uzun Docker Compose kurulumlar\u0131, veritaban\u0131 \u015femalar\u0131, d\u0131\u015f servislere ait secret&#8217;lar ve ba\u015far\u0131s\u0131z oldu\u011funda geri alma gerektiren migration i\u015flemleri i\u00e7in ayr\u0131 bir s\u00fcre\u00e7 kullan\u0131n. Cloud-init ba\u015far\u0131s\u0131z bir komutun ard\u0131ndan sonraki komutlar\u0131 \u00e7al\u0131\u015ft\u0131rmaya devam edebilir; bunu shell mant\u0131\u011f\u0131yla ayr\u0131ca kontrol etmeniz gerekir.<\/p>\n<pre><code>runcmd:\n  - [ sh, -c, 'set -euxo pipefail; \/usr\/local\/bin\/bootstrap-app' ]<\/code><\/pre>\n<p>Buradaki <code>set -euxo pipefail<\/code> hata ay\u0131klamay\u0131 kolayla\u015ft\u0131rabilir, fakat her script i\u00e7in k\u00f6rlemesine uygun de\u011fildir. Secret i\u00e7eren de\u011fi\u015fkenler <code>-x<\/code> ile loglara yaz\u0131labilir. \u00dcretim user-data&#8217;s\u0131nda hata g\u00f6r\u00fcn\u00fcrl\u00fc\u011f\u00fcyle gizlilik aras\u0131nda denge kurun.<\/p>\n<p>\u0130maj haz\u0131rlarken cloud-init temizlenmeli, template&#8217;in her klonda yeni bir instance gibi davranmas\u0131 sa\u011flanmal\u0131 ve SSH host anahtarlar\u0131n\u0131n yeniden \u00fcretilmesi planlanmal\u0131d\u0131r. Proxmox&#8217;ta template&#8217;i kapatmadan klon almak gibi aceleci i\u015flemler, ayn\u0131 hostname veya eski a\u011f bilgisinin iki makinede g\u00f6r\u00fcnmesine yol a\u00e7abilir. Ben template&#8217;i kapatt\u0131ktan sonra test klonu a\u00e7\u0131yor, seri konsol ve SSH \u00fczerinden do\u011frulama yap\u0131yorum.<\/p>\n<h2 id=\"cloud-init-kullanmaya-nereden-baslamali\">Cloud-init kullanmaya nereden ba\u015flamal\u0131?<\/h2>\n<p>\u00d6nce sa\u011flay\u0131c\u0131n\u0131z\u0131n sundu\u011fu tek bir Ubuntu veya Debian cloud image se\u00e7in. \u0130ki da\u011f\u0131t\u0131m\u0131 ayn\u0131 user-data ile y\u00f6netmeye \u00e7al\u0131\u015fmak, paket adlar\u0131 ve varsay\u0131lan kullan\u0131c\u0131lar y\u00fcz\u00fcnden gereksiz karma\u015fa \u00e7\u0131kar\u0131r. K\u00fc\u00e7\u00fck bir dosya yaz\u0131n; kullan\u0131c\u0131 ve SSH anahtar\u0131 \u00e7al\u0131\u015fmadan Nginx, Docker veya veritaban\u0131 kurulumuna ge\u00e7meyin.<\/p>\n<p>Dosyay\u0131 s\u00fcr\u00fcm kontrol\u00fcnde tutacaksan\u0131z ger\u00e7ek anahtarlar\u0131 ve secret&#8217;lar\u0131 depoya g\u00f6ndermeyin. Template&#8217;in cloud-init loglar\u0131n\u0131 ve servis durumlar\u0131n\u0131 izleyin. Ba\u015far\u0131l\u0131 bir ilk a\u00e7\u0131l\u0131\u015f yaln\u0131zca VPS&#8217;in ping&#8217;e cevap vermesi de\u011fildir; beklenen kullan\u0131c\u0131yla g\u00fcvenli giri\u015f, do\u011fru hostname, tamamlanm\u0131\u015f paket kurulumu ve temiz loglar birlikte de\u011ferlendirilmelidir.<\/p>\n<p>Cloud-init nedir sorusunun pratik cevab\u0131 benim i\u00e7in \u015fu: VPS&#8217;in ilk a\u00e7\u0131l\u0131\u015f\u0131n\u0131 tekrarlanabilir, denetlenebilir ve daha az elle m\u00fcdahale gerektiren bir s\u00fcrece \u00e7eviren ba\u015flang\u0131\u00e7 otomasyon katman\u0131d\u0131r. Her i\u015fi onun i\u00e7ine koymam. Do\u011fru s\u0131n\u0131r\u0131 \u00e7izdi\u011finizde ayn\u0131 kurulumu \u00fc\u00e7\u00fcnc\u00fc kez yaparken hem zaman hem hata pay\u0131 kazan\u0131rs\u0131n\u0131z. Yine de son kontrol\u00fc atlam\u0131yorum; otomasyon, kontrol listesinin yerini alm\u0131yor, onu daha g\u00fcvenilir hale getiriyor.<\/p>\n<h2 id=\"sik-sorulan-sorular\">S\u0131k Sorulan Sorular<\/h2>\n<h3>Cloud-init t\u00fcm VPS&#8217;lerde \u00e7al\u0131\u015f\u0131r m\u0131?<\/h3>\n<p>Hay\u0131r. Sa\u011flay\u0131c\u0131n\u0131n cloud-init deste\u011fi, kullan\u0131lan cloud image ve veri kayna\u011f\u0131n\u0131n do\u011fru yap\u0131land\u0131r\u0131lmas\u0131 gerekir. Klasik ISO ile kurulmu\u015f her VPS&#8217;te cloud-init otomatik olarak haz\u0131r gelmeyebilir.<\/p>\n<h3>Cloud-init ile parola belirlemek g\u00fcvenli mi?<\/h3>\n<p>Parolay\u0131 user-data i\u00e7inde d\u00fcz metin tutmak g\u00fcvenli de\u011fildir; dosya panel ge\u00e7mi\u015finde veya metadata servisinde kalabilir. SSH anahtar\u0131 kullan\u0131n, parola ile SSH giri\u015fini kapat\u0131n ve gerekiyorsa secret y\u00f6netimi i\u00e7in ayr\u0131 bir mekanizma tercih edin.<\/p>\n<h3>Cloud-init komutlar\u0131 her reboot sonras\u0131nda tekrar \u00e7al\u0131\u015f\u0131r m\u0131?<\/h3>\n<p>Genellikle hay\u0131r. Bir\u00e7ok mod\u00fcl instance kimli\u011fi ve durum kay\u0131tlar\u0131 sayesinde ilk a\u00e7\u0131l\u0131\u015fta bir kez \u00e7al\u0131\u015f\u0131r. Yeniden \u00e7al\u0131\u015ft\u0131rma ihtiyac\u0131 varsa mod\u00fcl davran\u0131\u015f\u0131n\u0131 ve <code>cloud-init clean<\/code> etkisini test VM&#8217;inde do\u011frulay\u0131n.<\/p>\n<h3>Cloud-init ile Ansible aras\u0131ndaki fark nedir?<\/h3>\n<p>Cloud-init, makinenin ilk a\u00e7\u0131l\u0131\u015f\u0131nda temel sistemi ve eri\u015fimi haz\u0131rlamak i\u00e7in uygundur. Ansible ise SSH \u00fczerinden mevcut makinelerde daha ayr\u0131nt\u0131l\u0131, tekrarlanabilir ve s\u00fcrekli konfig\u00fcrasyon y\u00f6netimi sa\u011flar. Pratikte ikisini arka arkaya kullanmak \u00e7o\u011fu ortamda daha sa\u011fl\u0131kl\u0131d\u0131r.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cloud-init ile VPS ilk a\u00e7\u0131l\u0131\u015f\u0131n\u0131 otomatikle\u015ftirin: user-data, kullan\u0131c\u0131 ve SSH anahtar\u0131 olu\u015fturma, paket kurulumu, runcmd, Proxmox ve hata ay\u0131klama ad\u0131mlar\u0131.<\/p>\n","protected":false},"author":2,"featured_media":419,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[253],"tags":[1503,389,1509,1505,1507,114],"class_list":["post-421","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bulut-bilisim","tag-cloud-init","tag-linux","tag-proxmox","tag-sunucu-otomasyonu","tag-user-data","tag-vps"],"lang":"tr","translations":{"tr":421,"en":422},"pll_sync_post":[],"_links":{"self":[{"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/posts\/421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/comments?post=421"}],"version-history":[{"count":1,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/posts\/421\/revisions"}],"predecessor-version":[{"id":423,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/posts\/421\/revisions\/423"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/media\/419"}],"wp:attachment":[{"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/media?parent=421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/categories?post=421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/tags?post=421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}