Ansibleを利用したshibboleth idp + jetty + apache httpdインストール

はじめに

こんにちは。サイオステクノロジー吉田です。
今回はAnsibleを利用してShibboleth IdPのインストールを自動化しました。
Shibboleth IdPを動作させる環境として、jettyとapache httpdも導入しています。
ここではShibboleth IdPの自動化の方法にについて共有していきたいと思います。
構築手順は学認のサイト※1を参考にしています。

※1手順参考
貴学にてIdPv4をインストールする場合の構築手順
https://meatwiki.nii.ac.jp/confluence/pages/viewpage.action?pageId=20021624

検証環境

CentOS 7.7
ansible 2.9.25
python 2.7.5
jetty-distribution 9.4.32
idp-jetty-base 9.4.0
httpd 2.4.37
Shibboleth IdP 4.1.4

Ansible playbookの作成

ファイル構成

ファイル構成は以下の様にしています。
構築用playbookはinstall_shibboleth.yml一つに集約しました。
インベントリファイルはinventory、構築に必要なファイル群はfilesディレクトリ配下に
格納し、整理しました。構築に必要となる設定ファイルはあらかじめ作成しておいて、
ターゲットノードへアップロードするやり方を取ります。

|-- files
|   |-- httpd.conf
|   |-- idp-jetty-base-9.4.0.tar.gz
|   |-- idp.ini
|   |-- idp.ini_startd
|   |-- idp.mod
|   |-- idp.xml
|   |-- jetty
|   |-- jetty-distribution-9.4.32.v20200930.tar.gz
|   |-- jetty.service
|   |-- shibboleth-identity-provider-4.1.4.tar.gz
|   |-- ssl.conf
|   |-- start.ini
|   |-- tweak-ssl.xml
|   |-- virtualhost-localhost80.conf
|   `-- web.xml
|-- install_shibboleth.yml
┗-- inventory

構築ターゲットの指定

構築ターゲットはinventoryに記載しておきます。
今回は検証用に用意したVMをIPアドレスも含めて指定します。

[shibboleth]
metal ansible_host=192.168.153.133

install_shibboleth.ymlのhostsセクションで構築ターゲットを指定します。

- name: install shibboleth idp and jetty
  hosts: shibboleth
  gather_facts: yes

OSの設定

tasksセクションに設定内容を記載していきます。
設定内容は以下になります。
– firewalldを停止
– タイムゾーンをAsia/Tokyoに設定
– SELinuxは無効化
– 必要なパッケージ(httpd,mod_ssl,java11)をインストール

  tasks:
    - name: disable firewalld
      systemd:
        name: firewalld
        state: stopped
        enabled: no

    - name: set timezone
      timezone:
        name: Asia/Tokyo

    - name: disable selinux
      selinux:
        state: disabled
      notify: reboot server

    - name: install packages
      yum:
        name:
          - httpd
          - mod_ssl
          - java-11-openjdk-headless

jetty9.4のインストール

ここからjettyのインストールになります。
まずはjettyのグループとユーザを作成します。
それぞれgroupモジュールとuserモジュールを使用し、作成します。

    - name: create group jetty
      group:
        name: jetty
        state: present

    - name: create user jetty
      user:
        name: jetty
        group: jetty
        home: /opt/jetty-base
        shell: /sbin/nologin
        comment: "Jetty daemon"
        state: present

次にjettyのファイル群をターゲットノードへアップロードします。
その際にunarchiveモジュールを使用して、ローカルあるtarballを展開した形で送ります。
ここで一つ行っていることとして、jetty-baseファイルのアップロード前に
/opt/jetty-base/logsが存在しなかった場合という条件を入れています。
これはplaybookを2回目実行する際に再アップロードされることを防ぐ目的で入れています。

    - name: check jetty-base directory
      stat:
        path: /opt/jetty-base/logs
      register: state_jetty_base_dir

    - name: upload jetty-distribution files
      unarchive:
        src: "{{ idp_jetty_distribution }}"
        dest: /opt/
        owner: root
        group: root

    - name: upload jetty-base files
      unarchive:
        src: "{{ idp_jetty_base }}"
        dest: /opt/
        owner: root
        group: root
      when: state_jetty_base_dir.stat.exists == false

使用している変数idp_jetty_distributionとidp_jetty_baseは
tasksセクションの前のvarsセクションに使用するjettyのファイルを指定しています。

  vars:
    idp_jetty_distribution: "./jetty-distribution-9.4.32.v20200930.tar.gz"
    idp_jetty_base: "./idp-jetty-base-9.4.0.tar.gz"

次はディレクトリの権限設定、confファイルの作成を行います。
ここはfileモジュールとcopyモジュールを使用して設定していきます。

    - name: create symbolic link
      file:
        src: /opt/jetty-distribution-9.4.32.v20200930
        dest: /opt/jetty
        state: link

    - name: set permisson /opt/jetty-base
      file:
        path: /opt/jetty-base
        mode: g-w
        recurse: yes

    - name: set permisson /opt/jetty-base/logs
      file:
        path: /opt/jetty-base/logs
        owner: jetty
        group: jetty

    - name: set permisson /opt/jetty-base/tmp
      file:
        path: /opt/jetty-base/tmp
        owner: jetty
        group: jetty

    - name: copy sysconfig jetty
      copy:
        src: ./jetty
        dest: /etc/sysconfig/jetty
        owner: root
        group: root
        mode: '0644'

    - name: copy start script
      copy:
        src: /opt/jetty/bin/jetty.sh
        dest: /etc/init.d/jetty
        remote_src: yes
        mode: '0755'

    - name: copy service file
      copy:
        src: ./jetty.service
        dest: /etc/systemd/system/jetty.service
        owner: root
        group: root
        mode: '0644'
      notify: system daemon reload

    - name: set idp.xml file.
      copy:
        src: ./idp.xml
        dest: /opt/jetty-base/webapps/idp.xml
        owner: root
        group: root
        mode: '0644'

    - name: remove idp-backchannel.ini
      file:
        path: /opt/jetty-base/start.d/idp-backchannel.ini
        state: absent

    - name: set start.ini
      copy:
        src: ./start.ini
        dest: /opt/jetty-base/start.d/start.ini
        owner: root
        group: root
        mode: '0644'

    - name: set idp.mod
      copy:
        src: ./idp.mod
        dest: /opt/jetty-base/modules/idp.mod
        owner: root
        group: root
        mode: '0644'

    - name: set idp.ini
      copy:
        src: ./idp.ini_startd
        dest: /opt/jetty-base/start.d/idp.ini
        owner: root
        group: root
        mode: '0644'

    - name: set tweak-ssl.xml
      copy:
        src: ./tweak-ssl.xml
        dest: /opt/jetty-base/etc/tweak-ssl.xml
        owner: root
        group: root
        mode: '0644'

httpdのインストール

ここはhttpdのconfファイルをアップロードします。
設定に変更があった場合サービスを再起動するようにします。

    - name: set httpd.conf
      copy:
        src: ./httpd.conf
        dest: /etc/httpd/conf/httpd.conf
        owner: root
        group: root
        mode: '0644'
      notify: start httpd service

    - name: set ssl.conf
      copy:
        src: ./ssl.conf
        dest: /etc/httpd/conf.d/ssl.conf
        owner: root
        group: root
        mode: '0644'
      notify: start httpd service

shibboleth idpのインストール

ここはShibboleth IdPのインストールを行います。
インストール先のディレクトリ状態を取得し、インストールされていなかった場合にインストールスクリプトを実行するようにしています。
Shibboleth IdPのinstall.shは引数無しで実行すると対話形式で必要な情報を入力していくのですが、ここは引数に必要な情報を渡した形で実行します。

    - name: upload shibboleth idp
      unarchive:
        src: ./shibboleth-identity-provider-4.1.4.tar.gz
        dest: /root/
        owner: root
        group: root

    - name: check shibboleth installed
      stat:
        path: /opt/shibboleth-idp
      register: shibboleth_installed

    - name: install shibboleth
      shell: /root/shibboleth-identity-provider-4.1.4/bin/install.sh -Didp.conf.credentials.filemode=640 -Didp.conf.credentials.group=jetty -Didp.src.dir=/root/shibboleth-identity-provider-4.1.4 -Didp.target.dir=/opt/shibboleth-idp -Didp.host.name=<ホスト名> -Didp.entityID=<エンティティID> -Didp.scope=<スコープ> -Didp.keystore.password=<パスワード> -Didp.sealer.password=<パスワード>
      when: shibboleth_installed.stat.exists == false

    - name: set permisson of shibboleth logs
      file:
        path: /opt/shibboleth-idp/logs
        owner: jetty
        group: jetty
        recurse: yes

    - name: set permisson of shibboleth metadata
      file:
        path: /opt/shibboleth-idp/metadata
        group: jetty
        mode: '01775'

    - name: disallowed directory index
      copy:
        src: ./web.xml
        dest: /opt/shibboleth-idp/edit-webapp/WEB-INF/web.xml
        owner: root
        group: root
        mode: '0644'
      notify: start jetty

変更があった場合に実行したい処理

handlersセクションに設定ファイルを変更した場合に実行したい処理を書いておきます。
rebuildからjettyの再起動はlistenを使用して、複数の処理を実行するようにしています。

  handlers:

    - name: reboot server
      reboot:

    - name: system daemon reload
      systemd:
        daemon_reload: yes

    - name: exec rebuild
      shell: /opt/shibboleth-idp/bin/build.sh -Didp.target.dir=/opt/shibboleth-idp
      listen: start jetty

    - name: start jetty service
      systemd:
        name: jetty
        state: restarted
        enabled: yes
      listen: start jetty

    - name: start httpd service
      systemd:
        name: httpd
        state: restarted
        enabled: yes

まとめ

今回はAnsibleを利用してjetty,apache httpd,shibboleth idpのインストールを自動化しました。
今後の改良点としては1ファイルに記述する量を減らすためrole分割する。
fileモジュールで似たような処理をしているものはループを活用する。
設定ファイルはテンプレートを使用して、サーバごとに柔軟に対応できるようにするなどを考えています。
また、Shibboleth IdPで使用するLDAPサーバ用のplaybookを足していくということもやっていきたいです。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です