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