Help us understand the problem. What is going on with this article?

Jenkinsでコンテナ間接続とジョブ実行

More than 1 year has passed since last update.

■初めに

 前回の記事からの続編です。前回はDockerホストとしてAzureVMにDockerを搭載しJenkinsとAnsibleのコンテナを作成しています。今回はJenkinsの設定を行いビルド環境を設定します。ビルドする内容はAnsibleコンテナからAnsibleを実行するという形になります。

■予定

 V1 : Dockerインストール,Dockerfile(Jenkins)作成からイメージ起動,コンテナへの直接SSH
 URL : Jenkinsでコンテナ間接続とジョブ実行
 V2  : Ansibleイメージ起動,コンテナ間のSSH設定,Ansibleの稼働確認
 URL : DockerコンテナでAnsible実行

 V3  : Jenkins設定(JenkinsでのSSH接続)、リモートホストへのジョブ実行
 

 V4  : AnsiblePlaybook(AZVMと関連リソースの作成)、稼働確認(Jenkinsからの実行)
 URL : Ansibleでクラウド構築(Azure)

■イメージ
DOC03.png

■環境
【Docker ホスト】
  AzureVM : CentOS
  hostname : VMDO01
  ポート  : ssh,7033,8033

【Container 1(jenkinsコンテナ)】
  Container役割 : jenkins
  ※前記事(V1)で作成したコンテナです。

【Container 2(Ansibleコンテナ)】
  Container役割 : Ansible
  ※前記事(V2)で作成したコンテナです。

■注意
・Azureのアカウントを持っている事
・マシンがAzureへログイン可能であること

■やること
 【1】Docker コンテナ起動
 【2】Jenkins初期設定
 【3】Jenkins(SSHplugin)追加・設定
 【4】Jenkinsビルド実行(Ansible)


■手順

【1】Docker コンテナ起動

 (1).Dockerホストにログインし[Jenkinsコンテナ]と[Ansibleコンテナ]を起動する

コマンド(root)(Dockerhost(vmdo01)から)
docker run -p <hostport(8033):8080> -p <hostport(7033):22> -itd --privileged <REPOSITORY(Jenkinsコンテナ):TAG> /sbin/init

docker run -p <hostport(9033):22> -itd --privileged <REPOSITORY(Ansibleコンテナ):TAG> /sbin/init
Result
[root@VMDO001 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@VMDO001 ~]# docker run -p 8033:8080 -p 7033:22 -itd --privileged centos/jenkinsbuild:latest /sbin/init
efadf1d923a41d08ff413bbb06d71818e5d201a3b648a2108f2191cbc8e5e006
[root@VMDO001 ~]# docker ps -a
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS              PORTS                                          NAMES
efadf1d923a4        centos/jenkinsbuild:latest   "/sbin/init"        38 seconds ago      Up 36 seconds       0.0.0.0:7033->22/tcp, 0.0.0.0:8033->8080/tcp   cocky_keller
[root@VMDO001 ~]# docker run -p 9033:22 -itd --privileged centos/ansiblebuild:1 /sbin/init
1650f986860ebb59f505055af5f2c52719e81530d056f70e827f0f275a335208
[root@VMDO001 ~]# docker ps -a
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS              PORTS                                          NAMES
1650f986860e        centos/ansiblebuild:1        "/sbin/init"        7 seconds ago       Up 5 seconds        0.0.0.0:9033->22/tcp                           thirsty_kare
efadf1d923a4        centos/jenkinsbuild:latest   "/sbin/init"        3 minutes ago       Up 3 minutes        0.0.0.0:7033->22/tcp, 0.0.0.0:8033->8080/tcp   cocky_keller
[root@VMDO001 ~]#

 (2).[SSHクライアント]から[Jenkinsコンテナ]と[Ansibleコンテナ]にログイン

DOC04.png

【2】Jenkins初期設定

 (1).ブラウザから以下のURLにアクセス
http://(host ip):8033

DOC05.png

 (2).[Jenkinsコンテナ]のプロンプトよりロックを解除する

