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

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

■予定

　V1　：　Dockerインストール,Dockerfile（Jenkins）作成からイメージ起動,コンテナへの直接SSH
　URL　：　[Jenkinsでコンテナ間接続とジョブ実行](https://qiita.com/yo_dazy/private/34f9f5986155d2044b45)
　V2 　：　Ansibleイメージ起動,コンテナ間のSSH設定,Ansibleの稼働確認
　URL　：　[DockerコンテナでAnsible実行](https://qiita.com/yo_dazy/private/b5ed1fa1bb816b1de560)
  <Font Color="Red">
　V3 　：　Jenkins設定（JenkinsでのSSH接続）、リモートホストへのジョブ実行
　</font>
　V4 　：　AnsiblePlaybook（AZVMと関連リソースの作成）、稼働確認(Jenkinsからの実行)
　URL　：　[Ansibleでクラウド構築(Azure)](https://qiita.com/yo_dazy/private/2cd34b7a07b114b77fcb)

■イメージ
![DOC03.png](https://qiita-image-store.s3.amazonaws.com/0/150678/cea941a3-94c2-8fe4-0b7b-b49b85f6d4d8.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 コンテナ起動
　（１）．Dockerホストにログインし[Jenkinsコンテナ]と[Ansibleコンテナ]を起動する

```ruby:コマンド(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
```

```ruby: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 ~]#
```

　（２）．[SSHクライアント]から[Jenkinsコンテナ]と[Ansibleコンテナ]にログイン

![DOC04.png](https://qiita-image-store.s3.amazonaws.com/0/150678/d1d96248-494e-6a73-896e-3362640e7b74.png)

####【2】Jenkins初期設定
　（１）．ブラウザから以下のURLにアクセス
http://(host ip):8033

![DOC05.png](https://qiita-image-store.s3.amazonaws.com/0/150678/3f2bbdce-0d6f-72ed-2f7a-c959be4d2dc7.png)

　（２）．[Jenkinsコンテナ]のプロンプトよりロックを解除する

```Ruby:コマンド(root)
cat /var/lib/jenkins/secrets/initialAdminPassword
```

```Ruby:Result
[root@efadf1d923a4 ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
1a1d6be0bdab4a7e9c8f7ceec2a0e7ba　# ←内容をコピー
[root@efadf1d923a4 ~]#
```

　（３）．ブラウザ上の[Administrator password]にコピーした内容を貼り付けて[Continue]

![DOC06.png](https://qiita-image-store.s3.amazonaws.com/0/150678/c7272e74-f448-219a-986a-a21751f8a9da.png)

　（４）．[Install suggested plugin]をクリック

![DOC07.png](https://qiita-image-store.s3.amazonaws.com/0/150678/ada64d5f-9d86-b8be-d70c-5e1cfe0547be.png)

以下は静観

![DOC08.png](https://qiita-image-store.s3.amazonaws.com/0/150678/ff1348ed-e3e8-3bc0-db32-32c0ef0daf2d.png)

　（５）．adminuserを作成し、[Save and Finish]を押下
ユーザ名：jenkinsadmin
パスワード：p@ssw0rd
フルネーム：jenkinsadmin
メールアドレス：jenkinsadmin@example

![DOC09.png](https://qiita-image-store.s3.amazonaws.com/0/150678/18fbba03-9634-786f-4b6d-0d48449a9e2e.png)

　（６）．[Start using Jenkins]を押下

![DOC10.png](https://qiita-image-store.s3.amazonaws.com/0/150678/1b6512fb-be66-2fb5-08d0-707a1c4a8077.png)

初期設定終了

![DOC11.png](https://qiita-image-store.s3.amazonaws.com/0/150678/61b64157-a5a7-3354-4b26-9d50e4fd8524.png)

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

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

　（１）．ログイン後[Jenkinsの管理]を選択
　（２）．[plugin管理]を選択
　（３）．[利用可能]タブを選択
　（４）．フィルターに[ssh]を入力しEnter
　（５）．[SSH ]にチェックを入れ[ダウンロードして再起動後にインストール]を選択
![DOC1２.png](https://qiita-image-store.s3.amazonaws.com/0/150678/0f8fc270-1c5b-14ba-3744-01c9ad3316db.png)

　（６）．[インストール完了後､ジョブがなければJenkinsを再起動する]にチェックを入れる

![DOC13.png](https://qiita-image-store.s3.amazonaws.com/0/150678/9431f805-674d-125c-81d7-5790a6ab9e57.png)

　（７）．再起動終了後、Jenkinsユーザでログインする

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

　（１）．[認証情報]を選択
　（２）．[System]を選択
　（３）．グローバルドメインを選択
　（４）．[この認証ドメインは未設定です。認証情報を追加してください。]のリンクをクリック

![DOC14.png](https://qiita-image-store.s3.amazonaws.com/0/150678/15d9a859-2e5c-e226-a6f1-3913c7d659c8.png)

　（５）．以下、設定を行いJenkinsユーザの作成を行い[保存]を押下

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



![DOC15.png](https://qiita-image-store.s3.amazonaws.com/0/150678/d3842a1a-6448-37db-7c1b-a890f0e4ffc2.png)

　（６）．Jenkinsのトップページに戻る

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

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

![DOC16.png](https://qiita-image-store.s3.amazonaws.com/0/150678/3ceeb22e-f0ce-4107-ab41-13dfb2a4e130.png)

　（５）．[Check connection]の結果が[SuccessfullConnection]であることを確認し[追加]を押下

![DOC17.png](https://qiita-image-store.s3.amazonaws.com/0/150678/3949e334-adb8-7bc1-6e14-5536685a23c5.png)

　（６）．[保存]を押下


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


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


　（１）．Ansibleコンテナにログイン
　（２）．インベントリファイルに実行ユーザの情報を記載する

```Ruby:コマンド
vi /playbook/hosts
```

```Ruby:/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
```

　（３）．[Ansibleコンテナ]を[exit]で抜ける

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

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

![DOC18.png](https://qiita-image-store.s3.amazonaws.com/0/150678/f64cf6a9-fce9-4584-5f3c-561dd0473328.png)

　（３）．[ビルド]､[ビルド手順の追加]より[リモートホストでシェルを実行]を選択する

![DOC19.png](https://qiita-image-store.s3.amazonaws.com/0/150678/ec8d2492-6f80-edc3-af33-736345e2d463.png)

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

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

![DOC20.png](https://qiita-image-store.s3.amazonaws.com/0/150678/753cc5b7-d691-38a3-d5e1-9342b40009a8.png)

　（５）．次画面にて[ビルドの実行]をクリック

![DOC21.png](https://qiita-image-store.s3.amazonaws.com/0/150678/652d6ca2-6de0-8bb6-91d6-17b0a4ffe424.png)

　（６）．[実行したビルド]をクリックする

![DOC22.png](https://qiita-image-store.s3.amazonaws.com/0/150678/66a108d5-fe88-4513-bcfe-5174af659347.png)

　（８）．[コンソール出力]をクリックして実行内容を確認し終了

![DOC23.png](https://qiita-image-store.s3.amazonaws.com/0/150678/27f5e704-6de6-b611-3404-d93c062240cb.png)


---

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