AnsibleのPlaybookを利用して、リモートサーバーへのBINDインストールと動作確認までを実施したのでまとめました。
現状として、インストール先のDNSサーバーは動作不具合を出しているので微妙な感じですが動作確認まではできる様になっています。
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」配下に設置します。
01 02 03 04 05 06 07 08 09 10 11 | [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.yml2 directories, 5 files |
上記構成を踏まえて、以下でそれぞれのファイルを作成していきます。
「named.conf」作成
まずは、ansibleからリモート先のサーバーへBINDをインストールした後にコピーする「named.conf」を作成します。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | [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
設定内容は以下となります。
01 02 03 04 05 06 07 08 09 10 11 12 13 | [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.3ansible IN A 172.17.0.2 |
「逆引き」ゾーンファイルの作成
次に逆引きゾーンファイルを作成します。
01 02 03 04 05 06 07 08 09 10 11 12 13 | [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アクセス情報を登録します。
1 2 3 4 5 6 7 8 9 | [root@ansible /]# cat /etc/ansible/roles/dns/hosts [dns]172.17.0.3[all:vars]ansible_ssh_port=22ansible_ssh_user=rootansible_ssh_pass=xxxxxxansible_sudo_pass=xxxxxx |
Ansibleで実行する「Playbook」作成
Playbookでは実際に実行した際の設定をします。
流れは以下となります。
- 「hosts」から対象のリモートサーバーへアクセス
- bind,bind-chroot,bind-utilsをインストール
- named-chroot停止
- named.confをリモートサーバーへコピー
- 正引きゾーンファイルをリモートサーバーへコピー
- 逆引きゾーンファイルをリモートサーバーへコピー
※最後に「named-chroot」を起動しますが、エラーを吐くため一旦削除してください。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | [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」フォルダ配下に移動している状態でのコマンドとなります。
またコマンド体系は以下の通りとなります。
1 | $ ansible-playbook -i (インベントリファイル) (ymlファイル) |
実際にPlaybookを実行した結果です。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | [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サーバーへアクセスし、以下のコマンドを実行しましたが、エラーが発生します。
1 2 | [root@dns ~]# systemctl start named-chrootJob 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」を実施します。
1 2 3 4 5 6 7 | [root@dns ~]# named-checkconf[root@dns ~]# named-checkzone test-network.local /var/named/test-network.local zone test-network.local/IN: loaded serial 2020011202OK[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 2020011202OK |
問題が無い場合は以下のコマンドを実行します。
1 | [root@dns ~]# systemctl start named-chroot |
※エラー内容によって上記でもうまく実行できない場合があります。
ここは現在確認中
正常に名前解決ができるか正常性の確認
Dockerコンテナ環境下でBINDを実行させると一定時間は起動しますが、少しすると落ちてしまう事象が発生しています。
一時的に起動している際に名前解決ができたか確認を以下でしました。
正引き(dns.test-network.local)
1 2 3 4 5 6 | [root@ansible ~]# nslookup dns.test-network.local 172.17.0.3Server: 172.17.0.3Address: 172.17.0.3#53Name: dns.test-network.localAddress: 172.17.0.3 |
逆引き(dns.test-network.local)
1 2 | [root@ansible ~]# nslookup 172.17.0.3 172.17.0.33.0.17.172.in-addr.arpa name = dns.test-network.local. |
正引き(ansible.test-network.local)
1 2 3 4 5 6 | [root@ansible ~]# nslookup ansible.test-network.local 172.17.0.3Server: 172.17.0.3Address: 172.17.0.3#53Name: ansible.test-network.localAddress: 172.17.0.2 |
逆引き(ansible.test-network.local)
1 2 | [root@ansible ~]# nslookup 172.17.0.2 172.17.0.32.0.17.172.in-addr.arpa name = ansible.test-network.local. |
まだ、設定は調整中ですが、正常に起動次第追って報告します。
ITエンジニアの開発・検証・学習としてインターネット上で専用のサーバ(VPS)を利用しましょう!
実務経験はVPSで学べます。

コメント