dockerコンテナでjenkinsを立ち上げ、 pythonのデプロイツール「fabric」をjenkinsから実行してwebサーバに対してデプロイ、DBに対してSQL実行などを出来るようにする。 これによりデプロイだけでなく、業務の自動化なども可能!ジョブの作り方で色々と応用がきく内容となっております。
今回の記事に関する情報やソースコードなどは、GitHubで公開しておりますので、そちらも参照下さい。 https://github.com/hirasaki1985/jenkins_fabric
また、本手順に出てくる.ssh/ディレクトリのsshに関する設定(鍵やconfigファイル)は、環境に合わせて修正をしてください。
本手順で使用するライブラリ
- docker
- openssh .ssh/の設定(鍵やconfigファイル)
インストール & 環境構築
プロジェクトのダウンロード
$ git clone https://github.com/hirasaki1985/jenkins_fabric.git
$ cd jenkins_fabric
鍵の作成 or 鍵の設置
新しく作成する場合は以下のコマンドを実行。 すでにあるものを使用する場合は、.sshディレクトリに設置して下さい。
$ ssh-keygen -t rsa -b 4096 -f ./.ssh/id_rsa
configファイルの作成
こちらも、すでにある場合はそれを.sshディレクトリに設置して下さい。 ない場合は新規作成。
$ vi ./.ssh/config
configファイルのサンプルです。
ServerAliveInterval 60
Host webserver01
HostName 192.168.0.100
User deployuser
Port 22
IdentityFile ~/.ssh/id_rsa
Host webserver02
HostName 192.168.0.101
User deployuser
Port 22
IdentityFile ~/.ssh/id_rsa
Host database01
HostName 192.168.0.102
User dbuser
Port 22
IdentityFile ~/.ssh/id_rsa
ボリュームコンテナの作成
コンテナ永続化のため、ボリュームコンテナを作成。
$ docker volume create --name deployserver-volume
$ docker volume ls
dockerイメージのビルド
.sshディレクトリの設定が終わったらビルドを開始。
$ docker build . -t deployserver
Dockerfileに書かれておりますが、 ビルドをすると、.sshディレクトリがjenkinsユーザのホームディレクトリにコピーされ、 パーミッションの設定を行います。 .sshディレクトリを-vで共有にするとパーミッションや権限が上手くいかなったので、コピーをすることにしました。
Dockerfileのここの部分。
## ssh setting
USER jenkins
WORKDIR /var/jenkins_home
RUN mkdir .ssh/
COPY .ssh/ .ssh/
USER root
WORKDIR /var/jenkins_home
RUN chmod 700 .ssh
RUN find .ssh/ -type f -exec chmod 400 {} \;
RUN find .ssh/ -type d -exec chmod 700 {} \;
RUN chown -R jenkins:jenkins .ssh
まだコンテナを立ち上げていませんが、 これでconfigファイルに書かれたサーバに対し、鍵を使ってjenkinsユーザでアクセスできるようになります。
## コンテナ内からssh接続できる。
$ ssh webserver01
## パスワードを聞かれる場合は、ssh-copy-idでサーバに鍵を登録する。
$ ssh-copy-id -i ~/.ssh/id_rsa.pub webserver01
コンテナの作成
ビルドが完了したらコンテナを立ち上げます。
$ docker run -t -i -d \
-v `pwd`/src:/tools \
-v deployserver-volume:/var/jenkins_home \
-p 8080:8080 -p 50000:50000 \
-e MYSQL_PASSWORD=password -e MYSQL_USER=user_name -e MYSQL_DB_NAME=db_name \
-h deployserver --name deployserver deployserver
srcディレクトリと、コンテナ内の/toolsディレクトリを共有するとで、ホストでソースコードの修正が可能。
-eの環境変数の登録の部分でmysqlの設定を行ってます。 この設定を使ってDBに対してSQLを実行します。(fabfile.pyやjenkinsジョブの書き方で修正可能)
立ち上げたら、確認をしましょう。
$ docker ps -a
jenkinsの初期設定
初回はjenkinsの初期化や設定が必要。
$ docker exec -it deployserver bash
(deployserver)$ cat /var/jenkins_home/secrets/initialAdminPassword
access jenkins & setup
http://localhost:8080 ブラウザからコンテナにアクセスし、「jenkinsの初期設定」で出力されたinitialAdminPasswordを入力し、セットアップを続ける。 ユーザ登録画面も表示されるはずなので、登録を行う。
ジョブの作成
「シェルの実行」の欄にそれぞれ以下のように入力します。
デプロイをする場合
$ fab -f /tools/fabfile.py -H webserver01,webserver02 webserver_deploy
.ssh/configに設定されたwebserver01,02に対し、fabfile.pyのwebserver_deploy()関数が実行されます。
SQLを実行する場合
$ fab -f /tools/fabfile.py -H database01 exec_sql_sample
.ssh/configに設定されたdatabase01に対し、fabfile.pyのexec_sql_sample()関数が実行され、 mysql_exec()によりSQLが実行されます。
あとはジョブを実行するだけ。
jenkinsの使い方は、こちらが参考になると思います。 [改訂第3版]Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)
手動でfabricを動かす場合
$ docker exec -it deployserver bash
(deployserver)$ fab -f /tools/fabfile.py -H webserver01,webserver02 webserver_deploy
(deployserver)$ fab -f /tools/fabfile.py -H database01 exec_sql_sample
その他使いそうなコマンド
### root権限でコンテナに入る場合
$ docker exec -it -u root deployserver bash
### コンテナとイメージを削除
$ docker rm -f deployserver && docker rmi deployserver
### exitedで終了しているコンテナを一括削除
$ docker rm $(docker ps -a --filter 'status=exited' -q)
参考
以下のサイトの情報を参考にさせていただきました、ありがとうございます。
fabric
- Fabric 概要とチュートリアル
- Python+SSHな自動化・デプロイメントツールFabricを活用するTips
- 踏み台サーバーを超えてfabricを実行する
- fabricの導入方法と基本的な使い方
- Cygwin で Fabric (1)
- INSTALLING PYTHON FABRIC ON CYGWIN
- fabricでmysqlコマンドを実行する関数を自作する
- Python製デプロイツール Fabricを初めて使う際に役立つTips
jenkins
Debian 8にjenkinsをapt-getでインストール