AnsibleでDNSサーバを構築する(Ansible 2.9.2)

インフラサーバ

検証環境について

  • 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サーバを構築する

構築手順は以下の通りです。

  1. named.confの作成
  2. 正引きゾーンファイルの作成
  3. 逆引きゾーンファイルの作成
  4. インベントリファイルの作成
  5. プレイブックファイルの作成
  6. プレイブックの実行

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 を作成します。
プレイブックに記述する処理内容は以下の通りです。

  1. bind をインストールする
  2. bind-chroot をインストールする
  3. bind-utils をインストールする
  4. bind-chroot サービスを停止する(べき等性の確保)
  5. named.conf をコピーする
  6. 正引きゾーンファイル mynetwork.local をコピーする
  7. 逆引きゾーンファイル 34.69.10.in-addr.arpa.rev をコピーする
  8. 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 ~]$

正常に名前解決できています。

―――――――――――――

タイトルとURLをコピーしました