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」をクリックする。
ここで「コンソール出力」をクリックすると、結果を確認できる。
コンソール出力内容がそのまま出る。
こんな感じでジョブを作ることができる。
作ったジョブは何かしら自動実行するようにしてみたりもできる。
結構効率的になるため、この辺の連携はおすすめ。