AnsibleでOpenLDAP環境構築 -①OpenLDAPサーバ関連のパッケージインストール

投稿者: | 2018年1月16日

ansible インストールでansibleの設定が終わったら、ansibleを使ってopenldap環境構築をやってみる。

openldapサーバ用のplaybookを作成していくのだが、おさらいとして必要な作業を整理する。

①openldapサーバ関連のパッケージインストール
②管理者DNの設定
③組織/グループの設定
④ldapユーザの設定
⑤ldapユーザをssh鍵認証でログインするための設定
⑥ldapユーザにssh公開鍵設定

一応、LDAP構築 まとめの順に沿って工程を分けている。
ひとつのplaybookで①~⑥まで記述することは可能だが、この工程毎に分けてplaybookを作成することにする。

OpenLDAPサーバ環境要件

リソース 要件 備考
ディストリビューション(OS) CentOS7.4 ※CentOS7系だったら大きな変化は無し
ホスト名 ldapserver 任意
IPアドレス 192.168.3.6/24 自宅環境なのでクラスCアドレス
ゲートウェイ 192.168.3.1 自宅HGW
ネームサーバ 192.168.3.1 自宅HGW

■OpenLDAPサーバ関連パッケージインストール用playbook

以下の内容でplaybookを作成してみた。

[root@ansible_sv ~]# mkdir /etc/ansible/yml
[root@ansible_sv ~]# vi /etc/ansible/yml/1_ldapserver_install.yml

- hosts: ldap_sv
  remote_user: root

  tasks:
  - name: Yum install
    yum: name={{ item }} state=present
    with_items:
      - openldap-servers
      - openldap-clients
      - openssh-ldap

  - name: port ldap to firewalld
    firewalld:
      service=ldap
      permanent=true
      state=enabled
      immediate=true

  - name: start slapd
    service:
      name=slapd
      state=started
      enabled=yes

以下、各モジュールの説明。

hosts:
処理を実行する対象ホストを指定。「ldap_sv」は/etc/ansible/hostsに記述したホスト名となる。

remote_user:
hosts:で指定したホストで処理を実行する際に、どのユーザで処理を実行するかを指定。上記の例では先頭の階層に記述しているため、それ以降の全階層において適用される。

tasks:
処理の内容を、tasks:以降に記述する。tasks:を記述しないとエラーになるので注意。

name:
ansible-playbookコマンドを実行した際に、実行結果に出力させる文字列を指定する。

yum:
yumコマンドを実行する。その際にモジュール引数というオプションのようなものを指定することができる。

モジュール引数 条件 説明
name= yumでインストールしたいパッケージ名を指定する。上記例では{{ item }}という変数を使用して複数のパッケージをインストールするようにしているが、
name=openldap-servers,openldap-clients,openssh-ldap
とカンマ区切りで一行で指定することも可能。
state= present パッケージがインストールされていなければインストールを行い、既にインストール済みの場合は何も行わない。
latest パッケージがインストールされていなければ最新版をインストールし、既にインストールされていれば最新版に更新する。
absent パッケージがインストールされていればアンインストールし、インストールされていなければ何も行わない。

with_items:
「item」と記述したところに入る文字列を指定する。文字列は複数指定することができる。
実はここでも行頭に「-」が記述されているが、yml形式においては、ひとつのモジュールに対して複数の処理を当てはめる場合にこのような記述になるらしい。
上記例でも「task:」の中に複数の「- name:」があるのと同じ考えといったところだろうか。

firewalld:
CentOS7のfirewalldデーモンに関する設定を行う。これにもモジュール引数があり、開放が必要なプロトコル(サービス)やポート番号を指定することができる。

モジュール引数 条件 説明
service= 他サーバからのアクセスを許可したいサービス(プロトコル)を指定する。OpenLDAPサーバを構築する際には「ldap」と指定する必要がある。他にもssh,http(s)等を指定することができる。またポート番号を開放する場合は「service=」ではなく「port=」と記述する。OpenLDAPサーバをポートで開放する場合は「port=389/tcp」となる。もちろんudpも指定可。
permanent= true OS再起動後やfirewalldの再起動後も、許可したサービス(プロトコル)やポート番号の設定を残す。残さない場合は「permanent=」行自体を記述しない。
state= enabled OS再起動後もfirewalldが自動起動するようにする。
disabled OS再起動後はfirewalldが自動起動しないようにする。
immediate= true 開放したサービス(プロトコル)やポート番号をリロードすることにより設定を反映させる。「firewall-cmd –reload」と同様。これを記述しないと設定が反映されないので注意。仮にリロードしない場合はimmediate=true自体を削除する。(する人いないと思うけど。。)

