Ansible ile Ubuntu 22.04 Üzerine Docker Kurulumu ve Yapılandırması
Ansible, IT otomasyonu için güçlü, açık kaynaklı bir araçtır. Basitliği, ajansız yapısı ve deklaratif yaklaşımı sayesinde sunucu yapılandırması, uygulama dağıtımı ve orkestrasyonu gibi görevleri kolayca otomatize etmenizi sağlar. Docker ise uygulamaları ve bağımlılıklarını izole edilmiş, taşınabilir birimler olan konteynerler içinde paketlemek için devrim niteliğinde bir platformdur. Bu makalede, Ansible’ı kullanarak Ubuntu 22.04 işletim sistemi üzerinde Docker’ı nasıl kuracağınızı ve temel olarak nasıl yapılandıracağınızı adım adım inceleyeceğiz. Bu otomasyon süreci, tekrarlanabilirliği artırır, insan hatasını azaltır ve birden fazla sunucuda Docker dağıtımını standartlaştırmanıza olanak tanır.
Giriş
Günümüzün modern yazılım geliştirme ve dağıtım süreçlerinde otomasyon vazgeçilmez bir unsurdur. Özellikle mikroservis mimarileri ve bulut tabanlı uygulamaların yaygınlaşmasıyla birlikte, altyapı yönetiminin verimli ve hatasız olması kritik önem taşımaktadır. Docker, uygulamaları konteynerize ederek dağıtım süreçlerini basitleştirirken, Ansible bu konteyner ortamlarını otomatik olarak hazırlama yeteneği sunar. Ubuntu 22.04, sunucu ortamlarında sıkça tercih edilen, kararlı ve güncel bir işletim sistemi olduğu için bu kombinasyon oldukça popülerdir. Bu rehber, hem Ansible’a yeni başlayanlar hem de mevcut bilgi birikimini pekiştirmek isteyenler için kapsamlı bir yol haritası sunmayı amaçlamaktadır.
Neden Ansible ve Docker Birlikte?
Ansible ve Docker’ın birleşimi, modern DevOps yaklaşımlarının temel taşlarından biridir. Bu ikilinin birlikte sunduğu avantajlar şunlardır:
* Tekrarlanabilirlik: Ansible playbook’ları, Docker kurulumunu ve yapılandırmasını kod olarak tanımlar. Bu sayede, aynı kurulumu defalarca, her seferinde aynı sonuçla gerçekleştirebilirsiniz. Bu durum, test, geliştirme ve üretim ortamları arasında tutarlılığı sağlar.
* Ölçeklenebilirlik: Yüzlerce sunucuya Docker kurmanız gerektiğinde, Ansible bu süreci saniyeler içinde otomatize edebilir. Manuel kurulumlar hem zaman alıcı hem de hataya açıkken, Ansible ile bu görevler zahmetsizce yerine getirilebilir.
* Idempotence (Tekrar Edilebilirlik): Ansible, bir görevi birden çok kez çalıştırdığınızda bile sistemin istenen durumda kalmasını sağlayan idempotent bir yapıya sahiptir. Örneğin, Docker zaten kuruluysa, Ansible kurulum adımlarını tekrar çalıştırmayacak, sadece gerekli değişiklikleri yapacaktır.
* Basitlik ve Okunabilirlik: Ansible, YAML tabanlı playbook’lar kullanır. Bu, playbook’ların hem insanlar tarafından kolayca okunabilir hem de yazılabilir olmasını sağlar. Karmaşık betik dillerine kıyasla öğrenme eğrisi daha düşüktür.
* Ajansız Mimari: Ansible’ın hedef sunucularda herhangi bir aracı (agent) yazılımına ihtiyaç duymaması, kurulum ve yönetim yükünü önemli ölçüde azaltır. Sadece SSH erişimi ve Python yüklü olması yeterlidir.
* Sürüm Kontrolü: Ansible playbook’ları ve envanter dosyaları, Git gibi sürüm kontrol sistemleriyle yönetilebilir. Bu, altyapı değişikliklerinin izlenebilirliğini, geri alınabilirliğini ve işbirliğini artırır.
Bu avantajlar sayesinde, Ansible ile Docker kurulumu ve yönetimi, DevOps ekipleri için vazgeçilmez bir araç haline gelmiştir.
Ön Koşullar
Bu rehberdeki adımları takip edebilmek için belirli ön koşulların yerine getirilmesi gerekmektedir.
Kontrol Makinesi (Ansible Controller) Ayarları
Ansible playbook’larını çalıştıracağınız makinedir. Bu makineye aşağıdaki bileşenlerin kurulu olması gerekir:
* Linux İşletim Sistemi: Ubuntu, CentOS, Fedora veya macOS olabilir. Bu makale özelinde Linux tabanlı bir kontrol makinesi varsayılmaktadır.
* Python 3: Ansible, Python ile yazılmıştır ve çalışmak için Python 3’e ihtiyaç duyar.
* Ansible: Kontrol makinesine Ansible’ın kurulu olması gerekir. Kurulum için aşağıdaki komutları kullanabilirsiniz:
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
Kurulumu doğrulamak için:
ansible --version
* SSH Anahtarı: Hedef makinelere şifresiz SSH erişimi için bir SSH anahtar çifti oluşturmanız ve genel anahtarınızı hedef makinelere kopyalamanız şiddetle tavsiye edilir.
ssh-keygen -t rsa -b 4096 # Eğer anahtarınız yoksa
ssh-copy-id -i ~/.ssh/id_rsa.pub @
Hedef Makine(ler) (Docker Host) Ayarları
Docker’ı kuracağınız Ubuntu 22.04 sunucularıdır. Bu makinelerde aşağıdaki ayarların yapılmış olması gerekir:
* Ubuntu 22.04 İşletim Sistemi: Sunucularınızın Ubuntu 22.04 (Jammy Jellyfish) çalıştırdığından emin olun.
* Python 3: Ansible’ın hedef makinede komutları yürütebilmesi için Python 3’ün kurulu olması gerekir. Genellikle Ubuntu 22.04’te varsayılan olarak yüklüdür, ancak kontrol etmek veya kurmak için:
sudo apt update
sudo apt install python3
* Sudo Yetkisi: Ansible’ın Docker kurulumu gibi ayrıcalıklı işlemler yapabilmesi için hedef makinedeki kullanıcı hesabının sudo yetkisine sahip olması ve şifresiz sudo kullanabilmesi önerilir. Eğer şifre gerekiyorsa, Ansible’ı çalıştırırken -K veya --ask-become-pass parametresini kullanmanız gerekir.
* SSH Erişimi: Kontrol makinesinden hedef makineye SSH ile erişilebiliyor olması gerekir. Yukarıda belirtildiği gibi, SSH anahtar tabanlı kimlik doğrulama tercih edilir.
* İnternet Erişimi: Docker paketlerini indirebilmek için hedef makinenin internet erişimine sahip olması gerekir.
Ansible Proje Yapısı Oluşturma
Ansible ile çalışırken, düzenli bir proje yapısı oluşturmak iyi bir uygulamadır. Bu, playbook’larınızın ve rollerinizin yönetilebilirliğini artırır. Kontrol makinenizde bir proje dizini oluşturalım:
mkdir -p ansible-docker-ubuntu
cd ansible-docker-ubuntu
Bu dizin içinde aşağıdaki temel dosyaları ve dizinleri oluşturacağız:
ansible-docker-ubuntu/
├── inventory.ini
├── ansible.cfg
├── playbook.yml
└── roles/
├── common/
│ └── tasks/
│ └── main.yml
└── docker/
├── tasks/
│ └── main.yml
├── handlers/
│ └── main.yml
├── templates/
│ └── daemon.json.j2
└── defaults/
└── main.yml
Bu yapı, Ansible’ın en iyi pratiklerinden biri olan “roller” kullanımını yansıtır. Roller, belirli bir amacı olan, bağımsız ve yeniden kullanılabilir görevler koleksiyonlarıdır.
Ansible Playbook’u Oluşturma
Şimdi yukarıda bahsettiğimiz dosya ve dizinlerin içeriğini oluşturmaya başlayalım.
inventory.ini Dosyası
Bu dosya, Ansible’ın yöneteceği hedef makinelerin listesini ve gruplandırmasını içerir.
# inventory.ini
[docker_hosts]
Hedef makinenizin IP adresini veya hostname'ini buraya yazın
ansible_user: Hedef makinede sudo yetkisi olan kullanıcı adı
ansible_ssh_private_key_file: SSH anahtarınızın yolu (isteğe bağlı, ~/.ssh/id_rsa varsayılan olarak kullanılır)
ubuntu-docker-01 ansible_host=YOUR_TARGET_IP_ADDRESS ansible_user=your_username
ubuntu-docker-02 ansible_host=ANOTHER_TARGET_IP_ADDRESS ansible_user=another_username
[all:vars]
Ortak değişkenler buraya eklenebilir
ansible_python_interpreter=/usr/bin/python3
YOUR_TARGET_IP_ADDRESS ve your_username kısımlarını kendi hedef makinenizin IP adresi ve kullanıcı adıyla değiştirin. Eğer SSH anahtarınız ~/.ssh/id_rsa dışında bir yerdeyse, ansible_ssh_private_key_file=/path/to/your/key eklemeyi unutmayın.
ansible.cfg Dosyası (İsteğe Bağlı ama Önerilen)
Bu dosya, Ansible’ın çalışma zamanı davranışını yapılandırır. Proje dizininizde olması, genel Ansible yapılandırmasını etkilemeden bu projeye özel ayarlar yapmanızı sağlar.
# ansible.cfg
[defaults]
inventory = ./inventory.ini
remote_user = your_username # inventory.ini'deki ansible_user'ı geçersiz kılar veya varsayılanı belirler
ask_pass = False
host_key_checking = False # Geliştirme ortamları için kolaylık sağlar, üretimde True olmalıdır.
private_key_file = ~/.ssh/id_rsa # inventory.ini'de belirtmek daha esnektir
[privilege_escalation]
become = True # Görevleri sudo ile çalıştırmak için
become_method = sudo
become_user = root
become_ask_pass = False # Eğer hedef makinede şifresiz sudo yapılandırıldıysa
host_key_checking = False ayarı, hedef makinenin SSH anahtarının doğrulanmasını devre dışı bırakır. Güvenli bir üretim ortamında bu ayarın True olması ve bilinen anahtarların ~/.ssh/known_hosts dosyasına eklenmesi önerilir. Ancak geliştirme ortamlarında veya ilk kurulumlarda kolaylık sağlayabilir.
playbook.yml (Ana Playbook)
Bu, Ansible’ın çalıştıracağı ana playbook dosyasıdır. Belirli rolleri belirli gruplara uygular.
# playbook.yml
---
- name: Ubuntu 22.04 Uzerine Docker Kurulumu ve Yapilandirmasi
hosts: docker_hosts
gather_facts: yes
become: yes # Bu playbook icindeki tum gorevleri sudo ile calistir
roles:
- common
- docker
* name: Playbook için açıklayıcı bir isim.
* hosts: Bu playbook’un hangi host grubunda çalışacağını belirtir (inventory.ini dosyasındaki grup adı).
* gather_facts: Hedef sistem hakkında bilgi toplamasını sağlar (CPU, bellek, IP adresi vb.). Varsayılan olarak yes‘tir.
* become: yes: Bu playbook’taki tüm görevleri sudo yetkisiyle çalıştırmasını sağlar.
* roles: Uygulanacak rolleri listeler. Önce common rolü, sonra docker rolü çalışır.
Roller Oluşturma
Şimdi roles dizini altındaki dosyaların içeriğini dolduralım.
roles/common/tasks/main.yml (Ortak Ayarlar)
Bu rol, tüm hedef makinelerde Docker kurulumundan önce yapılması gereken genel sistem güncellemeleri ve temel paket kurulumlarını içerir.
# roles/common/tasks/main.yml
---
- name: Sistem paketlerini guncelle
ansible.builtin.apt:
update_cache: yes
force_apt_get: yes
cache_valid_time: 3600 # 1 saat boyunca cache'i gecerli tut
- name: Gerekli paketleri kur
ansible.builtin.apt:
name:
- apt-transport-https
- ca-certificates
- curl
- gnupg
- lsb-release
- python3-pip # Docker Compose icin gerekli olabilir
state: present
register: common_packages_install_result
changed_when: common_packages_install_result.changed
- name: Mevcut apt cache'ini temizle
ansible.builtin.command: apt clean
changed_when: true
* update_cache: yes: apt update komutunu çalıştırır.
* cache_valid_time: apt update komutunun ne kadar süre geçerli olacağını belirler.
* name: Kurulacak paketlerin listesi.
* state: present: Paketlerin kurulu olmasını sağlar.
* register ve changed_when: Görevin gerçekten bir değişiklik yapıp yapmadığını kontrol etmek için kullanılır. apt clean her zaman değişmiş olarak kabul edildiği için changed_when: true kullanılır.
roles/docker/tasks/main.yml (Docker Kurulumu)
Bu, Docker’ı kuracak ve yapılandıracak ana görevleri içerir.
# roles/docker/tasks/main.yml
---
- name: Docker'ın eski surumlerini kaldir (varsa)
ansible.builtin.apt:
name:
- docker
- docker-engine
- docker.io
- containerd
- runc
state: absent
autoremove: yes
purge: yes
- name: Docker GPG anahtarini ekle
ansible.builtin.apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
register: add_docker_gpg_key
changed_when: add_docker_gpg_key.changed
- name: Docker APT deposunu ekle
ansible.builtin.apt_repository:
repo: "deb [arch={{ 'amd64' if ansible_architecture == 'x86_64' else ansible_architecture }}] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
state: present
filename: docker
register: add_docker_apt_repo
changed_when: add_docker_apt_repo.changed
- name: Apt cache'ini guncelle (Docker deposu eklendikten sonra)
ansible.builtin.apt:
update_cache: yes
force_apt_get: yes
cache_valid_time: 3600
- name: Docker Engine, containerd ve Docker Compose plugin'i kur
ansible.builtin.apt:
name:
- docker-ce
- docker-ce-cli
- containerd.io
- docker-buildx-plugin
- docker-compose-plugin
state: present
update_cache: yes
register: install_docker_packages
changed_when: install_docker_packages.changed
- name: Docker servisini baslat ve etkinlestir
ansible.builtin.service:
name: docker
state: started
enabled: yes
register: docker_service_status
changed_when: docker_service_status.changed
- name: Docker grubunu olustur (eger yoksa)
ansible.builtin.group:
name: docker
state: present
when: ansible_os_family == "Debian" # Ubuntu icin gecerli
- name: Mevcut kullaniciyi 'docker' grubuna ekle
ansible.builtin.user:
name: "{{ ansible_user }}" # inventory.ini'deki kullanici adini kullan
groups: docker
append: yes
notify: Docker servisini yeniden baslat
# Bu gorev sonrasi kullanicinin docker grubuna dahil olmasi icin oturumu kapatip acmasi gerekir.
# Ancak Docker servisini yeniden baslatmak, mevcut oturumlarin degil, sistemin ayarlarini gunceller.
- name: Docker daemon.json dosyasini yapılandır (isteğe bağlı)
ansible.builtin.template:
src: daemon.json.j2
dest: /etc/docker/daemon.json
owner: root
group: root
mode: '0644'
notify: Docker servisini yeniden baslat
when: docker_daemon_config is defined and docker_daemon_config | length > 0
- name: Docker servisi durumunu kontrol et
ansible.builtin.systemd:
name: docker
state: started
enabled: yes
* Eski Sürümleri Kaldırma: Önceki Docker kurulumlarından kalan paketleri temizler.
* GPG Anahtarını Ekleme: Docker’ın resmi deposunun güvenliğini sağlamak için GPG anahtarını ekler.
* APT Deposunu Ekleme: Docker paketlerini çekebileceği resmi Docker deposunu sisteminize ekler. ansible_architecture ve ansible_distribution_release değişkenleri, Ansible tarafından toplanan sistem bilgileridir ve depoyu dinamik olarak doğru mimari ve Ubuntu sürümüne göre ayarlar.
* Apt Cache’ini Güncelleme: Yeni depo eklendikten sonra paket listelerini günceller.
* Docker Engine Kurulumu: docker-ce, docker-ce-cli, containerd.io ve Docker Compose eklentilerini kurar.
* Docker Servisini Başlatma: Docker servisini başlatır ve sistem başlangıcında otomatik olarak başlaması için etkinleştirir.
* Docker Grubunu Oluşturma ve Kullanıcı Ekleme: docker grubunu oluşturur (Ubuntu’da genellikle zaten vardır) ve ansible_user değişkenindeki kullanıcıyı bu gruba ekler. Bu, kullanıcının sudo kullanmadan Docker komutlarını çalıştırmasına olanak tanır.
* Daemon Yapılandırması: İsteğe bağlı olarak /etc/docker/daemon.json dosyasını bir şablon aracılığıyla yapılandırır. Bu, örneğin özel bir registry veya günlük ayarları için kullanılabilir. Bu adım, docker_daemon_config değişkeni tanımlandığında ve boş olmadığında çalışır.
* Servis Durumu Kontrolü: Kurulum sonrası Docker servisinin çalıştığından emin olur.
roles/docker/handlers/main.yml (Servis Yeniden Başlatma)
Handlers, belirli bir görevin durumu değiştiğinde (örneğin bir yapılandırma dosyası değiştiğinde) tetiklenen görevlerdir.
# roles/docker/handlers/main.yml
---
- name: Docker servisini yeniden baslat
ansible.builtin.service:
name: docker
state: restarted
listen: "Docker servisini yeniden baslat" # notify ile eşleşen isim
Bu handler, daemon.json dosyası değiştiğinde veya kullanıcı docker grubuna eklendiğinde Docker servisini yeniden başlatmak için kullanılır. listen anahtar kelimesi, bu handler’ın hangi notify komutlarına yanıt vereceğini belirtir.
roles/docker/templates/daemon.json.j2 (Docker Daemon Yapılandırması)
Bu dosya, Docker daemon’u için isteğe bağlı yapılandırmaları içerir. Jinja2 şablon motoru sayesinde dinamik değişkenler kullanabiliriz.
{# roles/docker/templates/daemon.json.j2 #}
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"insecure-registries": [
{% for registry in docker_daemon_config.insecure_registries %}
"{{ registry }}"{% if not loop.last %},{% endif %}
{% endfor %}
],
"data-root": "{{ docker_data_root | default('/var/lib/docker') }}"
}
Bu şablon, örnek olarak günlük ayarlarını ve güvensiz registry’leri yapılandırır. docker_daemon_config ve docker_data_root gibi değişkenler, defaults/main.yml veya playbook.yml üzerinden tanımlanabilir.
roles/docker/defaults/main.yml (Varsayılan Değişkenler)
Bu dosya, rol içinde kullanılacak varsayılan değişkenleri tanımlar. Bu değişkenler, playbook veya envanter dosyalarında geçersiz kılınabilir.
# roles/docker/defaults/main.yml
---
Docker daemon yapılandırması için varsayılan değişkenler
docker_daemon_config:
insecure_registries: [] # Ornek: ["myregistry.local:5000"]
docker_data_root: /var/lib/docker # Docker'ın verilerini saklayacağı dizin
Burada, daemon.json.j2 şablonunda kullanılan değişkenler için varsayılan değerler tanımlanmıştır. insecure_registries varsayılan olarak boş bir liste olarak gelir.
Playbook’u Çalıştırma
Tüm dosyaları oluşturduktan sonra, kontrol makinenizdeki ansible-docker-ubuntu dizininde olduğunuzdan emin olun ve aşağıdaki komutu çalıştırın:
ansible-playbook playbook.yml
Eğer hedef makinede sudo şifresi gerekiyorsa, komuta -K (veya --ask-become-pass) parametresini eklemeniz gerekir:
ansible-playbook playbook.yml -K
Ansible, playbook’u adım adım yürütecek ve her görevin durumunu (değişti mi, başarılı mı, atlandı mı) gösterecektir. Yeşil çıktılar bir değişikliğin olmadığını, sarı çıktılar bir değişikliğin yapıldığını ve kırmızı çıktılar ise bir hatanın meydana geldiğini gösterir.
Kurulumu Doğrulama
Playbook başarıyla tamamlandıktan sonra, hedef makineye SSH ile bağlanarak Docker kurulumunu doğrulayabilirsiniz:
ssh your_username@YOUR_TARGET_IP_ADDRESS
Ardından aşağıdaki komutları çalıştırın:
* Docker versiyonunu kontrol et:
docker --version
Bu, kurulu Docker Engine sürümünü göstermelidir.
* Docker servisi durumunu kontrol et:
sudo systemctl status docker
Çıktıda “active (running)” ifadesini görmelisiniz.
* “Hello World” konteynerini çalıştırarak Docker’ın çalıştığını doğrula:
docker run hello-world
Bu komut, bir test imajını çekecek ve basit bir mesaj yazdırarak Docker’ın düzgün çalıştığını gösterecektir. Eğer kullanıcıyı docker grubuna eklediyseniz ve oturumu yeniden başlattıysanız, sudo kullanmadan da çalışacaktır.
Eğer docker run hello-world komutu permission denied hatası veriyorsa, hedef makinede oturumunuzu kapatıp tekrar açmanız gerekebilir. Bu, kullanıcının docker grubuna dahil olmasının etkinleşmesi için gereklidir.
Ek Docker Yapılandırmaları (İsteğe Bağlı)
Docker kurulumu genellikle temel bir yapılandırmadan daha fazlasını gerektirir. İşte bazı yaygın ek yapılandırmalar:
Non-root Kullanıcı için Docker Erişimi
Yukarıdaki playbook’ta, ansible_user‘ı docker grubuna ekleyerek bu adımı zaten otomatikleştirdik. Ancak, bu değişikliğin etkili olması için kullanıcının oturumu kapatıp açması gerektiğini unutmayın. Bu, Ansible tarafından otomatik olarak yapılabilecek bir şey değildir, çünkü Ansible mevcut SSH oturumunu kesintiye uğratmak istemez.
Docker Compose Kurulumu
Docker Compose, çok konteynerli Docker uygulamalarını tanımlamak ve çalıştırmak için bir araçtır. Yukarıdaki playbook’ta docker-compose-plugin‘i kurarak Docker CLI ile entegre bir şekilde kullanılmasını sağladık. Artık docker compose komutunu doğrudan kullanabilirsiniz.
Güvenlik Duvarı Ayarları
Güvenlik, herhangi bir sunucu kurulumunun kritik bir parçasıdır. Ubuntu’da varsayılan güvenlik duvarı aracı ufw‘dir. Docker, varsayılan olarak iptables kurallarını yönetir, ancak ufw ile çakışmaları önlemek ve ek güvenlik sağlamak için dikkatli olunmalıdır.
Ansible ile ufw‘yi yapılandırmak için common rolüne veya yeni bir firewall rolüne aşağıdaki görevleri ekleyebilirsiniz:
# roles/common/tasks/main.yml veya roles/firewall/tasks/main.yml içine eklenecek
- name: UFW'yi etkinlestir
community.general.ufw:
state: enabled
default: deny
when: ansible_os_family == "Debian" # Ubuntu icin gecerli
- name: SSH icin port 22'ye izin ver
community.general.ufw:
rule: allow
port: '22'
proto: tcp
when: ansible_os_family == "Debian"
- name: Docker'ın kullanacagi portlara izin ver (ornegin 80 ve 443)
community.general.ufw:
rule: allow
port: '80'
proto: tcp
when: ansible_os_family == "Debian"
- name: Docker'ın kullanacagi portlara izin ver (ornegin 80 ve 443)
community.general.ufw:
rule: allow
port: '443'
proto: tcp
when: ansible_os_family == "Debian"
Docker'ın iptables kurallarını UFW ile çakışmadan yönetebilmesi için
UFW'nin varsayılan politikası "deny" iken Docker'ın köprü ağ trafiğine izin vermesi için
/etc/default/ufw dosyasında DEFAULT_FORWARD_POLICY="ACCEPT" ayarını yapmak gerekebilir.
Ancak bu, güvenlik açısından riskli olabilir ve dikkatli düşünülmelidir.
Alternatif olarak, Docker konteynerlerine doğrudan erişim yerine bir reverse proxy (nginx/traefik) kullanmak daha güvenlidir.
Bu görevler, SSH trafiğine izin verir ve ufw‘yi etkinleştirir. Docker’ın kendi ağ kurallarını yönetme şekli nedeniyle, ufw ile entegrasyon bazen karmaşık olabilir. Genellikle, Docker konteynerleri için bir ters proxy (Nginx, Traefik) kullanmak ve sadece proxy’nin portlarını açmak daha güvenli ve yönetilebilir bir yaklaşımdır.
Sorun Giderme
Ansible playbook’larını çalıştırırken veya Docker kurulumunda sorunlarla karşılaşabilirsiniz. İşte bazı yaygın sorunlar ve çözümleri:
* SSH Bağlantı Hataları:
* ansible_host, ansible_user veya SSH anahtar yolu doğru mu?
* Hedef makineye manuel olarak SSH yapabiliyor musunuz?
* Güvenlik duvarı SSH portunu (22) engelliyor olabilir mi?
* Sudo Hataları (become ile ilgili):
* Hedef kullanıcı sudo yetkisine sahip mi?
* Şifresiz sudo yapılandırıldı mı? Eğer değilse, ansible-playbook -K playbook.yml kullanmanız gerekir.
* ansible.cfg veya inventory.ini dosyasındaki become_user, become_method ayarları doğru mu?
* Paket Kurulum Hataları:
* Hedef makinenin internet erişimi var mı?
* APT depoları doğru yapılandırıldı mı?
* GPG anahtarları başarıyla eklendi mi?
* sudo apt update manuel olarak çalıştırıldığında hata veriyor mu?
* Docker Servisi Başlamıyor:
* sudo systemctl status docker komutunu çalıştırarak logları kontrol edin.
* journalctl -xeu docker.service ile daha detaylı loglara bakın.
* /etc/docker/daemon.json dosyasında bir sözdizimi hatası olabilir mi?
* docker run İzin Hatası (permission denied):
* Kullanıcının docker grubuna eklenip eklenmediğini kontrol edin: groups your_username.
* Kullanıcının oturumunu kapatıp tekrar açtığından emin olun. Bu, grup üyeliği değişikliklerinin uygulanması için gereklidir.
Hata mesajlarını dikkatlice okumak ve Google’da aratmak, çoğu sorunun çözümüne ulaşmanıza yardımcı olacaktır. Ansible’ın -vvv (çok detaylı) veya -C (dry run) gibi parametreleri de sorun gidermede faydalı olabilir.
Sonuç
Bu makalede, Ansible’ı kullanarak Ubuntu 22.04 işletim sistemi üzerine Docker’ı nasıl kuracağınızı ve temel olarak nasıl yapılandıracağınızı ayrıntılı bir şekilde ele aldık. Ansible’ın deklaratif yapısı ve ajansız mimarisi sayesinde, bu süreci tamamen otomatize ederek tekrarlanabilir, ölçeklenebilir ve hatasız bir dağıtım yöntemi oluşturduk.
Oluşturduğumuz Ansible rolleri, Docker kurulumunun tüm adımlarını (paket güncellemeleri, GPG anahtarı ekleme, depo yapılandırması, Docker Engine kurulumu, kullanıcı grubuna ekleme ve isteğe bağlı daemon yapılandırması) kapsadı. Bu yapı, hem yeni sunucuların hızlı bir şekilde hazırlanmasını sağlar hem de mevcut sunucuların yapılandırmasını kolayca güncellemeyi mümkün kılar.
Ansible ve Docker’ın birleşimi, modern DevOps uygulamaları için güçlü bir temel sunar. Altyapınızı kod olarak yönetmek (Infrastructure as Code – IaC) prensiplerini benimseyerek, geliştirme, test ve üretim ortamlarınız arasında tutarlılığı artırabilir, dağıtım süreçlerinizi hızlandırabilir ve operasyonel maliyetlerinizi düşürebilirsiniz. Bu rehber, kendi otomasyon yolculuğunuzda size sağlam bir başlangıç noktası sağlamalıdır. Gelecekte, bu playbook’u Docker Compose uygulamalarının dağıtımı, konteyner ağları veya depolama çözümleri gibi daha karmaşık senaryoları içerecek şekilde genişletebilirsiniz.