Bir önceki yazımızda “X as Code” konusuna ve Ansible‘a değinmiştik ve basit bir Ansible role’ü yazacağımızdan bahsetmiştik. Ayrıca X as Code disiplinin tekrar eden işleri otomatize etmek için kullanıldığını ve insan hatasını en aza indirgediğini öğrendik. Örnek olarak bu yazımızda Ansible ile sürekli yaptığımız bir işi nasıl otomatize edeceğimizi inceleyeceğiz. Bu örneği Ubuntu 18.04 sunucusu üzerinde gerçekleştireceğiz, fakat çalıştırılacak master sistemde Ansible yüklü olmak şartıyla; yazdığımız role Ansible kurulu herhangi bir Unix cihazda çalıştırabilir. Öncelikle Ansible kurulum ve dokümantasyonu için bağlantıya tıklayın.

Eğer bir sistem mühendisi ya da DevOps mühendisi iseniz bir çok kez Jenkins kullanmak ya da kurmak durumunda kalmışsınızdır. Jenkins kurulumu yapmak için (sadece Linux sistemler için) temel olarak, her zaman yaptığımız üç aşama bulunuyor:

1. Sunucuya ait local repoları güncellemek ve Jenkins repolarını eklemek
2. Jenkins için bağımlılıkları yüklemek. (Bu örnekte default-jre kullanacağız.)
3. Jenkins kurulumu

Bu işleri sürekli manuel yapmak hem hata olasılığını artırıyor hem de bizler için komutun çalışmasını beklemek gibi, zaman kaybı yaratıyor. Ansible ile işleri otomatize etmek ise çok basit. Öncelikle Ansible kurulu Ubuntu makinemizde aşağıdaki komutu kullanarak jenkins-installation isimli bir role yaratalım:


$ ansible-galaxy init jenkins-install

Bu komut bizlere Ansible için boş role template’i yaratır. Yaratılan klasörün içeriğine bakacak olursak;


$ tree jenkins-bla-bla
jenkins-bla-bla
├── README.md
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

8 directories, 8 files

Ansible role’unde olması gereken her şeyin template halinde geldiğini görürüz. Jenkins’e dönecek olursak, işlerimizi otomatize edeceğimiz tasks/main.yml dosyasına bir takım görevler yazmamız gerekiyor. Eğer bir sistemci olarak bu işin tam anlamıyla otomatize olmasını istiyorsak, yazacağımız Jenkins rolünü hem Debian sistemler hem de Red-hat sistemler için yazmamız gerekiyor. Yazcağımız role’ü modüler şekilde yazmak istiyorsak, işletim sistemi ailesine özel roller ekleyip Ansible özelliklerini kullanarak bu rolleri main.yml içerinde çağırmamız gerekiyor, main.yml dosyasına aşağıdakileri ekleyelim:


---
# tasks file for jenkins-install

- name: Include Debian based tasks
include_tasks: setup-Debian.yml
when: ansible_os_family == "Debian"

- name: Include Red-Hat based tasks
include_tasks: setup-Redhat.yml
when: ansible_os_family == "RedHat"

Şimdi task klasörünün içerisinde **setup-Debian.yml** ve **setup-Redhat.yml** isimli iki tane dosya oluşturacağız. setup-Debian.yml dosyasının içerisine Debian sistemler için Jenkins kurulumu Ansible modüllerini kullanarak gerçekleştireceğiz, öncelikle ilk adım repo güncellemek:


- name: Update apt cache.
  apt: update_cache=true cache_valid_time=600

Apt modülünü kullanarak local repoları güncelledik. Apt modülü debian sistemlere paket kurmak, güncellemek veya kaldırmak için kullanılıyor; daha fazlası için bağlantıyı inceleyebilirsiniz. Şimdi yine apt modülünü kullanarak çeşitli bağımlılıkları ve sistemimizde olması gereken yazılımları ve default-jre’yi kuruyoruz, bu sefer paket isimlerini ve **state** parametresini kullanacağız, aşağıdakileri yaml dosyamızın içerisine yazıyoruz:


- name: Ensure depencidencies
apt:
name:
- curl
- apt-transport-https
- gnupg
- default-jre
state: present

Şimdi Jenkins için gerekli repoları sistemimize ekliyoruz, bunun için **apt-key** ve **apt-repository** modüllerini kullanacağız;