service:
デーモン(サービス)の操作を行う場合に指定する。systemctlコマンドと同様。モジュール引数については以下の通り。

モジュール引数 条件 説明
name= デーモン(サービス)の名称を指定。OpenLDAPサーバの場合は「slapd」となる。systemctlコマンドで指定できるデーモン名は大体指定できるようだ。sshd、chronyd等。
state= started デーモン(サービス)を開始する。systemctl start コマンドと同様。
stopped デーモン(サービス)を停止する。systemctl stop コマンドと同様。
restarted デーモン(サービス)を再起動する。systemctl restart コマンドと同様。
reloaded デーモン(サービス)を再読み込みする。restartedと違い、デーモン自体の再起動は行わず設定を読み込む。postgresqlなんかはreloadする場合がある。
enabled= yes OS再起動後、デーモン(サービス)を自動起動させる。
no OS再起動後、デーモン(サービス)を自動起動させない。

■/etc/ansible/hostsの設定

次はhostsの設定。hostsファイルは通称「インベントリ」という。
上記playbookでhostsモジュールに「ldap_sv」と記述しているので、インベントリにその記述を追記する。

[root@ansible_sv ~]# vi /etc/ansible/hosts
[ldap_sv]
192.168.3.6

「:wq!」viを保存終了すればOK。

■ansible-playbookコマンドでplaybookを実行

いよいよansibleの実行。コマンドは
# ansible-playbook <playbook名(フルパス)>

と、思ったら。。。

[root@ansible_sv yml]# ansible-playbook /etc/ansible/yml/1_ldapserver_install.yml
SSH password:

