Sign In

 

 

Ansible ve Docker ile Altyapı - Uygulama Otomasyonları ve Yönetim [nginx, dotnet-core, consul.io, mongodb]Ansible ve Docker ile Altyapı - Uygulama Otomasyonları ve Yönetim [nginx, dotnet-core, consul.io, mongodb]5132018-09-14T07:35:00Z 14.9.2018 07:35:00Gencebay Demir<div class="ExternalClassD60C524137FD45E3A1AC9B1A9E7030CD"><p>Bizler her geçen gün daha iyi bir teknik altyapı için birlikte çalışıyoruz. Web, mobil veya masaüstü uygulama örneklerinin, servisler ve sunucuların en uygun şekilde canlı ortama geçişi için çeşitli araçlar ve yöntemler kullanıyoruz.</p><p>Bazı durumlarda sıfırdan onlarca sunucu veya ortam ayaklandırıp her birine aynı programları kuruyor, izinleri veriyor ve protokol erişimleri sağlıyoruz. Zaman içerisinde yeni eklenen bileşenler de tekrarlı bir şekilde aynı süreçlerden nasibini alıyor.</p><p>Bu yazıda tüm bu işlemler için Infrastructure as Code (IaC) - Kod Olarak Alt Yapı ve IT (Bilgi Teknolojileri) otomasyon aracı <strong>Ansible</strong>'ı kullanarak örnek bir uygulama ve mimari yapı üzerinden yapılandırma yönetimi çözümü üretmeye çalışacağız.</p><p>Kod olarak alt yapı; bir işi yapmak üzere belli özelliklere, programlara ve izinlere sahip olması beklenen bilgisayarların etkileşimli yapılandırma araçları yerine kod ile veya çalıştırıcısına özel hazırlanmış dosyalar aracılığıyla istenilen özelliklere sahip olması ve yönetilmesi olarak ifade edilebilir.</p><p>Ansible; belirli dosya tiplerinde tanımlanmış görevlerin veya rollerin, envanterde yer alan bilgisayarlar (hosts) üzerinde çalıştırılarak yerine getirilmesini sağlar. Böylece bir sisteme eklenecek yeni bir bilgisayarı, güncellenecek bir servisi veya yüklenecek yeni bir programı ortamlarımıza uygun yapılandırmalar ile adapte eder, hazır hale getirir.</p><p>Hazırladığım Ansible projesi için; (<a href="https://github.com/gencebay/AnsibleLab" target="_blank" style="text-decoration:underline;"><span class="ms-rteForeColor-8" style="text-decoration:underline;">GitHub</span></a>) Docker, sanal makine sağlayıcısı - provizyon görevini yerine getirirken <strong>docker-compose</strong> ile de çoklu konteyner yönetimini gerçekleştireceğiz. Bu sayede Ansible modül ve görevlerini belirli sunucu gruplarında kolaylıkla çalıştırıp sonuçlarını kontrol edebileceğiz.</p><p>Bu proje ile müzik listelerini altüst eden albümlere ait bilgileri HTTP API olarak sunan uygulamayı üç sunucuda yayına alacağız. Çalışmaya başlayan her uygulama <strong>Consul</strong>'a kendini kayıt edecek ve uygulamalar <strong>MongoDB</strong> veri tabanından okuma işlemi yapacak.</p><p> <strong>ANSIBLE LAB​</strong></p><p> <strong>Ansible Yönetim Bilgisayarı - Ansible Controller</strong><br>Envantere kayıtlı tüm bilgisayarlara ssh üzerinden bağlanıp görev ve modülleri çalıştıracak olan işlemciye Ansible Yönetim​ ​Bilgisayarı ​adını verelim.</p><p> <strong>Envanter</strong>; sunucu - host grup bilgilerini belirttiğimiz tercihen <a href="https://github.com/gencebay/AnsibleLab/blob/master/playbooks/ansible_hosts" target="_blank" style="text-decoration:underline;"><span class="ms-rteForeColor-8" style="text-decoration:underline;">ansible_hosts​</span></a> ​isimli dosyada tanımlanan kayıtları ifade eder. Bu dosya; Ansible Yönetim Bilgisayarı için sunucu adlarını, IP adreslerini, <strong>ssh</strong> anahtar bilgilerini ve daha birçok değişkeni temin edebilir.</p><p>Örnek içeriği şu şekildedir:​</p><pre class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:16px;margin-top:0.5em;margin-bottom:0.5em;color:#000000;background:#f5f2f0;text-shadow:#ffffff 0px 1px;word-break:normal;word-wrap:normal;line-height:1.5;padding:1em;overflow:auto;max-width:100%;"><code class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:inherit;background:0px 0px;text-shadow:#ffffff 0px 1px;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;max-width:100%;">[api] api01 api02 api03 [db] mongo [all:vars] ansible_user=root ansible_python_interpreter=/usr/bin/python3 ansible_ssh_private_key_file=~/.ssh/AnsibleLabKey</code></pre><p>​​Bu dosyada sunucu isimlerinin <strong>docker-compose.yml</strong> dosyasında belirtilen konteyner isimleriyle aynı olduğuna dikkat ediniz. <strong>[all:vars]</strong> ifadesiyle belirtilen değişken ikililerinin tüm sunucular için geçerli olmasını sağlayabiliriz.</p><p>Bu proje için planladığımız Ansible Yönetim Bilgisayarının diğer tüm ortam sunucularına bağlanabilmesi için bir şifreleme anahtarı oluşturarak başlayabiliriz.</p><pre class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:16px;margin-top:0.5em;margin-bottom:0.5em;color:#000000;background:#f5f2f0;text-shadow:#ffffff 0px 1px;word-break:normal;word-wrap:normal;line-height:1.5;padding:1em;overflow:auto;max-width:100%;"><code class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:inherit;background:0px 0px;text-shadow:#ffffff 0px 1px;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;max-width:100%;">ssh-keygen -t rsa -b 1024 -C "AnsibleLabKey"</code></pre><p>​Şifre (passphrase) girmeden oluşturduğumuz özel ve genel erişimli güvenlik anahtar dosyalarını kullanmak üzere proje dizininde muhafaza edelim. Daha sonra genel erişimli güvenlik anahtarını (AnsibleLabKey.pub) <strong>ssh </strong>bağlantısı için tüm ortam sunucularının ​<strong>authorized_keys</strong> isimli dosyasına eklememiz gerekecek. (Bu kısmı Dockerfile ile yapacağız).<br></p><p>Bu aşamadan sonra Ansible Yönetim Bilgisayarını hazırlamak için buradaki <a href="https://github.com/gencebay/AnsibleLab/blob/master/ansible/Dockerfile" target="_blank" style="text-decoration:underline;"><span class="ms-rteForeColor-8" style="text-decoration:underline;">ansible/Dockerfile</span>​</a>'ı kullanabiliriz.</p><pre class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:16px;margin-top:0.5em;margin-bottom:0.5em;color:#000000;background:#f5f2f0;text-shadow:#ffffff 0px 1px;word-break:normal;word-wrap:normal;line-height:1.5;padding:1em;overflow:auto;max-width:100%;"><code class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:inherit;background:0px 0px;text-shadow:#ffffff 0px 1px;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;max-width:100%;">docker build -t ansible-lab -f ansible/Dockerfile</code></pre><p>​Proje ana dizininde iken yukarıdaki komut çalıştırıldığında <strong>özel güvenlik anahtarı</strong> bilgileri aktarımı, <strong>ssh</strong> ve <strong>Ansible</strong> kurulumu yapılmış hazır bir docker imajı elde etmiş oluruz.</p><p>Ansible' ı hazırladığımıza göre sunucular ve gereksinimleri üzerine çalışmaya başlayabiliriz.</p><p><strong>Sunucular</strong></p><p>Ansible sunuculara ssh ile bağlanacağından oluşturacağımız sunucu imajları için openssh-server programını ve python programlama dili kurulumlarını yapmalıyız.</p><p>Bunun için uygulamamızı yayınlayacağımız sunucuları için ​buradaki <a href="https://github.com/gencebay/AnsibleLab/blob/master/api/Dockerfile" target="_blank" style="text-decoration:underline;"><span class="ms-rteForeColor-8" style="text-decoration:underline;">api/Dockerfile</span>​</a>'ı hazırladım.</p><pre class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:16px;margin-top:0.5em;margin-bottom:0.5em;color:#000000;background:#f5f2f0;text-shadow:#ffffff 0px 1px;word-break:normal;word-wrap:normal;line-height:1.5;padding:1em;overflow:auto;max-width:100%;"><code class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:inherit;background:0px 0px;text-shadow:#ffffff 0px 1px;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;max-width:100%;">docker build -t api-lab -f api/Dockerfile .</code></pre><p>​Bu komut ile api-lab isimli docker imajını oluşturabiliriz.</p><p>MongoDB veri tabanı için kullanacağımız <a href="https://github.com/gencebay/AnsibleLab/blob/master/db/Dockerfile" target="_blank" style="text-decoration:underline;"><span class="ms-rteForeColor-8" style="text-decoration:underline;">db/Dockerfile</span>​</a> dosyası ile</p><pre class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:16px;margin-top:0.5em;margin-bottom:0.5em;color:#000000;background:#f5f2f0;text-shadow:#ffffff 0px 1px;word-break:normal;word-wrap:normal;line-height:1.5;padding:1em;overflow:auto;max-width:100%;"><code class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:inherit;background:0px 0px;text-shadow:#ffffff 0px 1px;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;max-width:100%;">docker build -t mongo-lab -f db/Dockerfile .</code></pre><p>komutunu çalıştırarak <strong>mongo-lab</strong> isimli imajı hazırlamış oluruz. Consul için varsayılan Dock​er imajını olduğu haliyle kullanabiliriz.<br></p><p>Lab ortamında oluşturacağımız birden fazla docker konteynerı için <strong>docker-compose</strong> aracını kullanacağımızı belirtmiştik. Bunun için proje ana dizininde yer alan <a href="https://github.com/gencebay/AnsibleLab/blob/master/docker-compose.yml" target="_blank" style="text-decoration:underline;"><span class="ms-rteForeColor-8" style="text-decoration:underline;">docker-compose.yml</span>​</a> isimli dosya ile az önce oluşturduğumuz imajlar üzerinden servisler tanımlamamız yeterlidir. Bu araç ile farklı işleri yapmak ü​zere tasarladığımız servislerin işlem ve kaynak kapasitelerini yönetebilir ve çalıştırabiliriz.</p><pre class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:16px;margin-top:0.5em;margin-bottom:0.5em;color:#000000;background:#f5f2f0;text-shadow:#ffffff 0px 1px;word-break:normal;word-wrap:normal;line-height:1.5;padding:1em;overflow:auto;max-width:100%;"><code class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:inherit;background:0px 0px;text-shadow:#ffffff 0px 1px;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;max-width:100%;">docker-compose up -d</code></pre><p>​komutu ile <strong>docker-compose.yml</strong> dosyasında az önce ​oluşturduğumuz imajlar ile belirlediğimiz servisleri başlatalım.​</p><p><img src="/blog/PublishingImages/Lists/Posts/AllPosts/DockerComposeUpView.png" alt="DockerComposeUpView.png" style="margin:5px;width:575px;height:393px;" /><br></p><p>Bu aşamaya kadar yaptığımız ayarların doğru çalışıp çalışmadığını ve sunucularımızın erişim durumlarını Ansible <strong>ping </strong>modülü ile kontrol edebiliriz. Bunun için öncelikle envanter bilgileri, uygulama dağıtım paketini, servis kayıtlarını ve <a href="https://github.com/gencebay/AnsibleLab/blob/master/playbooks/app.yml" target="_blank" style="text-decoration:underline;"><span class="ms-rteForeColor-8" style="text-decoration:underline;">app.yml​</span></a> gibi gerekli dosyaları tuttuğumuz <strong>playbooks </strong>isimli klasörü az önce çalıştırdığımız ​<strong>ansible </strong>isimli konteynera kopyalayıp shell ara yüzüne bağlanalım:</p><pre class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:16px;margin-top:0.5em;margin-bottom:0.5em;color:#000000;background:#f5f2f0;text-shadow:#ffffff 0px 1px;word-break:normal;word-wrap:normal;line-height:1.5;padding:1em;overflow:auto;max-width:100%;"><code class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:inherit;background:0px 0px;text-shadow:#ffffff 0px 1px;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;max-width:100%;">docker cp playbooks ansible:/home/ docker exec -i -t ansible /bin/bash</code></pre><p>​​<img src="/blog/PublishingImages/Lists/Posts/AllPosts/DockerCopyAndPing.png" alt="DockerCopyAndPing.png" style="margin:5px;width:575px;height:348px;" /><br></p><pre class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:16px;margin-top:0.5em;margin-bottom:0.5em;color:#000000;background:#f5f2f0;text-shadow:#ffffff 0px 1px;word-break:normal;word-wrap:normal;line-height:1.5;padding:1em;overflow:auto;max-width:100%;"><code class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:inherit;background:0px 0px;text-shadow:#ffffff 0px 1px;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;max-width:100%;">/home/playbooks# ansible all -m ping -i ansible_hosts</code></pre><p>Bu komut ile host dosyasında tanımlı tüm sunucular için Ansible ping modülünün komut satırından bir defaya mahsus çalıştırılması sağlanır. Ansible varsayılan olarak birçok modül barındırır ve bunların <strong>ping, apt, file, copy, service</strong> vb. isimleriyle sıkça kullanacaklarımıza yeri geldikçe değineceğim. Resmi sitesi ve dokümantasyon kısmından modüller hakkında detaylı bilgilere ulaşabilirsiniz.</p><p>Ansible ve özel Docker imajlarımıza ait ayarları tamamlayıp ping modülü başarıyla çalıştığına göre bir sonraki adıma geçebiliriz.</p><p>Web sunucuları:</p><ul><li>- Nginx - HTTP isteklerini karşılayıp reverse-proxy olarak çalışacak.<br></li><li>- .NET Core web uygulaması istekleri işleyecek.<br></li><li>- Uygulamamız için <strong>daemon </strong>kaydı oluşturulup çalışma sürekliliği ​​sağlanacak.<br></li></ul>Veri tabanı sunucusu: <p></p><ul><li>- 27017 portundan ve tüm IP adreslerinden hizmet verecek şekilde çalışacak.<br></li><li>- <strong>db/musicstore.archive</strong> isimli örnek veri tabanı yedeği varsayılan olarak yüklü gelecek.<br></li></ul><p>Consul:</p><ul><li>​- Ek bir yapılandırma gerekmeden servis kayıt isteklerini alıp uygulama durum (health check) bilgilerini sağlayacak.<br></li></ul><p>Yukarıda saydığım adımların Ansible tarafından belirtilen sunucularda oynatılması - çalıştırılması için <a href="https://github.com/gencebay/AnsibleLab/blob/master/playbooks/app.yml" target="_blank" style="text-decoration:underline;"><span class="ms-rteForeColor-8" style="text-decoration:underline;">playbooks/app.yml​</span></a> isimli dosyayı hazırladım. Sunucuları ilgilendiren işlemleri, scriptleri ve senaryoları tanımladığımız bu dosyalara Ansible için ​​<strong>Playbooks </strong>deniyor.</p><p>Bu dosya <strong>hosts: db</strong> ve <strong>hosts: api </strong>bölümleriyle iki kısımdan oluşuyor. Bu kısımların, host tanımlarını yaptığımız dosyada (<strong>ansible_hosts</strong>) belirtilen <strong>db </strong>ve <strong>api </strong>gruplarını işaret ettiği kolayca anlaşılabilir.</p><p>Bu gruplar için belirlediğimiz görevler <strong>tasks </strong>kısmında isim ve modül bilgisi içerecek şekilde sıralanır.</p><pre class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:16px;margin-top:0.5em;margin-bottom:0.5em;color:#000000;background:#f5f2f0;text-shadow:#ffffff 0px 1px;word-break:normal;word-wrap:normal;line-height:1.5;padding:1em;overflow:auto;max-width:100%;"><code class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:inherit;background:0px 0px;text-shadow:#ffffff 0px 1px;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;max-width:100%;">- name: Copy default mongodb config file copy: src=/etc/mongod.conf.orig dest=/etc/mongod.conf remote_src=yes</code></pre><p>​​Yukarıdaki satır ile <strong>db </strong>grubu için sunucu tarafında yer alan mongod.conf.orig isimli dosya, mongod.conf adıyla aynı dizine kopyalanır. İlgili dosyanın modülün çalıştırıldığı bilgisayarda olduğunu <strong>remote_src=yes</strong> parametresiyle belirtmiş oluruz.</p><p>Bir diğer komut ise;​</p><pre class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:16px;margin-top:0.5em;margin-bottom:0.5em;color:#000000;background:#f5f2f0;text-shadow:#ffffff 0px 1px;word-break:normal;word-wrap:normal;line-height:1.5;padding:1em;overflow:auto;max-width:100%;"><code class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:inherit;background:0px 0px;text-shadow:#ffffff 0px 1px;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;max-width:100%;">- name: Download the dep file get_url: url: <a class="token url-link" href="https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb" style="text-rendering:optimizelegibility;box-sizing:border-box;background:0px 0px;color:#333333;transition:color 0.3s ease 0s;">https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb</a> dest: /home/packages-microsoft-prod.deb</code></pre><p>​​şeklinde eklenerek ilgili adresten <strong>dotnet-core runtime</strong> kurulumu için gerekli dosyanın daha sonraki adımlarda kullanılmak üzere ilişkili dizine indirilmesi sağlanır.</p><p>Başka bir örnekte ise;​​​​​</p><pre class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:16px;margin-top:0.5em;margin-bottom:0.5em;color:#000000;background:#f5f2f0;text-shadow:#ffffff 0px 1px;word-break:normal;word-wrap:normal;line-height:1.5;padding:1em;overflow:auto;max-width:100%;"><code class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:inherit;background:0px 0px;text-shadow:#ffffff 0px 1px;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;max-width:100%;">- name: Install nginx apt: name=nginx state=present update_cache=yes</code>​</pre><p><strong>​Apt </strong>paket yöneticisi kullanılarak <strong>nginx </strong>web sunucusu programının kurulması ve update_cache parametresi ile paketi yüklemeden önce apt-get update komutunun çalıştırılması sağlanır.</p><p><strong>App.yml</strong> dosyasında birbirine benzer birçok modül-komut kullanımı görebilirsiniz. Burada tanımlı diğer görevler modül ismi ile okunduğu şekilde yorumlanabilir. Her birini ayrı ayrı burada detaylandırmaya gerek olmadığını düşünüyorum. Bunun yerine Ansible resmi sitesinde geçen modül dokümantasyonları incelenebilir.</p><p>Ansible' ın bu dosya ile çalışma mantığı basitçe şu şekilde olacaktır:</p><ul><li>- Görevler modülleri çağırır.<br></li><li>- Görevler birbirini ardına - sıralı şekilde çalışır.<br></li><li>- İşleyiciler (handlers) görevler tarafından tetiklenir ve bir defa olarak oynatılan adımların sonunda çalışır.<br></li></ul><p>Bu proje için geliştirdiğimiz dotnet-core uygulamasına ait kaynak kodları çalışma dizininde <strong>api/app/Api.Hosting</strong> isimli klasör altında bulunduracağız. Yaptığımız geliştirmeler tamamlandıkça şu komut ile:</p><pre class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:16px;margin-top:0.5em;margin-bottom:0.5em;color:#000000;background:#f5f2f0;text-shadow:#ffffff 0px 1px;word-break:normal;word-wrap:normal;line-height:1.5;padding:1em;overflow:auto;max-width:100%;"><code class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:inherit;background:0px 0px;text-shadow:#ffffff 0px 1px;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;max-width:100%;">dotnet publish -c Release -o bin/hosting api/app/Api.Hosting/Api.Hosting.csproj</code></pre><p>uygulama sürümü için hazır derlemeyi oluşturup​</p><pre class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:16px;margin-top:0.5em;margin-bottom:0.5em;color:#000000;background:#f5f2f0;text-shadow:#ffffff 0px 1px;word-break:normal;word-wrap:normal;line-height:1.5;padding:1em;overflow:auto;max-width:100%;"><code class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:inherit;background:0px 0px;text-shadow:#ffffff 0px 1px;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;max-width:100%;">tar -C $(pwd)/api/app/Api.Hosting/bin/hosting/ -zcvf playbooks/app.tar.gz .</code></pre><p>​komutu ile de ilgili dosyaların paketlenmesini sağlayacağız.</p><p>Böylelikle Ansible için oluşturduğumuz <strong>playbooks </strong>isimli klasör altında en güncel uygulama dağıtım sürümü olacak. GitHub, GitLab, VSTS gibi bulut tabanlı kod depolarının kullanımı daha sonraki yazılarda detaylandıracağız.</p><p>Uygulama dosyaları ile birlikte <strong>playbooks </strong>isimli klasörü Ansible Yönetim Bilgisayarına kopyaladıktan sonra <strong>app.yml</strong> içerisindeki tüm sıralı görevlerin çalıştırılması için</p><pre class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:16px;margin-top:0.5em;margin-bottom:0.5em;color:#000000;background:#f5f2f0;text-shadow:#ffffff 0px 1px;word-break:normal;word-wrap:normal;line-height:1.5;padding:1em;overflow:auto;max-width:100%;"><code class=" language-markup" style="text-rendering:optimizelegibility;box-sizing:border-box;font-family:consolas, monaco, "andale mono", "ubuntu mono", monospace;font-size:inherit;background:0px 0px;text-shadow:#ffffff 0px 1px;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;max-width:100%;">/home/playbooks# ansible-playbook app.yml -i ansible_hosts</code></pre><p>​komutunu çalıştırmalıyız. Bu sayede tüm sunucularda sırasıyla çalışan işlem ve adımlara dair detaylı bilgiler verilecek ve başarıyla çalıştıktan sonra şu görüntüyü elde etmiş olacaksınız.</p><p><img src="/blog/PublishingImages/Lists/Posts/AllPosts/AnsiblePlayRecap.png" alt="AnsiblePlayRecap.png" style="margin:5px;width:575px;height:464px;" /><br></p><p>İşlemler tamamlandığında uygulamaya ait HTTP adreslerini ve Consul ara yüzünü tarayıcıda kontrol edebiliriz.​</p><p><img src="/blog/PublishingImages/Lists/Posts/AllPosts/FullServiceInfo.png" alt="FullServiceInfo.png" style="margin:5px;width:575px;height:370px;" /><br></p><p>Öncelikle Ansible ile ilgili kısımları iyi kavramakta fayda var. Daha sonra ki yazılarda docker-compose ve swarm ile scale ve replica özellikleri kullanılarak bilgisayar sayılarının otomatik olarak arttırılmasını deneyip ayrıca bir istemci uygulamasının (Web, SPA) yük dengeleyici kullanarak bu servislere ulaşmasını sağlayamaya çalışacağız.</p><p>Ansible kendi içerisinde veya haricen geliştirilen birçok hazır modül, görev ve rol sunmaktadır. Elbette docker ile entegre olarak çalışabilen <strong>docker_container, docker_image </strong>ve <strong>docker_servis </strong>isimli Ansible modüllerini değerlendirebiliriz. Bu yazı dizisinde önceliğimiz Docker ve Ansible' ın yönetim, test, modüller vb. özelliklerini ve kabiliyetlerini kavramak sonrasında Production için bu araçları rahatlıkla kullanabilmeye hazırlanmak olacaktır.</p><p>Vagrant' ın da Ansible'ı öğrenmek ve ilerletmek için iyi bir araç olduğu söyleniyor fakat ben yatkınlığım ve bana kolay gelişi sebebiyle Docker'ı tercih ettim.</p><p>Faydalı olması dileğiyle. Bir de Sensible Soccer vardı :) efsaneyi anmadan olmaz.​​</p></div>ansible-ve-docker-ile-altyapi-uygulama-otomasyonlari-ve-yonetimhttp://www.bilgeadam.com/blog/Lists/Photos/PostImages/ansible-ve-docker.jpgBu yazıda tüm bu işlemler için Infrastructure as Code (IaC) - Kod Olarak Alt Yapı ve IT (Bilgi Teknolojileri) otomasyon aracı Ansible' ı kullanarak örnek bir uygulama ve mimari yapı üzerinden yapılandırma yönetimi çözümü üretmeye çalışacağız.bluePRO

Yazara Soru Sor




SORU GÖNDER