Takip et

Ansible ile Ubuntu 18.04 Üzerine LAMP Kurulumu ve Yapılandırması

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

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.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Exit mobile version