background

Ansible on Azure DevOps Pipelines

Ansible on Azure DevOps Pipelines

Herkese Merhaba Bu yazımda sizlere Azure DevOps Server üzerinde bulunan pipeline aracılığı ile sunucu konfigürasyon yazılımı olan Ansible’ı nasıl otomatize edeceğimizden bahsedeceğim.İnternette Ansible ile alakalı oldukça fazla türkçe kaynak olduğundan bu yazıda Ansible’ın detaylarına , çalışma mantığına çok fazla deyinmeyeceğim. Bunun yerine aşağıya bir kaç referans link ekledim Peki tamam ama Ansible neydi? Kısaca bir tanımlasak fena olmaz ..Ansible için kabaca bir tanım yapmak gerekirse sunucu konfigürasyonları için kullanılan bir otomasyon yazılımıdır. Yönetmekte olduğunuz sunucuları tek bir noktadan yapılandırabilmenize yardımcı olan bir özgür yazılım platformudur. İlk olarak 2012 de piyasaya sunulmuştur. Sonrasında RedHat tarafından satın alınarak hem RedHat ürünlerinde gömülü olarak kullanılmakta hem de ayrı bir yazılım olarak hizmet vermek için geliştirilmeye devam edilmektedir. DevOps yapmak istiyorum, herşeyimi otomatize etmek istiyorum diyorsanız; Ansible sizin için vazgeçilmez bir otomasyon toolu olacaktır.Şimdi Ansible’ı CI/CD hatlarımızda nasıl kullanabileceğimize bakalım. Başlıkta da belirtmiş olduğum gibi CI/CD uygulaması olarakAzure DevOps Server’a ait Pipelines componentini kullanacağım.
NOT : Ben burada onpremis de bulunan Azure DevOps Server üzerinden örneklerimi yapacağım. Cloud’da bulunan Azure DevOps hizmetinde bazı farklılıklar mevcut. Ancak çalışma mantığı her ikisinde de aynı.
Burada ilk olarak yapmamız gereken Ansible ile çalıştıracağımız işlemleri playbook dosya yapısı ile hazırlamak ve bunu bir repoda bulundurmak.Ben repo olarakAzure Repos’u kullandım. Aşağıda benim hazırlamış olduğum playbook dosya yapısının structure ına bu linkten erişebilirsiniz.burada ilgili sunuculara beats agents kurulumları için gerekli yaml dosyaları bulunmaktadır. bu yapı halihazırda azure repos’da bulunmaktadır. bu yapının çalıştırılması için pipeline da neler yapılması gerektiğine bakalım.

Dockerized Ansible

İlk olarak Ansible uygulamasının bulunduğu bir container ayağa kaldırabilmek için playbookların bulunmuş olduğu repoda ilgili environmentler ve komutların bulunduğu bir Dockerfile’a eklenir. Dockerfile’a bu linkten erişebilirsiniz. Burada Ansible ile çalıştırılacak playbooklar için gerekli ansible komutları da olmalıdır.ansible-playbook -i inventory.ini ${ROLE_NAME} Buradaki $(ROLE_NAME) parametresi buildi çalıştırma anında set edilmektedir

Sonrasında Empty job diyerek bir sonraki adıma geçiyorum. Bu adımda ilgili Build’in hangi agent poolu kullanacağı seçilmelidir.

Agent poolda birden fazla build agent bulunabilir ve bu agentlar linux-windows işletim sistemlerinde olabilir.Ansible uygulamasını bir container üzerinde çalıştıracağımızdan bu build adımının linux işletim sistemine sahip bir agentta çalışmasını söylemek için Agent job özelinde Demand ekliyorum.

Ansible image build and push
Dockerfile’ı build etmesi ve oluşan image ı registry’e atması için Agent Job içerisine Docker taskı eklenir.Burada Docker Registry Service Coonection dan tanımlı olan servicelerden biri seçilir ve command olarak build — tag ansible . komutu yazılır.Bu task sonucunda Dockerfile ansible tag i ile taglenerek build edilecek ve oluşan image ı ilgili registry service e push edecektir.

Playbook çalıştırma
Build adımında oluşan image docker run edilerek playbookların çalışması sağlanır.Command olarak run — rm -e ROLE_NAME=$(ROLE_NAME) ansible verilmelidir. Bu komut ile ansible tag li image çalıştırılır. ROLE_NAME parametresi ise build sırasında set edilir.Bu task sonucunda ansible tagli image ile bir container ayağa kaldırılır. Set edilen ROLE_NAME parametresi ile Dockerfile da verilen command ile playbooklar çalıştırılmış olur. (CMD ansible-playbook -i inventory.ini ${ROLE_NAME})

Container Cleanup
Son olarak yapılan işlemler bittiğinde ilgili container ve image clean edilir.

İyi bir CI/CD pratiği uygulamak istiyorsanız kullanmış olduğunuz containerları temizlemelisiniz. Buradaki pipeline tasarımı güncel Dockerfile ile bir image dosyası create edip bunu kullanarak bir container ayağa kaldırır. İşlemlerini yapar ve ilgili container ile image dosyasını temizler.

Ansible Build Execute
Şimdi gelin bu build adımını çalıştıralım. Ama bir eksiğimiz var. Oda Playbook çalıştırma adımında run — rm -e ROLE_NAME=$(ROLE_NAME) ansible commandinde ROLE_NAME parametresni Variable kısmında tanımlamaya.

‘Settable at queue time’ seçeneğini seçersek bunu her build çalıştırma zamanında set etmemiz gerekir. Dilerseniz default bir değer de verebilirsiniz. Burada çalıştırmak istediğiniz role e ait yaml dosyasını vermelisiniz.Save&queue dediktikten sonra ROLE_NAME parametresini set ederek çalıştırmalısınız. Ben Beats rolüme ait yaml dosyamı set ediyorum. Yukarıdaki dosya structure ında yaml dosyasını görebilirsiniz

Ben Azure DevOps Pipeline’ın klasik editörünü kullanarak bu işlemlerimi gerçekleştirdim. Ancak dilerseniz aşağıdaki yaml’ı inceleyerek kendiniz yaml formatında da hazırlayabilirsiniz.

pool:
name: DevOpsPool
#Your build pipeline references the ‘ROLE_NAME’ variable, which you’ve selected to be settable at queue time. Create or edit the build pipeline for this YAML file, define the variable on the Variables tab, and then select the option to make it settable at queue time. See https://go.microsoft.com/fwlink/?linkid=865971steps:
- task: Docker@0
displayName: 'Build Ansible'
inputs:
containerregistrytype: 'Container Registry'
dockerRegistryConnection: HarborRegistry
action: 'Run a Docker command'
customCommand: 'build --tag ansible .'- task: Docker@0
displayName: 'Playbook Run'
inputs:
containerregistrytype: 'Container Registry'
dockerRegistryConnection: HarborRegistry
action: 'Run a Docker command'
customCommand: : 'run --rm -e ROLE_NAME=$(ROLE_NAME) ansible'- task: Docker@0
displayName: Clean
inputs:
containerregistrytype: 'Container Registry'
dockerRegistryConnection: HarborRegistry
action: 'Run a Docker command'
customCommand: : 'rmi -f ansible'

Örnek olması için birkaç role’ün ve dockerfile ın bulunduğu repoya aşağıdaki github linkinden erişebilirsiniz :)
https://github.com/KocSistem/AnsiblePlaybook
Bir sonraki yazımda görüşmek üzere :)

Faydalı linkler ..

Nasıl yardımcı olabiliriz?