検証環境について
- Ansibleマシン
- CentOS 8.0
- Ansible 2.9.2
- DNSサーバ(管理対象サーバ)
- CentOS 8.0
- BIND 9.11.4
構築するDNSサーバの機能については、以下の通りとします。
- ansible02 と dnstest に関して正引きと逆引きができる
また、DNSサーバについては以下の通り設定済みであることを前提とします。
- ssh用[ユーザ/パスワード]は[testuser/testuser]
- sudo用パスワードは[testuser]
AnsibleでDNSサーバを構築する
構築手順は以下の通りです。
- named.confの作成
- 正引きゾーンファイルの作成
- 逆引きゾーンファイルの作成
- インベントリファイルの作成
- プレイブックファイルの作成
- プレイブックの実行
Ansible側のディレクトリ構成
作業フォルダは /home/ansible とし、以下のような構成とします。
$ tree
.
|-- config_file ←★コンフィグファイルを格納するフォルダ
| `-- dns
| |-- 34.69.10.in-addr.arpa.rev
| |-- mynetwork.local
| `-- named.conf
|-- hosts ←★インベントリファイル
`-- playbooks ←★プレイブックファイルを格納するフォルダ
`-- dns.yml
named.confの作成
まずは、Ansible側からDNSサーバ側へコピーするnamed.confを作成します。
内容は以下の通りとします。
acl "mynetwork" {
10.69.34.0/24;
10.1.10.0/24;
};
options {
listen-on port 53 { 127.0.0.1; 10.69.34.191; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
secroots-file "/var/named/data/named.secroots";
recursing-file "/var/named/data/named.recursing";
allow-query { localhost; mynetwork; };
recursion yes;
dnssec-enable no;
dnssec-validation no;
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
/* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
include "/etc/crypto-policies/back-ends/bind.config";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
view "internal" {
match-clients { localhost; mynetwork; };
zone "." IN {
type hint;
file "named.ca";
};
zone "mynetwork.local" {
type master;
file "mynetwork.local";
};
zone "34.69.10.in-addr.arpa" {
type master;
file "34.69.10.in-addr.arpa.rev";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
};
正引きゾーンファイルの作成
続いて、正引きゾーンファイル mynetwork.local を作成します。
内容は以下の通りとします。
$TTL 3600
@ IN SOA dnstest.mynetwork.local. root.mynetwork.local. (
2020011202 ; serial
3600 ; refresh 1hr
900 ; retry 15min
604800 ; expire 1w
86400 ; min 24hr
)
IN NS dnstest.mynetwork.local.
dnstest IN A 10.69.34.191
ansible02 IN A 10.69.34.26
逆引きゾーンファイルの作成
続いて、逆引きゾーンファイル 34.69.10.in-addr.arpa.rev を作成します。
内容は以下の通りとします。
$TTL 3600
@ IN SOA dnstest.mynetwork.local. root.mynetwork.local. (
2020011202 ; serial
3600 ; refresh 1hr
900 ; retry 15min
604800 ; expire 1w
86400 ; min 24hr
)
IN NS dnstest.mynetwork.local.
26 IN PTR ansible02.mynetwork.local.
191 IN PTR dnstest.mynetwork.local.
インベントリファイルの作成
続いて、インベントリファイル hosts を作成します。
内容は以下の通りとします。
[dns]
10.69.34.191
[all:vars]
ansible_ssh_port=22
ansible_ssh_user=testuser
ansible_ssh_pass=testuser
ansible_sudo_pass=testuser
プレイブックファイルの作成
最後に、プレイブックファイル dns.yml を作成します。
プレイブックに記述する処理内容は以下の通りです。
- bind をインストールする
- bind-chroot をインストールする
- bind-utils をインストールする
- bind-chroot サービスを停止する(べき等性の確保)
- named.conf をコピーする
- 正引きゾーンファイル mynetwork.local をコピーする
- 逆引きゾーンファイル 34.69.10.in-addr.arpa.rev をコピーする
- named-chroot サービスを起動する
作成したプレイブックの内容は以下の通りです。
- hosts: dns
become: yes
tasks:
- name: bind install
yum:
name: bind
state: present
- name: bind-chroot install
yum:
name: bind-chroot
state: present
- name: bind-utils install
yum:
name: bind-utils
state: present
- name: stop_named-chroot
service:
name: named-chroot
state: stopped
- name: copy named.conf
copy:
src: /home/ansible/config_file/dns/named.conf
dest: /etc/named.conf
owner: root
group: named
mode: 0640
- name: copy zone file
copy:
src: /home/ansible/config_file/dns/mynetwork.local
dest: /var/named/mynetwork.local
owner: root
group: named
mode: 0640
- name: copy reverse zone file
copy:
src: /home/ansible/config_file/dns/34.69.10.in-addr.arpa.rev
dest: /var/named/34.69.10.in-addr.arpa.rev
owner: root
group: named
mode: 0640
- name: start_and_enable_named-chroot
service:
name: named-chroot
state: started
enabled: yes
内容について少し説明します。
- hosts: dns
become: yes
hosts:dnsとすることでインベントリファイル内のdnsグループを操作対象としています。
become: yesとすることで各処理を実行時にsudoで実行するようにしています。
- name: bind install
yum:
name: bind
state: present
yumモジュールを使用してbindをインストールします。
state: presentは「インストールされている状態」にすること、という意味です。
- name: stop_named-chroot
service:
name: named-chroot
state: stopped
serviceモジュールを使用してbind-chrootサービスを停止させます。
state: stoppedは「停止している状態」にすること、という意味です。
bind-chrootをインストール直後は当該サービスは停止していますが、Ansibleのべき等性を確保するためにこの処理を入れています。
- name: copy named.conf
copy:
src: /home/ansible/config_file/dns/named.conf
dest: /etc/named.conf
owner: root
group: named
mode: 0640
copyモジュールを使用してnamed.confをコピーします。
srcでコピー元ファイルを、destでコピー先を指定します。
owner、group、modeでコピーされるファイルの権限設定を指定します。
- name: start_and_enable_named-chroot
service:
name: named-chroot
state: started
enabled: yes
serviceモジュールを使用してbind-chrootサービスを起動させます。
state: startedは「起動されている状態」にすること、という意味です。
enabled: yesは「enableになっている状態」にすること、という意味です。
プレイブックの実行
以下のコマンドでAnsibleにてプレイブックを実行します。
$ ansible-playbook -i hosts playbooks/dns.yml
PLAY [dns] ********************************************************************************************************
TASK [Gathering Facts] ********************************************************************************************
ok: [10.69.34.191]
TASK [bind install] ***********************************************************************************************
changed: [10.69.34.191]
TASK [bind-chroot install] ****************************************************************************************
changed: [10.69.34.191]
TASK [bind-utils install] *****************************************************************************************
changed: [10.69.34.191]
TASK [stop_named-chroot] ******************************************************************************************
ok: [10.69.34.191]
TASK [copy named.conf] ********************************************************************************************
changed: [10.69.34.191]
TASK [copy zone file] *********************************************************************************************
changed: [10.69.34.191]
TASK [copy reverse zone file] *************************************************************************************
changed: [10.69.34.191]
TASK [start_and_enable_named-chroot] ******************************************************************************
changed: [10.69.34.191]
PLAY RECAP ********************************************************************************************************
10.69.34.191 : ok=9 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
OK:~となっている項目は、対象サーバの状態に変更なしという意味です。
changed: ~となっている項目は、対象サーバの状態に変更ありという意味です。
正常性確認
DNSサーバの状態確認
named-chroot のステータスを確認します。
$ systemctl status named-chroot
● named-chroot.service - Berkeley Internet Name Domain (DNS)
Loaded: loaded (/usr/lib/systemd/system/named-chroot.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2020-01-13 10:28:30 UTC; 6min ago
Process: 1284 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} -t /var/named/chroot $OPTIONS (code=exited, status=0/SUCCESS)
Process: 1282 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -t /var/named/chroot -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi (code=exited, status=0/SUCCESS)
Main PID: 1285 (named)
Tasks: 7 (limit: 23930)
Memory: 58.4M
CGroup: /system.slice/named-chroot.service
mq1285 /usr/sbin/named -u named -c /etc/named.conf -t /var/named/chroot
サービスが起動していることが分かります。
次に、コピーした設定ファイルを確認します。
$ ls -l /var/named/chroot/etc
total 720
drwxr-x--- 3 root named 4096 Jan 13 10:28 crypto-policies
-rw-r--r-- 1 root root 127 May 11 2019 localtime
drwxr-x--- 2 root named 4096 Jul 25 16:39 named
-rw-r----- 1 root named 1257 Jan 13 10:28 named.conf
-rw-r----- 1 root named 931 Jun 21 2007 named.rfc1912.zones
-rw-r--r-- 1 root named 1886 Apr 13 2017 named.root.key
drwxr-x--- 3 root named 4096 Jan 13 10:28 pki
-rw-r--r-- 1 root root 6568 Sep 10 2018 protocols
-rw-r----- 1 root named 100 Jan 13 10:28 rndc.key
-rw-r--r-- 1 root root 692241 Sep 10 2018 services
named.conf がコピーされていることがわかります。(タイムスタンプ、内容より)
ゾーンファイルについても確認します。
$ ls -l /var/named/chroot/var/named/
total 40
-rw-r----- 1 root named 505 Jan 13 10:28 34.69.10.in-addr.arpa.rev
drwxr-x--- 7 root named 4096 Jan 13 10:28 chroot
drwxrwx--- 2 named named 4096 Jan 13 10:28 data
drwxrwx--- 2 named named 4096 Jan 13 10:28 dynamic
-rw-r----- 1 root named 478 Jan 13 10:28 mynetwork.local
-rw-r----- 1 root named 2253 Apr 5 2018 named.ca
-rw-r----- 1 root named 152 Dec 15 2009 named.empty
-rw-r----- 1 root named 152 Jun 21 2007 named.localhost
-rw-r----- 1 root named 168 Dec 15 2009 named.loopback
drwxrwx--- 2 named named 4096 Jul 25 16:39 slaves
正引きゾーンファイル mynetwork.local と逆引きゾーンファイル 34.69.10.in-addr.arpa.rev がコピーされていることがわかります。
動作確認
ansible02にてnslookupをしてみます。
[ansible@ansible02 ~]$ nslookup 10.69.34.26 10.69.34.191
26.34.69.10.in-addr.arpa name = ansible02.mynetwork.local.
[ansible@ansible02 ~]$
[ansible@ansible02 ~]$ nslookup 10.69.34.191 10.69.34.191
191.34.69.10.in-addr.arpa name = dnstest.mynetwork.local.
[ansible@ansible02 ~]$
[ansible@ansible02 ~]$ nslookup ansible02.mynetwork.local. 10.69.34.191
Server: 10.69.34.191
Address: 10.69.34.191#53
Name: ansible02.mynetwork.local
Address: 10.69.34.26
[ansible@ansible02 ~]$
[ansible@ansible02 ~]$ nslookup dnstest.mynetwork.local. 10.69.34.191
Server: 10.69.34.191
Address: 10.69.34.191#53
Name: dnstest.mynetwork.local
Address: 10.69.34.191
[ansible@ansible02 ~]$
正常に名前解決できています。
―――――――――――――