“X” as Code, IT sektöründeki herhangi bir disiplini kod ile ifade ettiğimiz, yaptığımız ve tekrar eden işlerimizi otomatize etmek için çeşitli araçlar ve yöntemler kullandığımız disiplinler bütünüdür diye tanımlanabilir. Configuration as Code, Infrastructure as Code ya da Everything as Code gibi farklı pratikleri olan bu disiplin, DevOps kültürünün önemli bir parçası olarak konumlanır.

Bu yazımızda, Infrastructure as Code konusunun tanımını yaparak Infrastructure as Code’un ve Configuration Management‘in en önemli aracı Ansible’dan bahsedeceğiz. Infrastructure as Code, yani Kod olarak Altyapı özetle; altyapınızın kod olarak ifade edilip, bir versiyonlama sisteminde tutulması işlemine verilen isimdir. Sitenizi ya da uygulamanızı on-prem ortamdan buluta taşıdığınızı varsayalım.

Uygulamanın çalıştığı makineleri (Infrastructure) tek tek açmak yerine, servis sağlayacının anlayacağı şekilde (Code) ifade ederek bir kez yazıp, uygulamayı bu şekilde ayağa kaldırma işlemine özetle Infrastructure as Code diyoruz. Avantaj olarak bizlere yapısal bir probleme kolayca müdahale etme olanağı sağlıyor. Peki, Infrastructure as Code yani IaC’ı nasıl hayata geçiriyoruz? Çeşitli araçlar kullanarak altyapımızı kod şeklinde ifade ediyoruz kısaca. Bu araçlardan bazıları Terraform, Ansible, Chef vb. Bu yazımızda Ansible‘a giriş yapacağız.

Ansible Nedir?

Ansible Red-Hat‘in geliştirdiği, Python ve Ruby ile yazılmış özgür bir otomasyon yazılımıdır. Yöneteceğimiz sunucular üzerine herhangi bir agent kurmadan(only unix, windows’da çalıştırmak istersek script çalıştırmamız gerekiyor.) işlem yapmamıza olanak sağlar. Bunun yanında bünyesinde barındırdığı 400’den fazla modül ile gerek on-prem ortamlarımızı, gerekse cloud ortamlarımızı yönetebilmemizi sağlayan oldukça geniş bir kullanım alanı sunar. Kurulum işlemleri çok basit, kısaca Ubuntu sistemler için;


$ sudo apt-get install software-properties-common 
$ sudo apt-add-repository ppa:ansible/ansible 
$ sudo apt-get update 
$ sudo apt-get install ansible

komutu ile kurulum yapabilirsiniz. Daha fazlası için tıklayın 

Ansible Nasıl Kullanılır?

Örneğin 10 sanal sunucu üzerine kurmanız gereken webserver var, Ansible ile bunu bir Yaml dosyası yazarak tek seferde yazıp 10 sunucu üzerinde tek bir komutla koşarak kurabiliyorsunuz. Adından da anlaşılacağı üzere Ansible dosyaları Yaml formatıyla yazılıyor. Bu hem rahat yazma hem de rahat okuma imkanı sağlıyor. Ansible terimlerinden ve dosya yapısına gelecek olursak:

Task: Ansible’a yaptırmak istediğimiz işlere verilen isim. Modüller kullanarak otomatize etmek istediğimiz işler.
Role: Belli amaçlar uğruna yazılmış task’ların bir araya gelmiş hali.
Playbook: Rollerin bir araya gelmiş hali, bir yapı kurma amacıyla oluşturulmuş
kompleks Ansible yapısı.
Module: Taskları yazabilmek için kullandığımız kütüphaneler. Ansible 400’den fazla modulu ile pek çok farklı işi otomatize etmemize olanak sağlıyor. Network, Cloud, Sanallaştırma, Configration Management, vb. Geniş bir yelpazesi mevcut. Modül Listesi için tıklayın: https://docs.ansible.com/ansible/latest/modules/modules_by_category.html

Dosya yapısını inceleyecek olursak, Ansible  yazdığımız rolleri ekip üyelerinin de kullanabilmesi için public bir alan sunar. Bu public alan, Galaxy olarak adlandırılır. Paylaşabilmek için rollerimizi belli bir standartta yazmamız gerekiyor, bunun için Ansible bize boş bir template yaratma imkanı sunuyor, aşağıdaki komut ile boş bir Role yaratıyoruz ve yapısını inceliyoruz:


ansible-galaxy init continium-role

continium-role adında bir tane boş Role yarattık, içerisine bakacak olursak:


.
├── README.md
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml ├── meta
│ └── main.yml ├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml

Defaults: Burada Role’un çalışması için gerekli değişkenleri belirleyip yazıyoruz.

Files: Buraya uzak sunucuya kopyalanacak, role için gerekli olan dosyaları atıyoruz.

Handlers: Burada taskler içerisinde notify kısmı ile belirtilen işlemleri yazdığımız yerlerdir. Örneğin bir servisi task ile restart etmek yerine notify ile handlers’a point edip, buradan restart ediyoruz.

Meta: Burada role hakkında bilgiler veriyoruz, role’u yazan gereksinimleri vs.

Tasks: Burada role’un ne yapacağını adım adım yazıyoruz. main.yml içerisine ya da kendi belirledeğimiz herhangi bir .yml uzantılı dosya ile role’un ne yapmasını istiyorsak bu kısma yazıyoruz.

Templates: Templates, Jinja2 sytanxını kullanır, role için gerekli olan text tabanlı scriptleri oluşturmak için kullanılır. Örneğin bir nginx.conf yazmak istediğinizde kullanabilirsiniz.

Tests: Role’u test etmek için gerekli ayarları yaptığınız kısım. En iyi test gerçek sunucu üzerinde yapılır.

Vars: Defaults kısmında olduğu gibi burada da role için gerekli değişkenleri yazılır. Tek fark Vars kısmına yazdığınız değişkenler, Defaults kısmında da var ise override eder, defaults kısmını ezer.

Kısaca bir role yazmak istediğimizde kullanmamız gereken yapı bu şekilde. Ansible tasklerini çalıştırmak için Ansible komutunu kullanıyoruz, yukarıdaki örnekte görüldüğü gibi Ansible galaxy ile işlemlerimiz için ise ansible-galaxy komutunu kullanıyoruz. Playbook’larımızı çalıştırmak için ise ansible-playbook playbook-ismi.yml komutunu kullanıyoruz.

Bir sonraki yazımızda Ansible ile basit bir role yazacağız.

 

Emre Aydınsoy

DevOps Mühendisi