Ansibleのtagsを使ってJenkins ver.2をセットアップする

# はじめに
AnsibleでJenkinsをインストールし、さらにプラグインの組み込を行う方法を紹介します。
Jenkins CLIは利用しません。

検証環境：Jenkins ver.2.11

Ansibleのインストールは下記の記事を参考にしてください。
　[Ansible 最初の一歩](http://qiita.com/olympic2020/items/9c21d53066c9c6e5357f)

# PlayBookとconfig.xml
Ansibleのtagsを利用して、Step1, Step2に分けて操作します。

+ **PlayBookの流れ**
    1. **Step1**
        + Jenkinsの初回の起動を実行し、各種ファイルを展開させます。
        + Jenkinsを停止させます。
    2. **手動で認証操作を行います。**
        + 初回起動後、`/var/lib/jenkins/secrets/initialAdminPassword` をAdministrator passwordを入力する必要がありました。この認証をパスしていないと、config.xmlを上書きしても再起動すると初期状態に戻ってしまうようです。
    3. **Step2**
        + セキュリティを無効に設定したconfig.xmlと差し替えます。
        + プラグイン（hpiファイル）をpluginsディレクトリに格納します。
        + Jenkinsを起動させ、プラグイン（hpiファイル）を展開します。
        + Jenkinsのセキュリティを無効にする方法については、下記の記事を参照してください。  
        　[Jenkinsのセキュリティを無効にする](http://qiita.com/olympic2020/items/010bc6a0a77f906c39b3#_reference-8f8cceaa1e78b2568cac)
    　
+ **ファイルの配置**
    以下のように配置してください。
    playbook.yml
    　└templates/
    　　　└config.xml

    　
+ **PlayBook**

```playbook.yml
- hosts: all
  remote_user: ec2-user
  become: true
  tasks:
    #****************************************************
    # Step1
    #****************************************************
    - name: download jenkins.repo
      get_url: >
        url="http://pkg.jenkins-ci.org/redhat/jenkins.repo"
        dest=/etc/yum.repos.d/jenkins.repo
      tags:
        - step1

    - name: import jenkins-ci.org.key
      rpm_key: >
        key="https://jenkins-ci.org/redhat/jenkins-ci.org.key"
        state=present
      tags:
        - step1

    - name: install jenkins
      yum: name=jenkins
      tags:
        - step1

    - name: enable jenkins
      service: >
        name=jenkins
        enabled=yes
      tags:
        - step1

    - name: start jenkins
      service: >
        name=jenkins
        state=started
      tags:
        - step1

    #****************************************************
    # Step2
    #****************************************************
    - name: stop jenkins
      service: >
        name=jenkins
        state=stopped
      tags:
        - step2

    - name: disable security
      copy: >
        src=./templates/config.xml
        dest=/var/lib/jenkins/config.xml
        owner=jenkins
        group=jenkins
        mode=0644
      tags:
        - step2

    - name: install "Exclusive Execution Plugin"
      get_url: >
        url=http://updates.jenkins-ci.org/latest/exclusive-execution.hpi
        dest=/var/lib/jenkins/plugins/exclusive-execution.hpi
        owner=jenkins
        group=jenkins
        mode=0766
      tags:
        - step2

    - name: install "stepcounter Plugin"
      get_url: >
        url=http://updates.jenkins-ci.org/latest/stepcounter.hpi
        dest=/var/lib/jenkins/plugins/stepcounter.hpi
        owner=jenkins
        group=jenkins
        mode=0766
      tags:
        - step2

    - name: start jenkins
      service: >
        name=jenkins
        state=started
      tags:
        - step2
```

+ **config.xml**

```config.xml
<?xml version='1.0' encoding='UTF-8'?>
<hudson>
  <disabledAdministrativeMonitors/>
  <version>1.0</version>
  <numExecutors>2</numExecutors>
  <mode>NORMAL</mode>
  <useSecurity>false</useSecurity>
  <disableRememberMe>false</disableRememberMe>
  <projectNamingStrategy class="jenkins.model.ProjectNamingStrategy$DefaultProjectNamingStrategy"/>
  <workspaceDir>${JENKINS_HOME}/workspace/${ITEM_FULLNAME}</workspaceDir>
  <buildsDir>${ITEM_ROOTDIR}/builds</buildsDir>
  <jdks/>
  <viewsTabBar class="hudson.views.DefaultViewsTabBar"/>
  <myViewsTabBar class="hudson.views.DefaultMyViewsTabBar"/>
  <clouds/>
  <scmCheckoutRetryCount>0</scmCheckoutRetryCount>
  <views>
    <hudson.model.AllView>
      <owner class="hudson" reference="../../.."/>
      <name>すべて</name>
      <filterExecutors>false</filterExecutors>
      <filterQueue>false</filterQueue>
      <properties class="hudson.model.View$PropertyList"/>
    </hudson.model.AllView>
  </views>
  <primaryView>すべて</primaryView>
  <slaveAgentPort>-1</slaveAgentPort>
  <label></label>
  <crumbIssuer class="hudson.security.csrf.DefaultCrumbIssuer">
    <excludeClientIPFromCrumb>false</excludeClientIPFromCrumb>
  </crumbIssuer>
  <nodeProperties/>
  <globalNodeProperties/>
</hudson>
```

# ansible-playbook
実行してみます。

**・Step1**

```bash
$ ansible-playbook -t step1 playbook.yml

PLAY [all] *********************************************************************

TASK [setup] *******************************************************************
ok: [target01]

TASK [download jenkins.repo] ***************************************************
changed: [target01]

TASK [import jenkins-ci.org.key] ***********************************************
changed: [target01]

TASK [install jenkins] *********************************************************
changed: [target01]

TASK [enable jenkins] **********************************************************
ok: [target01]

TASK [start jenkins] ***********************************************************
changed: [target01]

PLAY RECAP *********************************************************************
target01                   : ok=6    changed=4    unreachable=0    failed=0
```

**・手動操作**
　　Web画面で認証操作を行います。

**・Step2**

```bash
$ ansible-playbook -t step2 playbook.yml

PLAY [all] *********************************************************************

TASK [setup] *******************************************************************
ok: [target01]

TASK [stop jenkins] ************************************************************
changed: [target01]

TASK [disable security] ********************************************************
changed: [target01]

TASK [install "Exclusive Execution Plugin"] ************************************
changed: [target01]

TASK [install "stepcounter Plugin"] ********************************************
changed: [target01]

TASK [start jenkins] ***********************************************************
changed: [target01]

PLAY RECAP *********************************************************************
target01                   : ok=5    changed=4    unreachable=0    failed=0
```

# おわりに
今回の記事は、プラグインのインストールまででしたが、セキュリティの設定も元に戻すのであれば、一旦、config.xmlを退避させておき、プラグインのインストールが終わったら、退避させておいたconfig.xmlを戻してあげてください。