PLAY [ldap_sv] ***************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************
fatal: [192.168.3.6]: FAILED! => {"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does
 not support this. Please add this host's fingerprint to your known_hosts file to manage this host."}

PLAY RECAP *******************************************************************************************************************************************
192.168.3.6                 : ok=0    changed=0     unreachable=0     failed=1

[root@ansible_sv ~]#

エラーになってしもうた(涙)。
エラーの内容から、/root/.ssh/known_hostsにアクセス先ホストの情報がないからダメらしい。OpenLDAPサーバがansible実行用サーバからのsshログインを経験してないとこのエラーになるので、面倒だけどひとまずsshログインを実行する。

[root@ansible_sv ~]# ssh 192.168.3.6
The authenticity of host '192.168.3.6 (192.168.3.6)' can't be established.
ECDSA key fingerprint is SHA256:vWibKkErNIzPzck5HKFwJIA3J7vWcaxEs3FJPs7c7dU.
ECDSA key fingerprint is MD5:c0:a3:4f:7d:39:bc:fb:93:44:27:0e:42:20:d3:09:82.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.3.6' (ECDSA) to the list of known hosts.
root@192.168.3.6's password:
Last login: Thu Jan 18 17:32:20 2018 from gateway
[root@ldapserver ~]#
[root@ldapserver ~]# exit
ログアウト
Connection to 192.168.3.6 closed.
[root@ansible_sv ~]#

これでOKなはず。再度ansible-playbookコマンドを実行する。

[root@ansible_sv ~]# ansible-playbook /etc/ansible/yml/1_ldapserver_install.yml
SSH password:

PLAY [ldap_sv] ***************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************
ok: [192.168.3.6]

TASK [Yum install] ***********************************************************************************************************************************
changed: [192.168.3.6] => (item=[u'openldap-servers', u'openldap-clients', u'openssh-ldap', u'sssd', u'sssd-client', u'sssd-ldap', u'oddjob-mkhomedir'])

TASK [port ldap to firewalld] ************************************************************************************************************************
changed: [192.168.3.6]

TASK [start slapd] ***********************************************************************************************************************************
changed: [192.168.3.6]

PLAY RECAP *******************************************************************************************************************************************
192.168.3.6                 : ok=4     changed=3     unreachable=0     failed=0

[root@ansible_sv ~]#

いけましたー!

実行結果の説明をすると、

「SSH password:」は/etc/ansible/ansible.cfgで「ask_pass = True」としているため、対象ホストにsshアクセスした際にrootパスワードが聞かれる。「ask_pass = True」をコメントアウトする等してパスワードを聞かれなくすることもできるが、通常linux的にrootユーザとしてログインする場合は必ずパスワードを聞かれるので、コメントアウトした状態でansible-playbookコマンドを打つとエラーになってしまう。

TASK [Gathering Facts] はhostsモジュールで指定した対象ホストの情報収集。ansible.cfgで省略する設定にすることもできる。

TASK [Yum install] 、TASK [port ldap to firewalld] 、TASK [start slapd] の[]内の文字列はnameモジュールで記述した文字列が出力される。nameモジュールをつけることは必須ではないが、後でエラーが発生した場合にデバッグ用としてつけておくと、追っかけやすいだろう。

ok:」と緑文字で出ている箇所は、既にモジュールで指定した状態になっていて、スキップしたということ。

change:」と黄色文字で出ている箇所は、そのモジュールが無事に実行され変更が加えられたという意味。

■OpenLDAPサーバで事後確認

念のためansible-playbookコマンドで実行したplaybookの内容がOpenLDAPサーバにちゃんと反映されたか確認。

[root@ldapserver ~]# rpm -aq | grep openldap
openldap-2.4.44-5.el7.x86_64
openldap-servers-2.4.44-5.el7.x86_64
openldap-clients-2.4.44-5.el7.x86_64
[root@ldapserver ~]# rpm -aq | grep sssd
python-sssdconfig-1.15.2-50.el7_4.8.noarch
sssd-ldap-1.15.2-50.el7_4.8.x86_64
sssd-ad-1.15.2-50.el7_4.8.x86_64
sssd-common-1.15.2-50.el7_4.8.x86_64
sssd-common-pac-1.15.2-50.el7_4.8.x86_64
sssd-krb5-1.15.2-50.el7_4.8.x86_64
sssd-1.15.2-50.el7_4.8.x86_64
sssd-client-1.15.2-50.el7_4.8.x86_64
sssd-krb5-common-1.15.2-50.el7_4.8.x86_64
sssd-proxy-1.15.2-50.el7_4.8.x86_64
sssd-ipa-1.15.2-50.el7_4.8.x86_64
[root@ldapserver ~]# rpm -aq | grep oddjob
oddjob-mkhomedir-0.31.5-4.el7.x86_64
oddjob-0.31.5-4.el7.x86_64
[root@ldapserver ~]#

yumでインストールしたパッケージは全部入ってる。

[root@ldapserver ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: ssh dhcpv6-client ldap
  ports: 123/udp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

[root@ldapserver ~]#

service:の中にldapが設定されている。

[root@ldapserver ~]# systemctl status slapd
 slapd.service - OpenLDAP Server Daemon
   Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; vendor preset: disabled)
   Active: active (running) since 木 2018-01-18 23:00:22 JST; 6min ago
     Docs: man:slapd
           man:slapd-config
           man:slapd-hdb
           man:slapd-mdb
           file:///usr/share/doc/openldap-servers/guide.html
  Process: 1792 ExecStart=/usr/sbin/slapd -u ldap -h ${SLAPD_URLS} $SLAPD_OPTIONS (code=exited, status=0/SUCCESS)
  Process: 1778 ExecStartPre=/usr/libexec/openldap/check-config.sh (code=exited, status=0/SUCCESS)
 Main PID: 1795 (slapd)
   CGroup: /system.slice/slapd.service
           mq1795 /usr/sbin/slapd -u ldap -h ldapi:/// ldap:///
        :
        :

無事にslapdが起動されていて、自動起動も有効になっている!

小技的なもの

ansible-playbookコマンドで初回sshアクセスのエラーが出る件だが、/etc/ansible/ansible.cfgの[ssh‗connection]に以下の記述を追加する。

[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null

これは、ansibleをインストールしたサーバのknown_hostsにアクセス先ホストの情報がないときに、known_hostsの内容を確認させないでsshアクセスを行えるようにするもの。これを記述しておけば、別のサーバへansibleを実行した際に同じエラーが出てびっくりすることは無くなるだろう。

これでOpenLDAPサーバのインストールは完了!

コメントを残す

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

CAPTCHA