ansible批量部署主從DNS

什么是DNS服務
DNS的解析流程分析
遞歸查詢
迭代查詢
DNS相關的術語說明
生產環境中的應用
Bind9常見配置說明
使用ansible自動部署主從DNS

什么是DNS服務

DNS(Domain Name Service)是Internet上用于名稱解析的服務,簡單來說,就是將域名轉換為IP地址的服務(正向解析),也可以用于將IP地址解析為對應的域名(反向解析)。例如,訪問http://www.google.com.hk時,DNS會先將www.google.com.hk解析為59.24.3.173,用戶再通過59.24.3.173這個IP地址去打開google的網站。DNS服務默認監聽在udp/tcp的53端口,一般來說,udp53用于接收用戶的dns請求,tcp53用于dns服務器之間的通信。

DNS的解析流程分析

遞歸查詢

client向local dns請求www.google.com.hk ,假設local dns第一次接收到該域名的查詢請求,因此本地沒有緩存,從而需要至上而下的分別向根域(“.”)、頂級域(“hk.”)、二級域(“com.hk”)、三級域(“google.com.hk”)發起查詢直到獲得www.google.com.hk  的ip地址,然后local dns將最終的查詢結果(ip地址)返回給client。這個由client向local dns請求,local dns直接返回最終結果的過程就叫做遞歸,遞歸的顯著特點是client僅需一次查詢就獲得了最終結果,而不需要關心local dns中間復雜的逐級查詢過程。

迭代查詢

由local dns從根域自上往下發起查詢直到獲得最終解析結果的過程,稱之為迭代。迭代的特點是一次查詢不能獲得最終的解析結果。

DNS相關的術語說明

 local dns: 
     客戶端本地指定的dns地址。
 權威dns: 
    提供所管理的域下面的所有主機解析的dns服務器。例如,www.google.com 的域名最原始的解析是由dns.google.com這臺dns提供的,dns.google.com就是www.google.com  的權威dns。
 資源解析記錄: 
     A,SOA,NS,MX,CNAME,PTR等,下面分別對其進行介紹:
     SOA:Start Of Authority,起始授權記錄;一個區域解析庫有且僅能有一個SOA記錄,而必須為解析庫的第一條記錄;
     A:internet Address,最常用的資源記錄,用于將域名解析為IP;
     PTR: PoinTeR,反向指針記錄,用于將IP解析為域名,常用于反垃圾郵件系統;
     NS: Name Server,專用于標明當前區域的DNS服務器,配合A記錄使用;
     CNAME:Canonical Name,別名記錄,用于將別名指向另一個域名,配合A記錄使用;
     MX: Mail eXchanger,郵件交換記錄,配合A記錄使用,用于解析email地址中的域名 ;

生產環境中的應用

舉個我們目前生產環境中的例子,應用做成服務化之后,服務之間需要通過RPC來相互調用,為了避免服務前移時IP地址出現變更需要修改服務的配置文件,所以服務之間都使用了域名來訪問,這就需要搭建一套內部DNS了。另一方面,如果使用外部dns做泛域名解析的話,都會解析為一個公網ip,如果內部的應用都使用這個dns解析的話,應用之間通信的流量就會跑到公網,從而浪費的帶寬和增加了網絡時延,這也是考慮搭建內部DNS的原因。

Bind9常見配置說明

這里介紹的是直接使用rpm包安裝的方式,這種方式最簡單直接。以下是相關配置文件的介紹:
/etc/named.conf:    #主配置文件,用于定義dns的全局配置,include其他配置文件片段
    acl ACL_NAME {        //用來定義ip或網絡地址列表,后面配置需要應用該ip列表時可以通過ACL_NAME來引用
        1.1.1.1;
        192.168.0.0/24;
        ...
    };
    options {
    listen-on port 53 { any; };     //指定dns服務的監聽地址和端口,any表示在本機所有ip上監聽53端口
    directory   "/var/named";      //指定區域解析數據庫文件的根目錄
    allow-query     { any; };       //設置允許哪些client做dns查詢
    forward         only;        //開啟轉發dns功能,可選項有first|only,first表示先讓轉發的dns服務器解析,如果沒有得到結果,再由本地dns解析;only表示僅讓轉發目標dns去解析
    forwarders      { 
        114.114.114.114;      //轉發的目標dns地址列表
        };
    allow-recursion { ACL_NAME; };     //指定接收遞歸的客戶端ip列表
    dnssec-enable no;         //協議安全加密通信相關的,一般關閉
    dnssec-validation no;     //協議安全加密通信相關的,一般關閉
    };
    logging {       //日志記錄相關的
        channel default_debug {
            file "data/named.run";
            severity dynamic;
        };
    };
   include "/etc/named.rfc1912.zones";       //包含其他配置文件
   include "/etc/named.root.key";