コマンド(root)
cat /var/lib/jenkins/secrets/initialAdminPassword
Result
[root@efadf1d923a4 ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
1a1d6be0bdab4a7e9c8f7ceec2a0e7ba # ←内容をコピー
[root@efadf1d923a4 ~]#

 (3).ブラウザ上の[Administrator password]にコピーした内容を貼り付けて[Continue]

DOC06.png

 (4).[Install suggested plugin]をクリック

DOC07.png

以下は静観

DOC08.png

 (5).adminuserを作成し、[Save and Finish]を押下
ユーザ名:jenkinsadmin
パスワード:p@ssw0rd
フルネーム:jenkinsadmin
メールアドレス:jenkinsadmin@example

DOC09.png

 (6).[Start using Jenkins]を押下

DOC10.png

初期設定終了

DOC11.png

【3】Jenkins(SSHplugin)追加・設定

 Ansibleコンテナに接続しビルドを実行するためJenkinsユーザ(jenkinsadmin)が接続できるようにプラグインを追加します。本手順は手順【2】の続きとして行います

【3-1】SSHプラグイン追加
 Jenkinsをリモート接続可能にするために[SSH]のプラグインを追加します

 (1).ログイン後[Jenkinsの管理]を選択
 (2).[plugin管理]を選択
 (3).[利用可能]タブを選択
 (4).フィルターに[ssh]を入力しEnter
 (5).[SSH ]にチェックを入れ[ダウンロードして再起動後にインストール]を選択
DOC12.png

 (6).[インストール完了後、ジョブがなければJenkinsを再起動する]にチェックを入れる

DOC13.png

 (7).再起動終了後、Jenkinsユーザでログインする

【3-2】SSHユーザ設定
Jenkinsからリモートホストに接続させるためのユーザを作成します。

 (1).[認証情報]を選択
 (2).[System]を選択
 (3).グローバルドメインを選択
 (4).[この認証ドメインは未設定です。認証情報を追加してください。]のリンクをクリック

DOC14.png

 (5).以下、設定を行いJenkinsユーザの作成を行い[保存]を押下

設定項目 意味 本記事での設定値
種類 ユーザ名とパスワード デフォルト
スコープ グローバル デフォルト
ユーザ名 Jenkinsユーザと関連付けるユーザ root
パスワード ユーザのパスワード p@ssw0rd
ID Jenkinsユーザの名前 jenkins01
説明 なし なし

DOC15.png

 (6).Jenkinsのトップページに戻る

【3-3】JenkinsSSH設定
 JenkinsにSSHの設定を行います。この手順で【3-2】で作成したユーザでリモートホストへログインできるようになります

 (1).[jenkinsの管理]をクリック
 (2).[システムの設定]をクリック
 (3).[sshリモートホスト/sshサイト]の[追加]を押下
 (4).以下の設定を行い[Check connection]を押下
     ホスト名 : SSHで接続するサーバ(Ansibleコンテナ)のIP
     ポート : SSHポート(22)
     Credentials : 【3-2】で作成したユーザ(root)

DOC16.png

 (5).[Check connection]の結果が[SuccessfullConnection]であることを確認し[追加]を押下

DOC17.png

 (6).[保存]を押下

【4】Jenkinsビルド実行(Ansible)

 前手順まででJenkinsからのSSH接続設定は終わりましたので次は実際にJenkins上でジョブを作成しAnsibleを実行します。今回実行するのはプレイブックではなくAnsibleになります。
 前回はAnsibleコンテナよりAnsibleを実行させましたが今回はJenkinsコンテナから作成したSSHユーザをもってAnsibleコンテナに接続し、実行させます。またAnsible実行時にユーザ入力を避ける為、Ansibleのインベントリファイルに実行ユーザの情報を入力し実行させます
 なお、インベントリファイルは前回の記事で作成した[/playbook/hosts]を使用します

【4-1】Ansible実行ユーザ情報
 前回はインベントリファイルにはホスト情報のみの記載だったのでコマンド実行しユーザを指定しパスワード認証を手動で行っていましたが、SSHのユーザとパスワードをインベントリファイルに記載することでユーザ入力によるプロンプトの中断を回避します。

 (1).Ansibleコンテナにログイン
 (2).インベントリファイルに実行ユーザの情報を記載する

コマンド
vi /playbook/hosts
/playbook/hosts内容
# 前記事にて入力
# 実行ホストを[]で区切られたグループに分ける
[con]
172.17.0.2
[hostmachine]
10.10.1.4

# 以下今回の記事で追記して保存
# [con:vars] ⇒ [変数を有効にさせるグループ:vars(固定)]
# ansible_ssh_user ⇒ ansible実行ユーザ
# ansible_ssh_pass ⇒ 実行ユーザのパスワード
# ansible_connection ⇒ 接続指定
[con:vars]
ansible_ssh_user=root
ansible_ssh_pass=p@ssw0rd
ansible_connection=ssh

 (3).[Ansibleコンテナ]を[exit]で抜ける

【4-2】JenkinsからAnsibleの実行
 Jenkinsのジョブを作りAnsibleコンテナに対して実行命令を出します。その際に【3-2】で作成したSSHユーザが必要になります。

 (1).Jenkinsのトップページから[新規ジョブ作成]をクリック
 (2).[Enter an Item name]に[任意のジョブ名(AnsibleJOB1)]を入力し[フリースタイル・プロジェクトのビルド]を押下

DOC18.png

 (3).[ビルド]、[ビルド手順の追加]より[リモートホストでシェルを実行]を選択する

DOC19.png

 (4).SSHサイトとシェルスクリプトにそれぞれ設定を行い保存する
     SSHサイト:手順【3-2】で作成したSSHサイト
     シェルスクリプト : Ansibleコンテナで実行させるコマンド

シェルスクリプト
#実行ユーザ確認
whoami
#Ansible実行
ansible con -i /playbook/hosts -m ping

DOC20.png

 (5).次画面にて[ビルドの実行]をクリック

DOC21.png

 (6).[実行したビルド]をクリックする

DOC22.png

 (8).[コンソール出力]をクリックして実行内容を確認し終了

DOC23.png


■まとめ

 現時点でJenkinsとAnsibleの連携はできている事かと思います。所感としてはSSHのプラグインを追加しないとJenkinsでリモートホストに対して実行できないってことが発見でした。
 次は[Ansibleコンテナ]にAzureリソースを作成するプレイブックを作成し[Jenkins]から実行させます

yo_dazy
・・・よろしくお願いします。主に機能概要よりも作業内容を中心に乗っけていこうかなって思ってます。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away