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.178linux.com/20986

(1)
gateraygateray
上一篇 2016-06-28
下一篇 2016-06-29

相关推荐

  • vsftpd基于mysql存储认证(centos7)

    (1)首先开发包组和服务器平平台开发包组 (2)yum安装需要的依赖包 (3)编译安装pam_mysql模块 (4)配置mysql,并添加mysql中的vsftpd进程用户,且创建vsftpd数据库,并将vsftpd数据库授权给vsftpd用户,且创建vsftpd.users表,并在表中添加用户tom (5)创建vsftpd要上传和下载的URL (6)创建基…

    Linux干货 2016-10-15
  • Linux shell脚本编程练习题

    《书籍上面的练习题》 问题:谁在霸占磁盘资源?     如果您负责的Linux服务器上有许多用户,则经常需要解决的一个问题就是谁在使用所有磁盘空间。这是个老掉牙的问题有时比其他问题更难以弄清。     不幸的是,虽然跟踪用户磁盘空间使用情况非常重要,但却没有一个Linux命令可以提供此信息。因此需要…

    Linux干货 2016-06-09
  • class8 文本处理工具sed和vim编辑器

    一、处理文本的工具sed     Stream EDitor,  行编辑器     sed是linux上一款比较重要的流编辑器。     特点:一次处理一行内容,处理完成后,把缓冲区的内容送往屏幕。这样不断重复,直到文件末尾。 &…

    Linux干货 2016-08-11
  • 如何在CentOS上构架一个简易的局域网web服务器

    首先,要取得适用你系统版本的http源码包,这里推荐两个网站: httpd.apache.org www.kernel.org 根据自己系统的版本下载相应的源码包; CentOS7 下载 httpd-2.4.25.tar CentOS6 下载 httpd-2.2.32.tar 以CentOS 6 示例: 首先,我们先来为http…

    2017-03-09
  • 方便实用的文件查找与压缩

    在平时的运维工作当中通常会编辑某些文件,但时间久了,突然一下子记不起文件的名字,遇到的事情又很紧急,需要立马去处理,而自己只知道那个文件部分的特征信息,我们需要在系统中去搜索自己想要的文件,那么有没有办法去实现呢,当然有,在我们的系统中,文件查找的工具有两个,locate和find。那么下面来介绍这两个工具的用法以及两个工具之间的差别。 在我们linux系统…

    Linux干货 2016-08-13
  • 快速运用NFS共享web页面

    环境:centos7.3最小化三台,前期准备关闭防火墙和selinux 目的:通过文件共享,使客户端访问web服务器时是同样的页面。 拓扑图: 优势:减少WEB服务器的压力。 一、安装软件 NFS、WEB1、WEB2: #yum install nfs-utils -y WEB1、WEB2: #yum install httpd -y 二、配置 NFS: #…

    2017-04-27