/etc/named.rfc1912.zones:      #被主配置文件包含,一般用于定義每個zone的類型、zone數據庫文件的路徑及相關的安全策略
    view VIEW_NAME {                         //設置視圖,用于根據客戶端源IP來選在不同的解析。如果使用了視圖,那么所有的zone配置必須位于視圖之內
    match-clients {                          //指定匹配的客戶端ip列表
        internal;
    };
    zone "." IN {                               //定義根區域的配置
        type hint;                           //根區域的類型為hint
        file "named.ca";                //根區域的數據庫文件
    };
    zone "gateray.org" IN {            //自定義區域
        type master;                   //類型為master,表示為該區域的主dns
        file "gateray.org.zone";      //指定區域數據庫文件的路徑
        allow-update { none; };    //指定允許哪些ip可以動態的更新區域數據的資源記錄,none表示不允許更新
        allow-transfer { slaves; };    //允許向哪些從dns服務器返回區域數據更新
    };

    };

/var/named/gateray.org.zone:        #保存dns資源解析記錄的文件數據庫,一般以ZONE_NAME.zone方式命名
    $TTL 1D
    @       IN  SOA   @    admin (
                    2016062801           ; 更新的序列號
                    2H                           ;主從同步間隔時長
                    10M                         ;同步失敗的重試間隔
                    1W                          ;主dns掛掉時,從服務器能夠提供服務的最大時長
                    6H )                         ;用于告訴客戶端,將解析失敗的結果緩存多久
                       IN  NS    ns1         ; NS記錄
                       IN  NS    ns2            
    ns1             IN  A     192.168.124.71         ;權威dns的A記錄
    ns2             IN  A     192.168.124.72
    www           IN  A     192.168.124.71         ;主機A記錄
    m                IN  CNAME www                    ;主機別名記錄
    *                  IN  A     192.168.124.72           ;泛域名A記錄

使用ansible自動部署主從DNS

ansible工作空間目錄結構如下:
[root@host1 deploy]# tree dns
dns
├── ansible.cfg
├── deploy.yml
├── hosts
└── roles
    ├── dns-master
    │   ├── files
    │   │   └── gateray.org.zone
    │   ├── tasks
    │   │   └── main.yml
    │   ├── templates
    │   │   ├── named.conf
    │   │   └── named.rfc1912.zones
    │   └── vars
    │       └── main.yml
    └── dns-slave
        ├── files
        │   └── gateray.org.zone
        ├── tasks
        │   └── main.yml
        ├── templates
        │   ├── named.conf
        │   └── named.rfc1912.zones
        └── vars
            └── main.yml
#cd到dns目錄下執行如下命令,即可完成部署:
[root@host1 dns]# ansible-playbook deploy.yml 

PLAY [masters] *****************************************************************

TASK [dns-master : Install bind9] **********************************************
ok: [192.168.124.71] => (item=[u'bind', u'bind-libs', u'bind-utils', u'libselinux-python'])

TASK [dns-master : Config to bind9] ********************************************
ok: [192.168.124.71] => (item=named.conf)
ok: [192.168.124.71] => (item=named.rfc1912.zones)

TASK [dns-master : Add zone databases] *****************************************
ok: [192.168.124.71] => (item=gateray.org)

TASK [dns-master : Reload named daemon] ****************************************
changed: [192.168.124.71]

PLAY [slaves] ******************************************************************

