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サーバのインストールは完了!