- name: Add Jenkins apt repository key.
apt_key:
url: "{{ deb_jenkins_repo_key_url }}"
state: present

- name: Add Jenkins apt repository.
apt_repository:
repo: "{{ deb_jenkins_repo_url }}"
state: present
update_cache: true

Burada süslü parantez içerisinde kullandığımız ifadeler Ansible değişkenleri. Ansible rollerimizi modüler hale getirmek için ve güncellenmesi kolay olması için değişkenleri kullanıyoruz. Süslü parantez içerisine yazdığımız ifadelerin değerlerini defaults/main.yml içerisinde yazacağız:


---
# defaults file for jenkins
deb_jenkins_repo_key_url: https://pkg.jenkins.io/debian/jenkins.io.key
deb_jenkins_repo_url: deb https://pkg.jenkins.io/debian binary/

redhat_jenkins_repo_key_url: https://pkg.jenkins.io/redhat-stable/jenkins.io.key
redhat_jenkins_repo_url: https://pkg.jenkins.io/redhat-stable/jenkins.repo

Burada hem debians hem de redhat sistemler için repolarımızı yazdık. İleride repoları değiştirmek için task klasöründe işlem yapmaktansa buradan yapmak hem daha kolay olacak hem de bu işlem rolümüzü modüler hale getirecek. Jenkins güncel repolarına ulaşmak için tıklayın.

Repolarımızı da eklediğimize göre Jenkins kurma işlemine geçebiliriz, aşağıdaki satırları yaml dosyamızın içerisine ekliyoruz:


- name: Ensure Jenkins is installed.
apt:
name: jenkins
state: latest

- name: Check local connecition for Jenkins.
uri:
url: http://localhost:8080
ignore_errors: yes

- name: Wait 3 seconds for created password file.
wait_for:
timeout: 3

- name: Save admin password
shell: cat /var/lib/jenkins/secrets/initialAdminPassword
register: admin_pass

- name: Show admin pass
debug:
msg: "{{ admin_pass.stdout }}"

Yukarıdaki taskleri açıklayacak olursak;

1. İlk taskte Jenkins’i **apt** modülü ile sistemimize kuruyoruz.
2. Burada **uri** modülünü kullanarak bir istek atıyoruz Jenkins’e. Bu işlem admin parolasının oluşması için gerekli. **ignore_errors** parametresi ise hata alsa bile role devam etmesini söylüyor. uri modülü için ve ignore_erros için tıklayın.

3. Burada parola dosyasının oluşmasını bekliyoruz. wait_for modülü için tıklayınız.

4. Burada shell modülü ile parola dosyasını ekrana yazdırıyoruz. Ansible ile bunu göremeyeceğimiz için register ile kaydediyoruz.
5. debug modulu ile kaydettiğimiz parolayı ekrana yazdırıyoruz. debug modulu için tıklayınız.

setup-Debian.yml dosyamızın son hali böyle olmalı:


---
# tasks file for jenkins

- name: Update apt cache.
apt: update_cache=true cache_valid_time=600

- name: Ensure depencidencies
apt:
name:
- curl
- apt-transport-https
- gnupg
- default-jre
state: present

- name: Add Jenkins apt repository key.
apt_key:
url: "{{ deb_jenkins_repo_key_url }}"
state: present

- name: Add Jenkins apt repository.
apt_repository:
repo: "{{ deb_jenkins_repo_url }}"
state: present
update_cache: true

- name: Install Jenkins.
apt:
name: jenkins
state: latest

- name: Check local connecition for Jenkins.
uri:
url: http://localhost:8080
ignore_errors: yes

- name: Wait 3 seconds for created password file.
wait_for:
timeout: 3

- name: Save admin password
shell: cat /var/lib/jenkins/secrets/initialAdminPassword
register: admin_pass

- name: Show admin pass
debug:
msg: "{{ admin_pass.stdout }}"

Yazdığımız role’u /etc/ansible/roles/ klasörünün içerisine atarak çalıştırabiliriz. Ya da istediğimiz dizinde bir playbook oluşturarak çalıştırabiliriz. setup-Redhat kısmı ve role’un geri kalanına Continium Github hesabından ulaşabilirsiniz.

 

Emre Aydınsoy

DevOps Mühendisi