【Ansible】Dockerコンテナ間でBIND(DNS)のPlaybookインストール・起動確認まで

AnsibleのPlaybookを利用して、リモートサーバーへのBINDインストールと動作確認までを実施したのでまとめました。

現状として、インストール先のDNSサーバーは動作不具合を出しているので微妙な感じですが動作確認まではできる様になっています。

Ansibleインストールはこちらの記事を参照

ansible

Dockerコンテナ間で「Ansible」PlaybookでBINDインストールと動作確認

コンテナ間の接続は、172.17.0.0/24のセグメントで構成は以下となります。

[ansible]——[dns]
  • OS:CentOS7(latest)
  • Ansibleサーバー(172.17.0.2)
  • dnsサーバー(172.17.0.3)

また、今回BINDのインストール・起動を実施するPlaybookの構成は以下となります。
BINDに設定する「name.conf」、正引き・逆引きのzone設定は「config_files」配下に設置します。

[root@ansible /]# tree /etc/ansible/roles/dns/
/etc/ansible/roles/dns/
|-- config_files
|   |-- 0.17.172.in-addr.arpa.rev
|   |-- named.conf
|   `-- test-network.local
|-- hosts
`-- playbook
    `-- dns_install.yml

2 directories, 5 files

上記構成を踏まえて、以下でそれぞれのファイルを作成していきます。

「named.conf」作成

まずは、ansibleからリモート先のサーバーへBINDをインストールした後にコピーする「named.conf」を作成します。

[root@ansible /]# cat /etc/ansible/roles/dns/config_files/named.conf 
acl "test-network" {
        172.17.0.0/24;
};

options {
        listen-on port 53 { 127.0.0.1; 172.17.0.3; };
        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; test-network; };

        recursion yes;

        dnssec-enable no;
        dnssec-validation no;

        managed-keys-directory "/var/named/dynamic";

        pid-file "/var/named/named.pid";
        session-keyfile "/var/named/session.key";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

view "internal" {
        match-clients { localhost; test-network; };

        zone "." IN {
                type hint;
                file "named.ca";
        };

        zone "test-network.local" {
                type master;
                file "test-network.local";
        };

        zone "0.17.172.in-addr.arpa" {
                type master;
                file "0.17.172.in-addr.arpa.rev";
        };

        include "/etc/named.rfc1912.zones";
        include "/etc/named.root.key";
};

この後に正引き・逆引きのゾーンファイルを作成するので以下の設定を、named.confへ記載します。

  • 正引き:test-network.local
  • 逆引き:0.17.172.in-addr.arpa.rev

「正引き」ゾーンファイルの作成

正引きゾーンファイルを作成します。
今回は「test-network.local」というゾーンファイルを作成します。

また、以下でそれぞれの正引きの設定をしました。

  • ansible.test-network.local→172.17.0.2
  • dns.test-network.local→172.17.0.3

設定内容は以下となります。

[root@ansible /]# cat /etc/ansible/roles/dns/config_files/test-network.local 
$TTL 3600
@                IN      SOA dns.test-network.local. root.test-network.local. (
                         2020011202 ; serial
                         3600       ; refresh 1hr
                         900        ; retry 15min
                         604800     ; expire 1w
                         86400      ; min 24hr
)

                 IN      NS     dns.test-network.local.
dns              IN      A      172.17.0.3
ansible          IN      A      172.17.0.2

「逆引き」ゾーンファイルの作成

次に逆引きゾーンファイルを作成します。

[root@ansible /]# cat /etc/ansible/roles/dns/config_files/0.17.172.in-addr.arpa.rev 
$TTL 3600
@                IN      SOA dns.test-network.local. root.test-network.local. (
                         2020011202 ; serial
                         3600       ; refresh 1hr
                         900        ; retry 15min
                         604800     ; expire 1w
                         86400      ; min 24hr
)

                 IN      NS     dns.test-network.local.
2                IN      PTR    ansible.test-network.local.
3                IN      PTR    dns.test-network.local.

逆引きの設定は正引きに設定した内容を反映させます。

  • 172.17.0.2→ansible.test-network.local
  • 172.17.0.3→dns.test-network.local

「hosts」インベントリファイル作成

次にPlaybookの実行対象となるリモートサーバの登録をするための「インベントリファイル」の作成をします。

今回のPlaybookの対象となるのが別コンテナの「dnsサーバ」となるので、対象のIPアドレスの設定と、「all:vars」でsshアクセス情報を登録します。

[root@ansible /]# cat /etc/ansible/roles/dns/hosts                                  
[dns]
172.17.0.3

[all:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass=xxxxxx
ansible_sudo_pass=xxxxxx

Ansibleで実行する「Playbook」作成

Playbookでは実際に実行した際の設定をします。
流れは以下となります。

  1. 「hosts」から対象のリモートサーバーへアクセス
  2. bind,bind-chroot,bind-utilsをインストール
  3. named-chroot停止
  4. named.confをリモートサーバーへコピー
  5. 正引きゾーンファイルをリモートサーバーへコピー
  6. 逆引きゾーンファイルをリモートサーバーへコピー

※最後に「named-chroot」を起動しますが、エラーを吐くため一旦削除してください。

[root@ansible dns]# cat playbook/dns_install.yml 
- 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: /etc/ansible/roles/dns/config_files/named.conf
       dest: /etc/named.conf
       owner: root
       group: named
       mode: 0640
  - name: copy zone file
    copy:
       src: /etc/ansible/roles/dns/config_files/test-network.local
       dest: /var/named/test-network.local
       owner: root
       group: named
       mode: 0640
  - name: copy reverse zone file
    copy:
       src: /etc/ansible/roles/dns/config_files/0.17.172.in-addr.arpa.rev
       dest: /var/named/0.17.172.in-addr.arpa.rev
       owner: root
       group: named
       mode: 0640

#以下はエラーを吐くため削除
  - name: start_named-chroot
    service:
      name: named-chroot
      state: started
      enabled: yes

「Playbook」 実行

Playbookの実行は以下のコマンドとなります。
今回は「dns」フォルダ配下に移動している状態でのコマンドとなります。

またコマンド体系は以下の通りとなります。

$ ansible-playbook -i (インベントリファイル) (ymlファイル)

実際にPlaybookを実行した結果です。

[root@ansible dns]# ansible-playbook -i hosts playbook/dns_install.yml 

PLAY [dns] ********************************************************************************************************************************************************************************************

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

TASK [bind install] ***********************************************************************************************************************************************************************************
ok: [172.17.0.3]

TASK [bind-chroot install] ****************************************************************************************************************************************************************************
ok: [172.17.0.3]

TASK [bind-utils install] *****************************************************************************************************************************************************************************
ok: [172.17.0.3]

TASK [stop_named-chroot] ******************************************************************************************************************************************************************************
ok: [172.17.0.3]

TASK [copy named.conf] ********************************************************************************************************************************************************************************
ok: [172.17.0.3]

TASK [copy zone file] *********************************************************************************************************************************************************************************
ok: [172.17.0.3]

TASK [copy reverse zone file] *************************************************************************************************************************************************************************
ok: [172.17.0.3]

TASK [start_and_enable_named-chroot] ******************************************************************************************************************************************************************
fatal: [172.17.0.3]: FAILED! => {"changed": false, "msg": "Unable to start service named-chroot: Job for named-chroot.service canceled.\n"}

PLAY RECAP ********************************************************************************************************************************************************************************************
172.17.0.3                 : ok=8    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   

問題なくインストールができれば「ok」がカウントされます。
本来は「named-chroot」で起動するのですが、コンテナ環境ではなぜかうまく「named」も「named-chroot」も起動しませんでした。

コンテナ「dns」サーバーでBINDが起動できないエラーが発生

リモート先のDNSサーバーへアクセスし、以下のコマンドを実行しましたが、エラーが発生します。

[root@dns ~]# systemctl start named-chroot
Job for named-chroot.service failed because the control process exited with error code. See "systemctl status named-chroot.service" and "journalctl -xe" for details.

こちらに関してはPlaybookでchrootをスタートさせず、リモート先のサーバーへアクセスし、直接BINDを実行します。

リモート先のサーバーへアクセス実施

リモート先のサーバーへアクセスし、ファイルに問題が無いか以下の「namedd-checkconf」を実施します。

[root@dns ~]# named-checkconf
[root@dns ~]# named-checkzone test-network.local /var/named/test-network.local 
zone test-network.local/IN: loaded serial 2020011202
OK
[root@dns ~]# named-checkzone 0.17.172.local.rev /var/named/0.17.172.in-addr.arpa.rev 
zone 0.17.172.local.rev/IN: loaded serial 2020011202
OK

問題が無い場合は以下のコマンドを実行します。

[root@dns ~]# systemctl start named-chroot

※エラー内容によって上記でもうまく実行できない場合があります。
ここは現在確認中

正常に名前解決ができるか正常性の確認

Dockerコンテナ環境下でBINDを実行させると一定時間は起動しますが、少しすると落ちてしまう事象が発生しています。
一時的に起動している際に名前解決ができたか確認を以下でしました。

正引き(dns.test-network.local)

[root@ansible ~]# nslookup dns.test-network.local 172.17.0.3
Server:		172.17.0.3
Address:	172.17.0.3#53

Name:	dns.test-network.local
Address: 172.17.0.3

逆引き(dns.test-network.local)

[root@ansible ~]# nslookup 172.17.0.3 172.17.0.3
3.0.17.172.in-addr.arpa	name = dns.test-network.local.

正引き(ansible.test-network.local)

[root@ansible ~]# nslookup ansible.test-network.local 172.17.0.3
Server:		172.17.0.3
Address:	172.17.0.3#53

Name:	ansible.test-network.local
Address: 172.17.0.2

逆引き(ansible.test-network.local)

[root@ansible ~]# nslookup 172.17.0.2 172.17.0.3
2.0.17.172.in-addr.arpa	name = ansible.test-network.local.

まだ、設定は調整中ですが、正常に起動次第追って報告します。




エンジニアのオンライン学習

ITエンジニアにおすすめの教材、オンラインスクールです。
無料からエンジニアの学習ができる教材などまとめているので参考にしてください。

おすすめオンライン教材
自宅で学習ができるオンラインスクール

ITエンジニアの開発・検証・学習としてインターネット上で専用のサーバ(VPS)を利用しましょう!
実務経験はVPSで学べます。



コメントを残す

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

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

ABOUT US
げんき☆ひろき
インターネット関連のSEをやっています。 ネットワーク、サーバー、ストレージ、仮想基盤まで幅広く手を出しており、MVNOの構築経験もあります。 現在は、Pythonを使ったプログラミングの開発をしネットワークの自動化ツールを作成しています! Pythonの入門書も作成しているので、ぜひ参考にしてください!