Ansible galaxyを使って銀河の彼方からJenkinsおじさんを召喚する

こんにちは。マネーフォワードエンジニアの鈴木です。

最近ではCIもすっかり定着し、みなさんの職場にもJenkinsサーバないし何かしらのCIが稼動していることかと思います。

YumAPTなどのパッケージ管理ツールでインストールすることも多いかと思われますが、最近では様々な仮想化ソフトウェアの台頭もあって、Ansibleのようなプロビジョニングツールがよく使われるようになりました。
セットアップ手順をコード化することには以下のようなメリットがあります。

  • 手順を明確にしオープンにすることで、属人性をなくせる
  • 仮想環境への構築が容易になるので、serverspecなどでテストしやすくなる
  • 管理コストを削減できる

Ansibleには、Ansible galaxyというrole(ノードの役割設定)を共有できるhubサービスがあり、世界中のユーザが作成したroleを利用することができます。

今回はAnsible galaxyを使ってJenkinsをセットアップする手順をご紹介します。

 

前準備

構築するためのテスト環境として、仮想マシンを用意しましょう。VirtualBoxがおすすめです。

Vagrantで適当なOSを立ち上げます。運用環境で使うものと同じOSが良いでしょう。今回はCentOSにします。

vagrantbox.esにOSのリストがあります。

mkdir jenkins_test
cd !$
vagrant box add centos6.5 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
vagrant init

Vagrantfileは以下のようにします。config.vm.defineを追加してください。

もともと複数台セットアップするための仕組みのようですが、名前を付けておかないとserverspec-initのジェネレータがdefaultという名前でホストを認識し、困ったことになるのでこうしています。

Vagrantfile

Vagrant.configure(2) do |config|
  config.vm.box = 'centos6.5'
  config.vm.box_url = 'https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box'

  config.vm.define 'jenkins' do |jenkins|
    jenkins.vm.network 'forwarded_port', guest: 8080, host: 8080
    jenkins.vm.network 'private_network', ip: '192.168.33.10'
  end

  config.vm.provider 'virtualbox' do |vb|
    vb.memory = '1024'
  end
end

vagrant up jenkinsとすると起動します。
 

Serverspecを書く

いきなりJenkinsをインストールしても良いですが、せっかくなのでテストファーストでやってみましょう。

serverspecがインストールされていない場合は、こんなGemfileを書いてbundle installします。

Gemfile

source 'https://rubygems.org'

gem 'rake'
gem 'serverspec'

serverspec-initを実行し、以下のようにします。

serverspec-init

spec/jenkins/sample_spec.rbが生成されるので、これをspec/jenkins/jenkins_spec.rbにリネームし、以下のようにspecを書きます。

spec/jenkins/jenkins_spec.rb

require 'spec_helper'

describe package('jenkins') do
  it { should be_installed }
end

describe service('jenkins') do
  it { should be_enabled }
  it { should be_running }
end

describe port(8080) do
  it { should be_listening }
end

bundle exec rakeを実行し、テストが失敗することを確認します。
 

Ansible galaxyでJenkinsを探してインストールする

ここでAnsible galaxyの登場です。

galaxy.ansible.comでJenkinsを探します。

Jenkinsで検索するとたくさん出てきますが、CentOSをサポートしていてメンテナンスされているように見えるgeerlingguy.jenkinsにしてみます。

Githubへのリンクも貼られていますので、必ず実装を確認しましょう。

gemに近いイメージで、メタファイルに記述された依存情報を元に自動的に解決してくれます。
インストールするrole名は、直接コマンドラインに指定することもできますし、列挙したファイルを指定するインターフェースも用意されています。
今回は依存関係を明示する意味でもファイルに書くことにします。

echo "geerlingguy.jenkins" >> requirements
ansible-galaxy install -r requirements

これでインストール完了です。(手元の環境では/usr/local/etc/ansible/にインストールされました)

このroleを利用して、inventoryとplaybookファイルを書きます。

inventoryはplaybookで使用する論理的なグループを定義します。

test-servers

[jenkins]
192.168.33.10

[jenkins:vars]
ansible_ssh_user=vagrant
ansible_ssh_private_key_file=.vagrant/machines/jenkins/virtualbox/private_key
ansible_sudo=true

playbookは論理的なサーバの役割や、セットアップ時に渡す変数などが記述できます。

site.yml

- hosts: jenkins
  roles:
    - jenkins

実行します。

ansible-playbook -i test-servers site.yml

 

Serverspecで確認する

無事起動していることを確認したら、serverspecでも確認しておきましょう。

bundle exec rake

serverspec
 

Jenkinsをカスタマイズする

これでJenkinsの起動までは確認できました。

必要に応じて、Jenkins pluginを増やしたりjobを追加したりしましょう。

pluginについてはhost_varsを利用して追加インストールできますが、jobの管理は今回インストールしたroleには実装されていません。

Ansible galaxyにあるコードや公式ドキュメントを参考に、ぜひカスタマイズしてみてください。
 

最後に

マネーフォワードでは何でもコードで自動化したいエンジニアを募集しています。
みなさまのご応募お待ちしております!

マネーフォワード採用サイト
https://recruit.moneyforward.com/

Wantedly
https://www.wantedly.com/companies/moneyforward

Pocket