[02] 前述[01]で構築した Jenkins Master(docker) - Slave(docker) [SSH通信] の Slave を複製するバッチ


## 概要

前述の「[01](https://qiita.com/robozushi10/items/0298a01cdffcf835fe38)」では、次のように Slave 2台を構築した.
これを所望の台数に複製するバッチである.
今回は 8台へと増やす.


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/67fa46c5-396b-2dea-2d34-e6b6ae51be1e.png)

|役割|マシン名|ホスト側ポート|コンテナ側ポート|補足|
|:--|:--|:--|:--|:--|
|Jenkins Master|jenkinsmaster|43080|8080||
|Jenkins Slave(1)|slave001| - | - |Docker on Docker 可能である|
|Jenkins Slave(2)|slave002| - | - |Docker on Docker 可能である|

　

## 手順

### 1. バッチを準備する

#### dup-slave.sh

3つの 🛑 の箇所を変更する

・7行目を追加したいマシンの開始番号にする. 今回は 003 とする.
・8行目を追加したいマシンの終了番号にする. 今回は 008 とする.
・14行目付近の PUBKEY の値を、環境に応じて変更すること.

```bash
#!/bin/bash

#--------------------------------------------------------------------------------------------------
# 概要:
# slave001 として登録しておいた ssh slaveノードを複製して、新規の ssh slave ノードを立ち上げる
#--------------------------------------------------------------------------------------------------
# slaveノードの開始番号 🛑
SB=003

# slaveノードの終了番号 🛑
EB=008

# Jenkins Master で作成した SSH公開鍵 🛑
PUBKEY='ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAsJmu753NXhjEtkzMLLAxBs55/nSFJ/SqGooBDrSb06Q1lLRmRUdhj11SjHCTzoMwDt9kL7LE4VuxvVPsXxjU6tc31rAznEqj5i471y08mS94D4CUwsHOQvuo8wJiQOC8TAGyRIgKqaW5RKlDuMjlU6T2GdVRco1AAqSk5f+d0p3kAvYGVXmw7x4HX6fcjZZPVcK+xsDLVYy/073KBPDmsyost57OGeYrxDqzczoL79xQ3klPrqs/ZaO5bojEG6hhILCkqCHVv73eM24iUfxQAAnuIV0FXSahQ4keQrtd3YMbyVDK0iwwAxfmdIyLL+onfoPM8n4TFNWpJ9Gb7ZoV jenkins@eb4672becefc'

echo "DEBUG:"
echo "DEBUG:----------------------------------------------------------------"
echo "DEBUG: docker-compose.yml に対して、新規に slaveノードを追加する"
echo "DEBUG:----------------------------------------------------------------"
# docker-compose.yml に対して、新規に slaveノードを追加する
for N in `seq -w $SB $EB`
do
  grep -q "slave$N:" docker-compose.yml && continue # すでに登録済みの slaveノードの場合

  echo "DEBUG: docker-compose.yml に slave$N の情報を追記します"
  cat <<EOL >> docker-compose.yml
  slave$N:
    container_name: slave$N
    user: root
    image: jenkinsci/ssh-slave
    volumes:
      - ./PV/jenkinsslave/slave$N:/var/jenkins_home
    environment:
      - JENKINS_SLAVE_SSH_PUBKEY=$PUBKEY
EOL
done

echo "DEBUG:"
echo "DEBUG:----------------------------------------------------------------"
echo "DEBUG: 作成した slave を稼動させる"
echo "DEBUG:----------------------------------------------------------------"
echo "DEBUG: docker-compose up -d"
docker-compose up -d

echo "DEBUG:"
echo "DEBUG:----------------------------------------------------------------"
echo "DEBUG: 既存の slaveノード情報を複製して、新規 slaveノードを立ち上げる"
echo "DEBUG:----------------------------------------------------------------"
for N in `seq -w $SB $EB`
do
  test -d PV/jenkinsslave/slave$N && {
    # 作成した slave の永続ボリュームの所有権を「1000:1000」にする
    echo "DEBUG: sudo chown -R 1000:1000 PV/jenkinsslave/slave$N"
    sudo chown -R 1000:1000 PV/jenkinsslave/slave$N
  
    # Jenkins Master に slave ノード情報を作成する
    echo "DEBUG: sudo mkdir -p PV/jenkinsmaster/jenkins_home/nodes/slave$N"
    sudo mkdir -p PV/jenkinsmaster/jenkins_home/nodes/slave$N
  
    # Jenkins Master に作成した slave ノード情報の所有権を「1000:1000」にする
    echo "DEBUG: sudo chown -R 1000:1000 PV/jenkinsmaster/jenkins_home/nodes/slave$N"
    sudo chown -R 1000:1000 PV/jenkinsmaster/jenkins_home/nodes/slave$N
  
    # 個々の slave の設定を作成する
    echo "DEBUG: sudo cp -p PV/jenkinsmaster/jenkins_home/nodes/slave001/config.xml PV/jenkinsmaster/jenkins_home/nodes/slave$N/config.xml"
    sudo cp -p PV/jenkinsmaster/jenkins_home/nodes/slave001/config.xml PV/jenkinsmaster/jenkins_home/nodes/slave$N/config.xml

    echo "DEBUG: sudo sed -i -r -e \"s%<name>(.*)</name>%<name>slave$N</name>%g\" \\
                   -e \"s%<host>(.*)</host>%<host>slave$N</host>%g\" \\
                   -e \"s%<label>(.*)</label>%<label>slave$N</label>%g\" PV/jenkinsmaster/jenkins_home/nodes/slave$N/config.xml"
    sudo sed -i -r -e "s%<name>(.*)</name>%<name>slave$N</name>%g" \
                   -e "s%<host>(.*)</host>%<host>slave$N</host>%g" \
                   -e "s%<label>(.*)</label>%<label>slave$N</label>%g" PV/jenkinsmaster/jenkins_home/nodes/slave$N/config.xml
  }
done

echo "DEBUG:"
echo "DEBUG:----------------------------------------------------------------"
echo "DEBUG: Jenkins Master を再起動させて、新規に追加した slave ノードのマシン名が認識できるようにする"
echo "DEBUG:----------------------------------------------------------------"
echo "DEBUG: docker-compose restart jenkinsmaster"
docker-compose restart jenkinsmaster

echo "# Jenkins Master から新規 slave ノードに ssh 接続をして、knows_hosts に該当の slave ノード情報を登録する"
for N in `seq -w $SB $EB`
do
  echo "DEBUG: docker-compose exec -u jenkins jenkinsmaster bash -c \"ssh -o 'StrictHostKeyChecking=no' slave$N hostname\""
  docker-compose exec -u jenkins jenkinsmaster bash -c "ssh -o 'StrictHostKeyChecking=no' slave$N hostname"
done

echo "DEBUG:"
echo "DEBUG:----------------------------------------------------------------"
echo "DEBUG: Jenkins Master を再起動させて、新規に追加した slave ノードに対して ssh 接続をする"
echo "DEBUG:----------------------------------------------------------------"
echo "DEBUG: docker-compose restart jenkinsmaster"
docker-compose restart jenkinsmaster

```


### 2. バッチを実行する

```bash
$ ./dup-slave.sh
```

### 3. slave が複製されていればOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/0f867be9-857b-0787-9669-1f8a1257bb7d.png)

　

以上.