Ansible ile Ubuntu 18.04 Üzerine LAMP Kurulumu ve Yapılandırması
Giriş
Günümüzün hızla değişen teknoloji dünyasında, sunucu kurulumu ve yapılandırması gibi görevler, manuel olarak yapıldığında zaman alıcı, hataya açık ve ölçeklendirilmesi zor süreçler haline gelebilmektedir. Özellikle web uygulamalarının temelini oluşturan LAMP (Linux, Apache, MySQL, PHP) yığını, birçok proje için vazgeçilmez bir altyapıdır. Bu yığının bir veya birden fazla sunucuya tutarlı ve tekrarlanabilir bir şekilde kurulması, otomasyon araçlarının önemini ortaya koymaktadır.
Ansible, bu tür otomasyon ihtiyaçları için geliştirilmiş, agent’sız bir yapılandırma yönetim aracıdır. Basit, okunabilir YAML tabanlı syntax’ı sayesinde karmaşık altyapı kurulumlarını ve yönetimini kolaylaştırır. Bu makalede, Ansible kullanarak Ubuntu 18.04 işletim sistemi üzerine LAMP yığınının nasıl kurulacağını ve yapılandırılacağını adım adım ele alacağız. Hedefimiz, bu süreci tamamen otomatikleştirmek ve gelecekte benzer kurulumları saniyeler içinde tekrarlayabilmektir.
Makalenin sonunda, sadece LAMP yığınını kurmakla kalmayacak, aynı zamanda Ansible’ın gücünü kullanarak bu kurulumu nasıl yönetebileceğinizi, değişkenleri nasıl kullanacağınızı ve daha karmaşık senaryolara nasıl adapte edebileceğinizi de anlamış olacaksınız.
Ön Gereksinimler
Ansible ile LAMP kurulumuna başlamadan önce bazı temel gereksinimleri karşılamış olmanız gerekmektedir:
1. Ubuntu 18.04 Hedef Sunucu(lar)
* İşletim Sistemi: En az bir adet temiz Ubuntu 18.04 sunucusu. Makale, Ubuntu 18.04 üzerine odaklanacak olsa da, Ansible playbook’ları küçük değişikliklerle diğer Ubuntu sürümlerine de uyarlanabilir.
* SSH Erişimi: Ansible, hedef sunucularla SSH üzerinden iletişim kurar. Bu nedenle, hedef sunucunuza SSH ile erişebiliyor olmanız gerekmektedir.
* Sudo Yetkileri: Ansible’ın kurulum ve yapılandırma görevlerini gerçekleştirebilmesi için, SSH ile bağlanacağınız kullanıcının sudo yetkilerine sahip olması önemlidir.
* Güncel Sistem: Hedef sunucunuzun paket listesinin ve kurulu paketlerinin güncel olması iyi bir başlangıç noktasıdır. Kurulumdan önce sudo apt update && sudo apt upgrade -y komutunu çalıştırmanız önerilir.
2. Kontrol Makinesi (Ansible Controller)
* İşletim Sistemi: Ansible’ı çalıştıracağınız bir Linux (Ubuntu, Fedora, CentOS vb.) veya macOS işletim sistemine sahip bir makine. Bu makineye “kontrol makinesi” denir.
* Ansible Kurulumu: Kontrol makinesinde Ansible’ın kurulu olması gerekmektedir. Sonraki bölümde kurulum adımlarını detaylı olarak açıklayacağız.
* SSH Anahtar Çifti: Ansible’ın şifre sormadan hedef sunuculara bağlanabilmesi için SSH anahtar çifti (public/private key) kullanmak en güvenli ve pratik yöntemdir.
* Eğer bir anahtar çiftiniz yoksa, kontrol makinesinde ssh-keygen -t rsa -b 4096 komutu ile oluşturabilirsiniz.
* Oluşturduğunuz public key’i (~/.ssh/id_rsa.pub), hedef Ubuntu 18.04 sunucunuzdaki sudo yetkilerine sahip kullanıcının ~/.ssh/authorized_keys dosyasına kopyalamanız gerekmektedir. Bunu ssh-copy-id kullanıcı@hedef_ip_adresi komutu ile kolayca yapabilirsiniz.
Ansible Kurulumu
Kontrol makinenizde Ansible kurulu değilse, aşağıdaki adımları izleyerek kurabilirsiniz. Bu adımlar Ubuntu tabanlı sistemler için geçerlidir.
# Sistem paket listesini güncelleyin
sudo apt update
Gerekli bağımlılıkları yükleyin
sudo apt install software-properties-common -y
Ansible PPA (Personal Package Archive) deposunu ekleyin
sudo add-apt-repository --yes --update ppa:ansible/ansible
Ansible'ı kurun
sudo apt install ansible -y
Kurulumu doğrulayın
ansible --version
ansible --version komutunu çalıştırdığınızda, Ansible sürümünü ve Python gibi bağımlılık bilgilerini görmelisiniz. Bu, Ansible’ın başarıyla kurulduğunu gösterir.
Proje Yapısı Oluşturma
Ansible projeleri genellikle belirli bir dizin yapısı içinde düzenlenir. Bu, playbook’larınızın, envanterinizin ve rollerinizin daha düzenli ve yönetilebilir olmasını sağlar. Projeniz için bir ana dizin oluşturalım:
mkdir lamp_ansible
cd lamp_ansible
Şimdi, bu dizin altında temel Ansible proje yapısını oluşturalım:
# Envanter dosyası
touch inventory.ini
Ansible yapılandırma dosyası
touch ansible.cfg
Playbook'lar için dizin
mkdir playbooks
Roller için dizin
mkdir roles
Değişkenler için dizin (isteğe bağlı ama iyi bir pratik)
mkdir vars
Bu adımlardan sonra lamp_ansible dizininizin yapısı şöyle görünmelidir:
lamp_ansible/
├── inventory.ini
├── ansible.cfg
├── playbooks/
├── roles/
└── vars/
Inventory Dosyası (inventory.ini)
inventory.ini dosyası, Ansible’ın hangi sunucular üzerinde işlem yapacağını belirten bir listedir. Hedef Ubuntu 18.04 sunucunuzun bilgilerini bu dosyaya ekleyelim.
inventory.ini dosyasını açın ve aşağıdaki içeriği ekleyin:
[webservers]
Hedef sunucunuzun IP adresi veya hostname'i
birden fazla sunucunuz varsa alt alta ekleyebilirsiniz
your_server_ip_address ansible_user=your_ssh_user ansible_become=true
* [webservers]: Bu, sunucularınızı grupladığınız bir isimdir. Playbook’larınızda bu grup adını kullanarak belirli sunucu setleri üzerinde işlem yapabilirsiniz.
* your_server_ip_address: Hedef Ubuntu sunucunuzun gerçek IP adresi veya DNS adı ile değiştirin.
* ansible_user=your_ssh_user: Hedef sunucuya bağlanmak için kullanacağınız SSH kullanıcı adını belirtin. Bu kullanıcı sudo yetkilerine sahip olmalıdır.
* ansible_become=true: Bu, Ansible’a görevleri sudo kullanarak çalıştırmasını söyler.
Örnek:
[webservers]
192.168.1.100 ansible_user=ubuntu ansible_become=true
Ansible Yapılandırma Dosyası (ansible.cfg)
ansible.cfg dosyası, Ansible’ın çalışma zamanı davranışını kontrol eden global veya proje bazında ayarları içerir. Projeniz için özel ayarları buraya eklemek, komut satırında her seferinde aynı parametreleri yazmaktan kurtarır.
ansible.cfg dosyasını açın ve aşağıdaki içeriği ekleyin:
[defaults]
inventory = inventory.ini
remote_user = your_ssh_user # inventory.ini'deki ansible_user ile aynı olabilir
ask_pass = false
host_key_checking = false # Geliştirme ortamında kolaylık sağlar, üretimde 'true' olması önerilir.
roles_path = ./roles
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
* inventory = inventory.ini: Ansible’a envanter dosyasının nerede olduğunu söyler.
* remote_user = your_ssh_user: Varsayılan SSH kullanıcı adını belirler.
* ask_pass = false: SSH bağlantısı için şifre sormamasını sağlar (SSH anahtar çifti kullandığınız varsayılır).
* host_key_checking = false: İlk bağlantıda host anahtarı kontrolünü devre dışı bırakır. Güvenlik açısından üretim ortamlarında true olması önerilir. Geliştirme ve test ortamlarında kolaylık sağlar.
* roles_path = ./roles: Ansible’ın rolleri nerede arayacağını belirtir.
* [privilege_escalation]: sudo gibi yetki yükseltme ayarlarını içerir.
* become = true: Yetki yükseltmeyi etkinleştirir.
* become_method = sudo: Yetki yükseltme yöntemi olarak sudo‘yu kullanır.
* become_user = root: Yetki yükseltildikten sonra hangi kullanıcıya geçileceğini belirtir (genellikle root).
* become_ask_pass = false: sudo şifresi sormamasını sağlar (SSH anahtarınızın sudo yetkisi varsa veya hedef makinede NOPASSWD ayarı yapılmışsa).
LAMP Kurulumu İçin Ansible Rolleri
Ansible’da “rol” (role) kavramı, belirli bir görevi (örneğin Apache kurmak, MySQL yapılandırmak) yerine getiren, yeniden kullanılabilir ve düzenli bir görevler, şablonlar, dosyalar ve değişkenler koleksiyonudur. LAMP yığınını kurmak için her bir bileşen (Apache, MySQL, PHP) için ayrı roller oluşturmak, playbook’unuzu daha modüler, okunabilir ve yönetilebilir hale getirecektir. Ayrıca, sistem güncellemeleri ve temel paket kurulumları için bir common rolü de oluşturacağız.
roles dizini içinde aşağıdaki rolleri oluşturalım:
ansible-galaxy init common apache mysql php
Bu komut, roles dizini altında common, apache, mysql ve php adında dört yeni dizin oluşturacak ve her birinin içinde standart rol yapısını (tasks, handlers, templates, vars, defaults, meta) barındıracaktır.
Şimdi her bir rolün içeriğini adım adım dolduralım.
1. Common Rolü
Bu rol, hedef sunucunun güncel olmasını sağlar ve diğer rollerin ihtiyaç duyabileceği temel paketleri kurar.
roles/common/tasks/main.yml:
---
- name: Sistem paket listesini güncelleyin
apt:
update_cache: yes
force_apt_get: yes
cache_valid_time: 3600 # 1 saat boyunca önbelleği geçerli tut
- name: Tüm kurulu paketleri yükseltin
apt:
upgrade: dist
force_apt_get: yes
- name: Gereksiz bağımlılıkları temizleyin
apt:
autoremove: yes
- name: Python 3'ün kurulu olduğundan emin olun (Ansible için gerekli)
# Ubuntu 18.04'te 'python' genellikle python2'yi gösterir. Ansible python3'e ihtiyaç duyar.
# Bu görev, eğer python komutu python3'e linklenmemişse python-is-python3 paketini kurar.
raw: test -e /usr/bin/python || (apt update && apt install -y python-is-python3)
args:
creates: /usr/bin/python
changed_when: false # Bu komutun idempotence'ı olmadığı için
when: ansible_distribution == 'Ubuntu' and ansible_distribution_major_version == '18'
- name: Gerekli temel paketleri kurun
apt:
name:
- curl
- wget
- unzip
- git
- python3-apt # apt modülü için gerekli
state: present
common rolünün handlers dizini şimdilik boş kalabilir.
2. Apache Rolü
Bu rol, Apache web sunucusunu kurar, yapılandırır ve gerekli modülleri etkinleştirir.
roles/apache/tasks/main.yml:
---
- name: Apache paketini kurun
apt:
name: apache2
state: present
- name: Apache servisini başlatın ve etkinleştirin
service:
name: apache2
state: started
enabled: yes
- name: UFW (Güvenlik Duvarı) üzerinde Apache Full profiline izin verin
community.general.ufw:
rule: allow
name: 'Apache Full'
state: enabled # UFW'nin etkin olduğundan emin olun
- name: Varsayılan Apache sanal ana bilgisayarını devre dışı bırakın
command: a2dissite 000-default.conf
notify: Apache'yi yeniden başlat
- name: Apache rewrite modülünü etkinleştirin
community.general.apache2_module:
state: present
name: rewrite
notify: Apache'yi yeniden başlat
- name: Uygulama için belge kök dizinini oluşturun
file:
path: "{{ apache_document_root }}"
state: directory
owner: www-data
group: www-data
mode: '0755'
- name: Apache sanal ana bilgisayar yapılandırmasını kopyalayın
template:
src: example.conf.j2
dest: /etc/apache2/sites-available/{{ apache_servername }}.conf
owner: root
group: root
mode: '0644'
notify: Apache'yi yeniden başlat
- name: Yeni Apache sanal ana bilgisayarını etkinleştirin
command: a2ensite {{ apache_servername }}.conf
notify: Apache'yi yeniden başlat
- name: Test PHP sayfası oluşturun
copy:
content: ""
dest: "{{ apache_document_root }}/info.php"
owner: www-data
group: www-data
mode: '0644'
roles/apache/templates/example.conf.j2:
Bu şablon, uygulamanız için bir Apache sanal ana bilgisayar yapılandırması oluşturacaktır.
ServerAdmin webmaster@localhost
ServerName {{ apache_servername }}
DocumentRoot {{ apache_document_root }}
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
ErrorLog ${APACHE_LOG_DIR}/{{ apache_servername }}_error.log
CustomLog ${APACHE_LOG_DIR}/{{ apache_servername }}_access.log combined
roles/apache/handlers/main.yml:
Handler’lar, belirli bir görev tetiklendiğinde (örneğin bir yapılandırma dosyası değiştiğinde) çalıştırılan görevlerdir.
---
- name: Apache'yi yeniden başlat
service:
name: apache2
state: restarted
roles/apache/defaults/main.yml:
Bu dosyada, rol içinde kullanılan varsayılan değişken değerlerini tanımlayabiliriz.
---
apache_servername: your_domain_or_ip # Kendi alan adınız veya IP adresinizle değiştirin
apache_document_root: /var/www/html/mywebapp # Uygulamanızın kök dizini
3. MySQL Rolü
Bu rol, MySQL sunucusunu kurar, root şifresini ayarlar ve isteğe bağlı olarak bir veritabanı ve kullanıcı oluşturur.
roles/mysql/tasks/main.yml:
---
- name: MySQL sunucu paketini ve Python MySQL bağımlılığını kurun
apt:
name:
- mysql-server
- python3-pymysql # Ansible'ın MySQL modülleri için gerekli
state: present
- name: MySQL servisini başlatın ve etkinleştirin
service:
name: mysql
state: started
enabled: yes
- name: MySQL root şifresini ayarlayın (yalnızca ilk kurulumda)
community.mysql.mysql_user:
name: root
host: localhost
password: "{{ mysql_root_password }}"
login_user: root
login_password: "{{ mysql_root_password }}" # Eğer şifre zaten ayarlandıysa bu kullanılır
check_password_exists: yes # Şifrenin zaten var olup olmadığını kontrol eder
state: present
no_log: true # Hassas bilgiyi loglarda göstermez
- name: Anonim MySQL kullanıcılarını kaldırın
community.mysql.mysql_user:
name: ''
host: "{{ item }}"
state: absent
with_items:
- localhost
- "{{ ansible_hostname }}"
- name: Test veritabanını kaldırın
community.mysql.mysql_db:
name: test
state: absent
- name: Yeni bir veritabanı oluşturun
community.mysql.mysql_db:
name: "{{ mysql_db_name }}"
state: present
login_user: root
login_password: "{{ mysql_root_password }}"
no_log: true
- name: Yeni bir veritabanı kullanıcısı oluşturun ve yetkilendirin
community.mysql.mysql_user:
name: "{{ mysql_db_user }}"
password: "{{ mysql_db_password }}"
host: 'localhost'
priv: "{{ mysql_db_name }}.*:ALL"
state: present
login_user: root
login_password: "{{ mysql_root_password }}"
no_log: true
Uzak bağlantılara izin vermek isterseniz (GÜVENLİK RİSKİ OLUŞTURUR, DİKKATLİ KULLANIN!)
- name: MySQL yapılandırma dosyasını güncelleyin (bind-address)
lineinfile:
path: /etc/mysql/mysql.conf.d/mysqld.cnf
regexp: '^bind-address'
line: 'bind-address = 0.0.0.0'
notify: MySQL'i yeniden başlat
- name: UFW üzerinde MySQL portuna (3306) izin verin
community.general.ufw:
rule: allow
port: '3306'
proto: tcp
when: allow_mysql_remote_access is defined and allow_mysql_remote_access
roles/mysql/handlers/main.yml:
---
- name: MySQL'i yeniden başlat
service:
name: mysql
state: restarted
roles/mysql/defaults/main.yml:
MySQL için hassas bilgiler içerdiğinden, bu değişkenleri ansible-vault ile korumak veya group_vars kullanmak daha güvenlidir. Ancak örnek olması açısından buraya ekleyelim.
---
mysql_root_password: "YOUR_MYSQL_ROOT_PASSWORD" # Güçlü bir şifre kullanın!
mysql_db_name: "my_database"
mysql_db_user: "my_db_user"
mysql_db_password: "MY_DB_USER_PASSWORD" # Güçlü bir şifre kullanın!
allow_mysql_remote_access: false # Uzak erişimi etkinleştirmek için true yapın
4. PHP Rolü
Bu rol, PHP’yi ve Apache ile entegrasyonu için gerekli modülleri kurar ve temel PHP ayarlarını yapar.
roles/php/tasks/main.yml:
---
- name: PHP ve Apache için gerekli modülleri kurun
apt:
name:
- php
- libapache2-mod-php
- php-mysql
- php-cli
- php-json
- php-gd
- php-curl
- php-mbstring
- php-xml
- php-zip
state: present
- name: PHP yapılandırma dosyasını kopyalayın
template:
src: php.ini.j2
dest: /etc/php/7.2/apache2/php.ini # Ubuntu 18.04 için PHP 7.2 varsayılanı
owner: root
group: root
mode: '0644'
notify: Apache'yi yeniden başlat # PHP yapılandırması değişince Apache'nin yeniden başlatılması gerekir
roles/php/templates/php.ini.j2:
Bu şablon, php.ini dosyasını yapılandırmak için kullanılır. Kendi ihtiyaçlarınıza göre düzenleyebilirsiniz.
[PHP]
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
date.timezone = "{{ php_timezone }}"
display_errors = Off
log_errors = On
error_log = /var/log/php/php_errors.log
roles/php/handlers/main.yml:
---
- name: Apache'yi yeniden başlat
service:
name: apache2
state: restarted
roles/php/defaults/main.yml:
---
php_timezone: Europe/Istanbul # Kendi zaman diliminizi ayarlayın
PHP error log dizinini oluşturalım:
roles/php/tasks/main.yml dosyasına ekleyin (PHP paket kurulumundan sonra):
- name: PHP error log dizinini oluşturun
file:
path: /var/log/php
state: directory
owner: www-data
group: adm # Apache ve PHP'nin loglara yazabilmesi için
mode: '0775'
Playbook Oluşturma
Şimdiye kadar oluşturduğumuz rolleri bir araya getirecek ana playbook dosyasını oluşturalım.
playbooks/lamp_setup.yml:
---
- name: LAMP Stack Kurulumu ve Yapılandırması
hosts: webservers # inventory.ini dosyasındaki grup adı
become: yes # Tüm görevleri sudo ile çalıştır
# Varsayılan değişken dosyalarını dahil et (isteğe bağlı, hassas veriler için group_vars veya vault daha iyi)
# vars_files:
# - ../vars/main.yml # Bu dosyada hassas bilgi tutmak yerine ansible-vault kullanın
# Ansible'ın hedef sunucuda Python 3'ü kullanabildiğinden emin olmak için ön görev
# Ubuntu 18.04'te 'python' komutu genellikle python2'ye işaret eder, Ansible python3'e ihtiyaç duyar.
# Bu görev, eğer python komutu python3'e linklenmemişse python-is-python3 paketini kurar.
pre_tasks:
- name: Python 3'ün kurulu olduğundan emin olun (Ubuntu 18.04 için varsayılan)
raw: test -e /usr/bin/python || (apt update && apt install -y python-is-python3)
args:
creates: /usr/bin/python
changed_when: false # Bu komutun idempotence'ı olmadığı için
when: ansible_distribution == 'Ubuntu' and ansible_distribution_major_version == '18'
roles:
- common
- apache
- mysql
- php
Değişken Yönetimi ve Hassas Bilgiler
Yukarıdaki rol tanımlarında defaults/main.yml dosyalarında bazı değişkenler tanımladık. Ancak, özellikle şifreler gibi hassas bilgileri bu şekilde doğrudan dosyalarda tutmak güvenlik açısından önerilmez. Bunun yerine group_vars, host_vars veya en ideali ansible-vault kullanmalısınız.
group_vars/webservers.yml (Önerilen Yöntem):
lamp_ansible dizini altında group_vars adında bir dizin oluşturun ve içine webservers.yml adında bir dosya ekleyin. Bu dosya, webservers grubundaki tüm sunucular için geçerli olacak değişkenleri içerir.
mkdir group_vars
touch group_vars/webservers.yml
group_vars/webservers.yml içeriği:
# Hassas bilgiler için ansible-vault kullanılması şiddetle önerilir.
Bu örnekte, şifreler doğrudan görünür durumdadır.
mysql_root_password: "YOUR_VERY_STRONG_MYSQL_ROOT_PASSWORD"
mysql_db_name: "my_website_db"
mysql_db_user: "website_user"
mysql_db_password: "YOUR_VERY_STRONG_WEBSITE_USER_PASSWORD"
apache_servername: "example.com" # Kendi alan adınız veya sunucu IP'niz
apache_document_root: "/var/www/html/mywebapp"
php_timezone: "Europe/Istanbul"
Bu değişkenleri artık defaults/main.yml dosyalarından kaldırabilir veya bu dosyaları boş bırakabilirsiniz. group_vars içindeki değişkenler, defaults içindeki aynı isimli değişkenleri ezecektir.
Ansible Vault Kullanımı:
Şifreler gibi hassas bilgileri korumak için ansible-vault kullanmak en güvenli yoldur.
1. Bir vault dosyası oluşturun:
ansible-vault create group_vars/vault.yml
Bu komut sizden bir şifre isteyecek ve bu şifreyi kullanarak dosyayı şifreleyecektir.
2. vault.yml içine hassas değişkenlerinizi ekleyin:
mysql_root_password: "YOUR_VERY_STRONG_MYSQL_ROOT_PASSWORD"
mysql_db_password: "YOUR_VERY_STRONG_WEBSITE_USER_PASSWORD"
3. group_vars/webservers.yml dosyasında, bu vault dosyasını dahil edin:
# group_vars/webservers.yml
---
# Hassas olmayan değişkenler
mysql_db_name: "my_website_db"
mysql_db_user: "website_user"
apache_servername: "example.com"
apache_document_root: "/var/www/html/mywebapp"
php_timezone: "Europe/Istanbul"
# Hassas değişkenler için vault dosyasını dahil et
- @vault | include_vars: vault.yml
Not: Ansible’ın modern sürümlerinde include_vars modülü direkt olarak group_vars içinde kullanılabilir. Ancak, eski sürümlerde veya daha karmaşık senaryolarda bu yapı farklılık gösterebilir. En basit yol, vault.yml‘i ayrı bir group_vars dosyası olarak tutmak ve playbook’u çalıştırırken --ask-vault-pass kullanmaktır.
Alternatif (Daha Basit Vault Kullanımı):
group_vars/webservers.yml dosyasını doğrudan vault ile şifreleyebilirsiniz:
ansible-vault encrypt group_vars/webservers.yml
Bu durumda, webservers.yml içinde tüm değişkenleriniz (hem hassas hem de hassas olmayan) şifreli olacaktır. Playbook’u çalıştırırken ansible-playbook --ask-vault-pass ... komutunu kullanmanız gerekecektir. Bu yöntem, dosya yönetimi açısından daha basittir.
Playbook’u Çalıştırma
Tüm dosyaları oluşturup yapılandırdıktan sonra, Ansible playbook’unu çalıştırmaya hazırsınız. Kontrol makinenizin lamp_ansible dizininde olduğundan emin olun.
ansible-playbook -i inventory.ini playbooks/lamp_setup.yml --ask-become-pass
* -i inventory.ini: Envanter dosyamızı belirtir.
* playbooks/lamp_setup.yml: Çalıştırılacak ana playbook dosyamızı belirtir.
* --ask-become-pass: Eğer SSH anahtarınız sudo yetkisi için şifre gerektiriyorsa veya hedef sunucuda NOPASSWD ayarı yapılmamışsa, bu parametre sudo şifresini sormanızı sağlar. Eğer SSH anahtarınız sudo yetkisi için otomatik yetkilendirilmişse (veya NOPASSWD ayarı varsa), bu parametreye gerek kalmayabilir.
* Eğer ansible-vault kullandıysanız ve group_vars/webservers.yml dosyasını şifrelediyseniz, komuta --ask-vault-pass parametresini de eklemeniz gerekir:
ansible-playbook -i inventory.ini playbooks/lamp_setup.yml --ask-become-pass --ask-vault-pass
Ansible, görevleri sırayla yürütecek ve her adımın başarılı olup olmadığını size bildirecektir. Her şey yolunda giderse, playbook’un sonunda “PLAY RECAP” bölümünde tüm görevlerin başarıyla tamamlandığını görmelisiniz.
Kurulumu Doğrulama
Playbook başarıyla çalıştıktan sonra, LAMP yığınının hedef Ubuntu 18.04 sunucunuzda doğru bir şekilde kurulduğundan ve çalıştığından emin olmanız gerekir.
1. SSH ile Hedef Sunucuya Bağlanın:
ssh your_ssh_user@your_server_ip_address
2. Apache Durumunu Kontrol Edin:
sudo systemctl status apache2
Çıktıda active (running) ibaresini görmelisiniz.
3. MySQL Durumunu Kontrol Edin:
sudo systemctl status mysql
Çıktıda active (running) ibaresini görmelisiniz.
4. PHP Sürümünü Kontrol Edin:
php -v
Bu komut, kurulu PHP sürümünü (muhtemelen PHP 7.2.x) göstermelidir.
5. Web Tarayıcısı Üzerinden Test Edin:
Playbook, apache_document_root dizini altında bir info.php dosyası oluşturmuştu. Web tarayıcınızı açın ve hedef sunucunuzun IP adresine veya yapılandırdığınız alan adına giderek http://your_server_ip_address/info.php adresini ziyaret edin.
PHP bilgi sayfasını (phpinfo()) görmelisiniz. Bu sayfa, PHP’nin doğru çalıştığını ve Apache ile entegre olduğunu doğrular. Sayfanın en altında veya MySQL bölümünde mysql veya mysqli uzantılarının etkin olduğunu kontrol edebilirsiniz.
6. MySQL Bağlantısını Test Edin:
MySQL veritabanına ve kullanıcısına bağlanmayı deneyin:
mysql -u my_db_user -p my_website_db
my_db_user ve my_website_db yerine kendi belirlediğiniz kullanıcı adı ve veritabanı adını kullanın. Şifre istendiğinde, mysql_db_password değişkeninde belirlediğiniz şifreyi girin.
Başarılı bir şekilde bağlanırsanız, MySQL komut istemine düşeceksiniz. show tables; gibi basit bir komut çalıştırarak bağlantının çalıştığını doğrulayabilirsiniz. Çıkmak için exit; yazın.
Tüm bu kontroller başarılı olursa, LAMP yığınınızın Ansible tarafından başarıyla kurulduğunu ve yapılandırıldığını teyit etmiş olursunuz.
Sonuç ve İleri Adımlar
Bu makalede, Ansible’ın güçlü otomasyon yeteneklerini kullanarak Ubuntu 18.04 sunucusu üzerine eksiksiz bir LAMP yığınının nasıl kurulacağını ve yapılandırılacağını öğrendiniz. Adım adım bir proje yapısı oluşturduk, Ansible rollerini tasarladık ve her bir LAMP bileşeni için görevleri tanımladık. Ayrıca, değişken yönetimi ve hassas bilgilerin güvenli bir şekilde nasıl saklanacağı konularına da değindik.
Ansible’ın sunduğu bu otomasyon, sunucu kurulum süreçlerinizi standartlaştırmanıza, hataları en aza indirmenize ve zaman içinde tutarlılığı sağlamanıza olanak tanır. Bir kez yazılan playbook’lar, yüzlerce sunucuya aynı yapılandırmayı uygulamak için tekrar tekrar kullanılabilir.
İleri Adımlar ve Geliştirmeler:
1. Ansible Vault Kullanımı: Makalede bahsedildiği gibi, hassas bilgileri (şifreler, API anahtarları vb.) ansible-vault ile şifrelemek, güvenlik açısından kritik öneme sahiptir. Playbook’larınızı üretim ortamında kullanmadan önce bu adımı mutlaka uygulayın.
2. Farklı Ortamlar İçin Değişken Yönetimi: Geliştirme, test ve üretim gibi farklı ortamlar için farklı değişken değerleri tanımlamak amacıyla group_vars ve host_vars dizinlerini daha etkin kullanın. Örneğin, group_vars/development.yml ve group_vars/production.yml gibi dosyalar oluşturabilirsiniz.
3. HTTPS (SSL/TLS) Yapılandırması: Güvenli web iletişimi için Apache’ye SSL sertifikası (örneğin Let’s Encrypt ile) kurmak ve yapılandırmak için Ansible görevleri ekleyebilirsiniz.
4. Veritabanı Yedekleme ve Yönetimi: MySQL veritabanlarınız için periyodik yedekleme görevleri veya veritabanı şemasını yöneten ek Ansible görevleri oluşturabilirsiniz.
5. Uygulama Dağıtımı: LAMP yığını kurulduktan sonra, kendi PHP uygulamanızın kodunu sunucuya dağıtmak ve gerekli izinleri ayarlamak için Ansible kullanabilirsiniz. Bu, git modülü veya copy modülü ile kolayca yapılabilir.
6. Güvenlik İyileştirmeleri: Fail2ban gibi araçları kurarak SSH ve web sunucusu saldırılarına karşı koruma sağlayabilir, veya ek güvenlik duvarı kuralları tanımlayabilirsiniz.
7. Monitoring ve Logging: Prometheus, Grafana veya ELK Stack (Elasticsearch, Logstash, Kibana) gibi izleme ve günlükleme araçlarını kurmak ve entegre etmek için Ansible rolleri geliştirebilirsiniz.
8. CI/CD Entegrasyonu: Ansible playbook’larınızı Jenkins, GitLab CI/CD veya GitHub Actions gibi sürekli entegrasyon/sürekli dağıtım (CI/CD) boru hatlarına entegre ederek, altyapı değişikliklerini otomatik olarak test edip dağıtabilirsiniz.
Ansible, altyapı otomasyonu dünyasında size sınırsız olanaklar sunar. Bu makaledeki LAMP kurulumu, bu yolculuğun sadece bir başlangıcıdır. Ansible’ın derinliklerine indikçe, altyapı yönetim süreçlerinizi ne kadar basitleştirebileceğinizi ve hızlandırabileceğinizi keşfedeceksiniz.