OpenLDAP と仲間たち Advent Calendar 2015 の 1日目の記事です。
OpenLDAP のマルチマスターサーバー群とスレーブサーバーの構築と ベースとなる LDAP DIT データ作成と投入を行なう Ansible playbook を作りました。
初めての Ansible playbook です。まだ手探りだったり使い方が変なところがあると 思うので、強くダメ出しを希望します。よろしくお願いします!!!!
いまのところ OpenLDAP だけですが、ほかのも追加していく予定です。
要件
- Ansible 2.0 (2.0.0rc1 で開発)
- Vagrant (1.7.4 で開発)
- VirtualBox (5.0.10 で開発)
構成
ステージング環境の構成です。
ソフトウェア構成
- CentOS 7.1 (Vagrant Box の bento/centos-7.1)
- OpenLDAP 2.4.39-7.el7.centos
/etc/openldap/ldap.conf
- LDAP クライアント設定ファイル
/etc/openldap/slapd.conf
- LDAP サーバー設定ファイル
ホスト構成
ステージング環境内では FQDN で名前解決できるようになっています。
- ldap-master1
- ホスト名: ldap-master1.example.jp
- IPアドレス: 10.255.1.11
- LDAP マルチマスターサーバー群のうちの1つ
- ldap-master2
- ホスト名: ldap-master2.example.jp
- IPアドレス: 10.255.1.12
- LDAP マルチマスターサーバー群のうちの1つ
- ldap-slave1
- ホスト名: ldap-slave1.example.jp
- IPアドレス: 10.255.1.21
- LDAP スレーブサーバー
DNS レコード構成
dnsmasq でステージング環境内のホストやサービスの名前解決ができるようになっています。
- ldap.example.jp
- 全 LDAP サーバーを差すレコード
- ldap-master.example.jp
- 全 LDAP マスターサーバーを差すレコード
- ldap-slave.example.jp
- 全 LDAP スレーブサーバーを差すレコード
DIT 構成
- サフィックス
- dc=example,dc=jp
- 全管理権限用エントリ (
rootdn
)- DN:
cn=master,dc=example,dc=jp
- パスワード:
master-pass
- DN:
- レプリケーション用エントリ
- DN:
cn=slave,dc=example,dc=jp
- パスワード:
slave-pass
- DN:
- 管理者用エントリ
- DN:
cn=admin,dc=example,dc=jp
- パスワード:
admin-pass
- DN:
- デフォルトパスワードポリシーエントリ
- DN:
cn=default,ou=Policies,dc=example,dc=jp
- DN:
準備
Ansible 2.0 はまだ正式リリースされていません。 以下の要領で Ansible Git リポジトリの開発版を利用できるようにします。
$ git clone git://github.com/ansible/ansible.git
$ cd ansible
$ git checkout -b stable-2.0 origin/stable-2.0
$ source hacking/env-setup
Vagrant と VirtualBox は適宜インストールしてください。 Debian や Ubuntu でのインストール例は以下の通り。
$ sudo apt-get install vagrant virtualbox
使い方
Ansible playbook を git clone
します。
$ git clone https://github.com/fumiyas/ansible-playbooks.git
$ cd ansible-playbook
ステージング環境のインベントリや変数を staging
ディレクトリ下に作成します。
例が含まれているので、コピーして利用してください。
$ cp -rp staging.example staging
必要であれば、インベントリや変数定義をカスタマイズしてください。 (カスタマイズしなくても動きます)
$ vi staging/group_vars/all/hosts.yml
...
$ vi staging/host_vars/*/*.yml
...
$ vi staging/inventory.ini
...
VM を起動します。
$ make up
vagrant up
Bringing machine 'ldap-master1' up with 'virtualbox' provider...
Bringing machine 'ldap-master2' up with 'virtualbox' provider...
Bringing machine 'ldap-slave1' up with 'virtualbox' provider...
==> ldap-master1: Importing base box 'bento/centos-7.1'...
…
Ansible playbooks を実行します。
$ make staging
VM 上の OS にログインすれば、OpenLDAP 環境を利用できるようになります。
$ vagrant ssh ldap-master1
$ vagrant ssh ldap-master2
$ vagrant ssh ldap-slave1
ステージング環境が不要になったら破棄します。
$ make destroy
LDAP 操作例
匿名バインドで検索。
$ ldapsearch -H ldap://ldap.example.jp/ -x
$ ldapsearch -H ldap://ldap-master.example.jp/ -x
$ ldapsearch -H ldap://ldap-master1.example.jp/ -x
$ ldapsearch -H ldap://ldap-master2.example.jp/ -x
$ ldapsearch -H ldap://ldap-slave1.example.jp/ -x
管理者用エントリでバインドして検索。
$ ldapsearch -H ldap://ldap.example.jp/ -x -D cn=admin,dc=example,dc=jp -W
Enter LDAP Password: admin-pass
エントリの追加と検索。
$ cat user.ldif
dn: uid=testuser1,ou=Users,dc=example,dc=jp
objectClass: inetOrgPerson
uid: testuser1
cn: testuser1
sn: testuser1
userPassword: plain-text-password
$ ldapadd -H ldap://ldap-master.example.jp/ -x -D cn=admin,dc=example,dc=jp -W <user.ldif
Enter LDAP Password: admin-pass
adding new entry "uid=testuser1,ou=Users,dc=example,dc=jp"
$ ldapsearch -H ldap://ldap.example.jp/ -x -LLL '(uid=testuser1)' '*' +
dn: uid=testuser1,ou=Users,dc=example,dc=jp
objectClass: inetOrgPerson
uid: testuser1
cn: testuser1
sn: testuser1
structuralObjectClass: inetOrgPerson
entryUUID: 91d20362-2c6b-1035-8d18-057fc4e885e0
creatorsName: cn=admin,dc=example,dc=jp
createTimestamp: 20151201113656Z
entryCSN: 20151201113656.024726Z#000000#001#000000
modifiersName: cn=admin,dc=example,dc=jp
modifyTimestamp: 20151201113656Z
entryDN: uid=testuser1,ou=Users,dc=example,dc=jp
subschemaSubentry: cn=Subschema
hasSubordinates: FALSE
エントリの削除。
$ ldapdelete -H ldap://ldap-master.example.jp/ -x -D cn=admin,dc=example,dc=jp -W uid=testuser1,ou=Users,dc=example,dc=jp
Enter LDAP Password: admin-pass
$ ldapsearch -H ldap://ldap.example.jp/ -x '(uid=testuser1)'
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=jp> (default) with scope subtree
# filter: (uid=testuser1)
# requesting: ALL
#
# search result
search: 2
result: 0 Success
# numResponses: 1
TODO
- Debian / Ubuntu にも対応させたい。(一部だけ対応している)
- VirtualBox 以外の VM ソフトウェア (KVM, VMware) でもステージング環境構築できるようにしたい。
ところで、12月25日はクリスマスな上に、
OSS 界隈で地味に活躍されているふみやすさんの誕生日ですね!
っ http://www.amazon.co.jp/registry/wishlist/27M7TV8CEEF6G?sort=priority
逆に、あなたの書いた OSS や Blog や Advent Calendar が気に入ったら何か送りたく なってしまうかもしれないので、プロフィールや Web サイトに あなたの Amazon 欲しいものリストの URL を貼っておいてくださいね!
私が勤める OSSTech っていう某弊社で社員募集しているようです。 人材紹介会社を介さなければ、入社後に 20万円のボーナス! 「ふみやすっていう人に紹介された」と言ってもらえると私にもボーナス!! → https://www.osstech.co.jp/recruit/
よろしければ、これまで参加した/参加予定のほかの Advent Calendar もどうぞ。
- Ansible Advent Calendar 2023
- シェル芸 Advent Calendar 2023
- 闇の魔術に対する防衛術 Advent Calendar 2023
- Ansible Advent Calendar 2023
- Ansible Advent Calendar 2020
- DNS温泉 Advent Calendar 2019
- OSSTech Advent Calendar 2019
- Ansible Advent Calendar 2018
- OSSTech Advent Calendar 2018
- Debian/Ubuntu Advent Calendar 2017
- Linux Advent Calendar 2017
- Shell Script Advent Calendar 2017
- Shell Script Advent Calendar 2016
- OpenLDAP と仲間たち Advent Calendar 2015
- Postfix Advent Calendar 2014
- 拡張 POSIX シェルスクリプト Advent Calendar 2013