TASK [dns-slave : Install bind9] ***********************************************
ok: [192.168.124.72] => (item=[u'bind', u'bind-libs', u'bind-utils', u'libselinux-python'])

TASK [dns-slave : Config to bind9] *********************************************
ok: [192.168.124.72] => (item=named.conf)
ok: [192.168.124.72] => (item=named.rfc1912.zones)

TASK [dns-slave : Add zone databases] ******************************************
ok: [192.168.124.72] => (item=gateray.org)

TASK [dns-slave : Reload named daemon] *****************************************
changed: [192.168.124.72]

PLAY RECAP *********************************************************************
192.168.124.71             : ok=4    changed=1    unreachable=0    failed=0   
192.168.124.72             : ok=4    changed=1    unreachable=0    failed=0          

# 下載地址:https://github.com/gateray/dns
補充說明:
 在執行部署命令前,需要根據你的實際環境,修改dns/hosts及dns/roles/dns-master|dns-slave/vars/main.yml的變量值即可
變量說明:
# dns/hosts:
[all:vars]
ansible_ssh_port=22          #指定ssh端口
ansible_ssh_user=root          #ssh用戶
ansible_become=1               #ssh用戶為非root用戶時指定
ansible_become_user=root     #將普通用戶切換至root用戶執行
ansible_become_method=sudo   #用戶切換方法使用sudo

[masters]
192.168.124.71                #指定主dns服務器的ip

[slaves]
192.168.124.72                #指定從dns服務器的ip

# dns/roles/dns-master/vars/main.yml
---
slaves_list:                       #允許同步的dns從服務器列表
  - 192.168.124.71
  - 192.168.124.72
internal_list:                     # 內部網絡地址列表,表示允許遞歸查詢的客戶端列表,一般為內部服務器ip所在的網段
  - 192.168.124.0/24
forwarder_list:                 # 轉發dns的地址列表
  - 114.114.114.114
zones_list:                      # 指定區域名稱的列表
  - gateray.org

# dns/roles/dns-slave/vars/main.yml
---
slaves_list:                     #允許同步的dns從服務器列表
  - 192.168.124.71
  - 192.168.124.72
internal_list:                    # 內部網絡地址列表,表示允許遞歸查詢的客戶端列表,一般為內部服務器ip所在的網段 
  - 192.168.124.0/24
forwarder_list:                # 轉發dns的地址列表 
  - 114.114.114.114
zones_list:                     # 指定區域名稱的列表
  - gateray.org
gateray_org_masters_list: "192.168.124.71;"        #用于在從服務器上指定master服務器的ip列表,不同ip之間需要“;”隔開,并以";"結尾

項目下載地址:

https://github.com/gateray/dns

原創文章,作者:gateray,如若轉載,請注明出處:http://www.www58058.com/20986

(1)
gateraygateray
上一篇 2016-06-28 15:22
下一篇 2016-06-29 14:27

相關推薦

  • 學習宣言

    世界上只有一種失敗,就是半途而廢!

    Linux干貨 2016-12-29
  • Linux 壓縮、解壓縮和打包工具

        前言:你是否曾經因為某個文件占用空間較大,而空間緊缺的U盤無法存放此文件。你是否曾經因為軟件里有太多文件而不方便復制和攜帶。你是否曾因需要備份太過零散而頭疼。那么基于“文件壓縮和打包”的技術因此出現。下面介紹下Linux下關于壓縮、解壓縮和打包的工具及使用。 一、相關術語的原理和意義   &…

    Linux干貨 2015-07-15
  • 幽默:程序員的進化

    高中時期 view plaincopy to clipboardprint? 10 PRINT "HELLO WORLD"   20 END 大學新生 view plaincopy to clipboardprint? …

    Linux干貨 2016-05-17
  • Linux基礎之用戶及組管理

    grep擴展應用,用戶管理,組管理,用戶及組管理命令

    2018-01-31
  • shell 腳本基礎作業

    1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小 #!/bin/bash :<<EOF 顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小 EOF Host_name=`hostna…

    Linux干貨 2016-08-15
欧美性久久久久