はじめに
こんにちは。サイオステクノロジー吉田です。
今回は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を足していくということもやっていきたいです。

