Skip to content

AnsibleとJenkins連携

2018/7/18

AnsibleのPlaybookの実行について、Jenkinsで管理したいなと思って自宅環境を揃えてみた。その記録。

Playbookを書くとき、今までAnsibleサーバ上でVimで書いていたため、別の端末からGitで連携して書きたいと考えていた。

構想

  • Jenkins用のサーバを1台構築
  • JenkinsのサーバをGitサーバとしても構築
  • Jenkinsから自身のサーバにあるGitのリポジトリからコードを取得、Playbookの実行

GitHub等、外部のサービスにアップしたくないコードやファイルがあるので、インターネットに公開していない自宅環境内で完結する安心感。
なお、サーバはCentOS7を用いている。

1.Gitサーバを建てる

Gitサーバを建てる場合、特別に必要なパッケージはない。
まずはサーバ上でgitをインストール

# yum install git

続いて、gitユーザでgitリポジトリを管理するため、gitユーザを作成し、ユーザを切り替える。

# useradd git
# passwd git
# su - git

sshでgitの通信を行うため、gitユーザで鍵を作成

$ ssh-keygen -t rsa

デフォルトで以下に出力される
/home/git/.ssh/id_rsa

公開鍵のファイル名変更

$ cd /home/git/.ssh
$ mv  id_rsa.pub authorized_keys

Gitの接続のたびにパスフレーズを入れるのがめんどくさいため、秘密鍵のパスフレーズを外す

$ openssl rsa -in id_rsa -out id_rsa.git

id_rsa.gitというパスフレーズを外した鍵が生成される。
(ついでに、git用の鍵にしたかったので名前も変更した)

続いて、gitリポジトリの配置先を作る。
/home/git/ansible/home_infra とした。

$ cd /home/git
$ mkdir -p ansible/home_infra

例として、Jenkinsを構築するためのPlaybook用gitリポジトリを作成する。

$ cd /home/git/ansible/home_infra
$ mkdir jenkins.git
$ cd /home/git/ansible/home_infra/jenkins.git
$ git init --bare

bareというオプションにより空のgitリポジトリが生成される。

2.クライアントからgitサーバへ接続する

クライアントのgitのインストール方法はサーバと一緒なので省く。

クライアントからgitサーバまでssh接続を設定する。

サーバで生成した秘密鍵を以下の所定の場所に配置
/home/ユーザ名/.ssh/id_rsa.git

sshのconfigファイルを生成し、使う鍵を指定

$ cd /home/ユーザ名/.ssh
$ vim config

configの中身は以下のように記述する。

Host gitsv
  HostName 192.168.1.10 (gitサーバのIPアドレス)
  IdentityFile ~/.ssh/id_rsa.git
  User git

Hostについてはsshコマンドで指定する接続先となる。
上記の場合、"ssh gitsv" とコマンド入力することで上記の設定で接続できるようになる。
HostNameはIPアドレスでなくても、名前解決できればホスト名等でも良い。
IdentityFileは接続に使用する秘密鍵の指定。
Userは接続時に使用するユーザとなる。
"ssh gitsv" と入力し、パスフレーズ入力なしにサーバにgitユーザで接続できることを確認する。

プロジェクトフォルダにおいて、gitのコミットまでおこなう。

$ [プロジェクトフォルダ]
$ git init
$ git add . --all
$ git commit -m "first commit"

gitのリモート登録

$ git remote add origin ssh://git@gitsv/home/git/ansible/home_infra/jenkins.git

上記はsshを指定、gitユーザで接続、接続先はgitsv、gitサーバ上のGitリポジトリのパス、といった感じになっている。

早速pushしてみる。

$ git push origin master

これでGitサーバの構築が終わり。

3.Jenkinsサーバを建てる

こちらは構築コードを作成して構築を終わらせた。
構築コードはこちら

構築コード上でやっていることは以下。あまりやることはない。

  • Jenkinsのリポジトリ登録
  • gpg鍵を登録
  • javaのインストール(Jenkins動かすのに必要)
  • Jenkinsのインストール、実行
  • Firewallの設定

jenkinsのサービス起動後は以下のようなブラウザで接続し、画面の指示に従い、初期設定を完了させる。
http://[サーバのIPアドレス]:8080

ここで、Jenkinsユーザにsudo権限を与える。
というのも、Jenins上でJobを実行した場合、すべてJenkinsユーザで実行される。
AnsiblePlaybookの実行について、Jenkinsユーザだと権限上の問題で失敗する。
Ansibleユーザで実行したい場合、ジョブ上でAnsibleユーザに切り替えられたほうがよく、その場合sudo権限を与えると可能となる。

rootユーザにてvisudoで設定する

# visudo
↓以下を追記する
jenkins ALL=(ALL)       NOPASSWD: ALL

※sudo権限を与えるということはJenkinsからroot権限であれこれできるようになる、ということなので、結構危ないため、インターネットに公開しているようなサーバではこの設定はやめておいたほうが良いと思う。

なお、ansibleユーザでAnsiblePlaybookを実行するための環境づくりの説明は省く。

4.JenkinsでAnsiblePlaybookを実行するJobを作成

Jenkinsでジョブを作成していく。

初めに、Jenkinsの画面を開き、「新規ジョブ作成」をクリック。

ジョブ名を適当に入力し、「フリースタイル・プロジェクトのビルド」を選択してOK

説明を適当に入れて、「ソースコード管理」で「Git」を選択。

リポジトリURLに、作成したGitのリポジトリURLを入力する。

本記事に従うと、URLは以下になる。
ssh://git@gitsv/home/git/ansible/home_infra/jenkins.git

gitリポジトリにSSHで接続するため、秘密鍵を登録する必要がある。
認証情報の「追加」をクリック

種類を「SSHユーザ名と秘密鍵」とし、ユーザ名に「git」、秘密鍵を直接入力とし、gitユーザの秘密鍵の中身をまるごとコピー&ペーストする

きちんとリポジトリに接続できるようになると、エラーメッセージが消える。
(自宅環境の関係で少しURLが先ほどと変わっている)

続いて「ビルド」にて、「ビルド手順の追加」、「シェルの実行」をクリック

シェルスクリプトに以下を記入する。

sudo -u ansible ansible-playbook -i hosts site.yml

やっていることはsudoコマンドでansibleユーザに切り替えて、playbookを実行している。
playbookの実行コマンドは環境によって変わってくると思うので、自分の環境に合ったコマンドを入力する。
ちなみに、JenkisnがワークディレクトリにGitリポジトリからコードを持ってきて、そこで実行するので、このシェルスクリプト上で絶対パス等で書かないほうがいい。

これらでジョブの設定は完了となる。

続いて、ジョブの実行。
作成したジョブを開き、「ビルド実行」をクリック。
するとビルド履歴に実行したジョブの情報が出力される。(今回は#7)

「#7」をクリックする。

ここで「コンソール出力」をクリックすると、結果を確認できる。

コンソール出力内容がそのまま出る。

こんな感じでジョブを作ることができる。
作ったジョブは何かしら自動実行するようにしてみたりもできる。
結構効率的になるため、この辺の連携はおすすめ。