> For the complete documentation index, see [llms.txt](https://newptone.gitbook.io/deployopenstackwithpuppet/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://newptone.gitbook.io/deployopenstackwithpuppet/openstack_modules/puppet-designate.md).

# puppet-designate

1. [DNS基础知识](https://newptone.gitbook.io/deployopenstackwithpuppet/openstack_modules/pages/-LeYyoQ3gWw4IvzTDnNV##DNS)
2. [快速了解designate](https://newptone.gitbook.io/deployopenstackwithpuppet/openstack_modules/pages/-LeYyoQ3gWw4IvzTDnNV##基础知识)
3. [先睹为快—一言不合，立马动手？](https://newptone.gitbook.io/deployopenstackwithpuppet/openstack_modules/pages/-LeYyoQ3gWw4IvzTDnNV##先睹为快)
4. [核心代码－如何管理designate服务](https://newptone.gitbook.io/deployopenstackwithpuppet/openstack_modules/pages/-LeYyoQ3gWw4IvzTDnNV##核心代码讲解)
5. [designate原理](https://newptone.gitbook.io/deployopenstackwithpuppet/openstack_modules/pages/-LeYyoQ3gWw4IvzTDnNV##Designate原理)
6. [designate使用场景](https://newptone.gitbook.io/deployopenstackwithpuppet/openstack_modules/pages/-LeYyoQ3gWw4IvzTDnNV##使用场景)
7. [小结](https://newptone.gitbook.io/deployopenstackwithpuppet/openstack_modules/pages/-LeYyoQ3gWw4IvzTDnNV##小结)
8. [动手练习](https://newptone.gitbook.io/deployopenstackwithpuppet/openstack_modules/pages/-LeYyoQ3gWw4IvzTDnNV##动手练习)

**本节作者：薛飞扬**

**阅读级别：选读**

**建议阅读时间 2小时**

## DNS

想要搞懂Designate项目，没有正确的DNS姿势怎么行？所以先别急，我们先来聊一聊DNS的那些事。

### DNS简介

DNS的全称是Domain Name System，负责主机名和互联网络地址之间的映射。在我们上网或者发送电子邮件的时候，一般都会使用主机名而不是IP地址，因为前者便于我们记忆，但是对于计算机来讲，TCP/IP网络中要求每一个互连的计算机都具有其唯一的IP地址，并基于这个IP地址进行通信。DNS能够帮助我们将主机名转换成具体的IP地址。从而完成主机之间的通信。

### DNS层级结构

DNS是一个层级的分布式的数据库，以C/S架构工作，它将互联网名称（域名）和IP地址的对应关系记录下来，可以为客户端提供名称解析的功能。它允许对整个数据库的各个部分进行本地控制，借助备份和缓存机制，DNS将具有足够的强壮性。

DNS数据库以层级的树状结构组织，最顶级的服务器被称为「根」（root），以 . 表示，它是所有子树的根。root将自己划分为多个子域（subdomain），这些子域包括com，net，org，gov，net等等，这些子域被称为顶级域（Top Level Domain, TDL）。再进一步，各顶级域再将自己划分成多个子域，子域还可以在划分子域，最后树的叶子节点就是某个域的主机名。整个结构如下图所示： ![](/files/-LeYyu-B0nCZ62-n94PR) 每个域的名称服务器仅负责本域内的主机的名称解析，如果需要解析子域的主机，就需要再向其子域的名称服务器查询。这样一来，无论主机在哪个域内，都可以从根开始一级一级的找到负责解析此主机名称的域，然后完成域名解析。

### BIND DNS 服务器

BIND是由Berkely大学研发的一款开源DNS服务器程序，它是目前世界上使用最为广泛的DNS服务器软件,支持各种unix平台和windows平台。在CentOS系统中，由bind软件包提供安装。

Bind的两个配置文件：

* /etc/named.conf：主要规范主机的设定、zone file 的所在、权限的设定等； &#x20;

  主要配置如下：

```
options {
        listen-on port 53 { 127.0.0.1; };  //定义DNS监听在哪个IP的特定端口上
        directory "/var/named";  //指定DNS区域文件存放目录
        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";  //默认内存使用统计文件
        allow-query { any; };  //定义允许哪些主机可以查询本地的DNS服务
        recursion no;  //定义是否允许DNS服务器做递归查询
};
```

* 正反解资料库档案(zone file)：/var/named/目录下，一个zone file由多条资源记录组成。 &#x20;

```
$TTL 1D
@       IN SOA  LinuxMaster.test.com.  admin.test.com. (
                                        2016092605      ; serial
                                        21600           ; refresh
                                        3600            ; retry
                                        604800          ; expire
                                        86400 )         ; minimum
        IN NS   LinuxMaster
```

### DNS服务器类型

| 服务器类型    | 作用                             |
| -------- | ------------------------------ |
| 缓存服务器    | 不负责解析，仅为加速，不需要注册               |
| 主DNS服务器  | 负责解析本地客户端请求                    |
| 辅助DNS服务器 | 辅助服务器的区域数据都是从主服务器复制而来，其数据都是只读的 |

缓存服务器需要配置：

```
 options {
        forward only;                     //所有请求转发到forwarders列表
        forwarders {                     
                8.8.8.8;8.8.4.4;          //定义转发请求目的IP            
        };
};
```

Master DNS服务器需要配置：

```
 zone "test.com" IN {
        type master;
        file "test.com.zone";
};
```

Slave DNS服务器需要配置：

```
 zone "test.com" IN {
        type slave;
        masters {ip;};
        file "slaves/test.com.zone";
};
```

Slave必须要与Master相互搭配，当要修改一条记录时，只要手动更改Master那部机器的zone file，重新启动BIND这个服务后（或者等待一定时间），slave会自动同步这条更改的记录。 基本上，不论Master 还是Slave 的资料库，都会有一个代表该资料库新旧的『序号』，这个序号数值的大小，会影响是否要更新的动作。至于更新的方式主要有两种：

* Master主动告知：例如在Master在修改了资料库内容，并且加大资料库序号后，重新启动DNS服务，那master会主动告知slave来更新资料库，此时就能够达成资料同步；
* 由Slave主动提出要求：基本上， Slave会定时的向Master察看资料库的序号，当发现Master资料库的序号比Slave自己的序号还要大(代表比较新)，那么Slave就会开始更新。如果序号不变，那么就判断资料库没有更动，因此不会进行同步更新。

### DNS资源记录类型

资源记录： 标准的资源记录具有其基本格式：\[name] \[ttl] IN type rdata

| 类型    | 含义                                    |
| ----- | ------------------------------------- |
| IN    | 此字段用于将当前记录标识为一个INTERNET的DNS资源记录       |
| type  | 类型字段，用于标识当前资源记录的类型                    |
| rdata | 用于描述资源的信息且长度可变的必要字段，随CLASS和TYPE的变化而变化 |

每个区域数据库文件都是由资源记录构成的。type的值主要有：SOA记录、NS记录、A记录、CNAME记录、MX记录和PTR记录。

| 资源记录类型      | 描述                                                                                                                    | 一句话描述                 |
| ----------- | --------------------------------------------------------------------------------------------------------------------- | --------------------- |
| 起始授权结构（SOA） | 用于一个区域的开始，SOA记录后的所有信息均是用于控制这个区域的，每个区域数据库文件都必须包含一个SOA记录，并且必须是其中的第一个资源记录，用以标识DNS服务器管理的起始位置，SOA说明能解析这个区域的dns服务器中哪个是主服务器。 | 指出当前区域内谁是主DNS服务器      |
| 主机（A）       | 即是A记录，也称为主机记录，是DNS名称到IP地址的映射，用于正向解析。                                                                                  | 将域名FQND映射到IP  正向解析    |
| 别名（CNAME）   | CNAME记录，也是别名记录，用于定义A记录的别名。                                                                                            | 将A记录指向的域名指向另外一个域名     |
| 邮件交换器（MX）   | 邮件交换器记录，用于告知邮件服务器进程将邮件发送到指定的另一台邮件服务器。（该服务器知道如何将邮件传送到最终目的地）。                                                           | 指出当前区域内 SMTP邮件服务器IP   |
| 名称服务器（NS）   | NS记录，用于标识区域的DNS服务器，即是说负责此DNS区域的权威名称服务器，用哪一台DNS服务器来解析该区域。一个区域有可能有多条ns记录，例如zz.com有可能有一个主服务器和多个辅助服务器。                    | 指出当前区域内有几个DNS服务器在提供服务 |
| 反向解析(PRT)   | 是IP地址到DNS名称的映射，用于反向解析。                                                                                                | 将IP解析为域名FQDN          |

### DNS客户端

dig是Linux下常用的DNS查询工具，在CentOS系统中，由bind-utils软件包提供，它的使用方法为：

dig -t RRT NAME \[@NAME\_SERVER]

其中，RRT表示资源记录类型，NAME表示查询的地址，@NAME\_SERVER可以指定DNS服务器，如果不指定则使用操作系统默认的DNS服务器。

例如，查询www\.kernel.org的IP地址：

```
dig -t A www.kernel.org @114.114.114.114                                             

; <<>> DiG 9.8.3-P1 <<>> -t A www.kernel.org @114.114.114.114
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55431
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.kernel.org.            IN    A

;; ANSWER SECTION:
www.kernel.org.        36    IN    CNAME    pub.all.kernel.org.
pub.all.kernel.org.    36    IN    A    149.20.4.69
pub.all.kernel.org.    36    IN    A    198.145.20.140
pub.all.kernel.org.    36    IN    A    199.204.44.194

;; Query time: 28 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: Tue Feb  7 11:15:11 2017
;; MSG SIZE  rcvd: 102
```

## 基础知识

### Designate介绍

Designate是OpenStack的DNSaaS组件，它为OpenStack提供了以下服务：

* 域和备案管理的REST API&#x20;
* 多租户
* 集成了Keystone认证
* 在框架中整合了Nova和Neutron通知（自动生成相应记录）
* 支持PowerDNS和Bind9开箱

Designate的架构图如下：

![](/files/-LeYyu-FE_428_eMaCTd)

| 包含的服务                  | 简介                                                                                                                                                      |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| designate-api          | 接收来自远端用户的HTTP/HTTPS请求，通过Keystone验证远端用户的合法性，将HTTP/HTTPS请求传递给Central模块。                                                                                   |
| designate-central      | 业务逻辑处理核心。响应API请求以及处理Sink所监听到的来自Nova和Neutron的特定通知事件。同时会存取数据库，对业务逻辑处理所产生的数据进行持久化存储。                                                                       |
| designate-mdns         | 实现了标准的DNS Notify和Zone Transfer的处理。                                                                                                                      |
| designate-pool-manager | 连接后端驱动，管理DNS服务器池，与MiniDNS配合同步DNS服务器的域名以及资源记录等数据。                                                                                                        |
| designate-sink         | 监听来自Nova和Neutron的某些事件，用于自动生成域名资源记录，比如当监听到Nova的compute.instance.create.end事件通知后，自动创建一条对应于刚创建的实例的A记录；当监听到Nuetron的floatingip.update.end事件通知后，自动更新一条相应的A记录。 |

### DNS服务器的池划管理

Designate kilo版本所引入的pool manager机制将DNS服务器群划分成多个服务器池（pool），如下图所示，每个服务器池可以配置包含1台或多台DNS服务器。而且，池中的DNS服务器选型还可以不同，也就是说在一个服务器池中，可以有1台BIND服务器，还可以有1台PowerDNS服务器，这是完全支持的。

![](/files/-LeYyu-HMlb--z8v0qBZ)

服务器池的引入目的：

1. 细化域名托管的颗粒度。用户请求托管的域名可以委派到某一个服务器池，而不需要在所有服务器上管理用户的域名和资源记录，降低了管理和运维的复杂度。例如，abc.com委派给pool 1的DNS服务器来管理，xyz.com委派到pool N的DNS服务器来管理。
2. 每个服务器池可以包含多台DNS服务器，实现了高可用性和冗余备份。
3. 服务器池的划分不受地域的限制，可以将分布在不同地域的DNS服务器划归到同一个池中，通过GLB和anycast路由技术可以实现就近DNS查询和负载均衡，加快DNS查询速度。

官方文档上给了一个多个池的使用场景：

The idea is that we’ll configure our pools to support different usage levels. We’ll define a gold and standard level and put zones in each based on the tenant.

Our gold level will provide 6 nameservers that users have access to where our standard will only provide 2. Both pools will have one master target we write to. 即通过配置不同的池来支持不同的用户等级。

黄金等级的池提供六个nameservers ，而标准等级的池只提供两个。

在mitaka版本，实现了CLI的方法来更新池,即通过创建一个yaml文件来定义池,然后通过desigante-manage来更新池，在后面的designate原理部分，贴出了一个yaml，仅供参考。

## 先赌为快

在讲解designate模块之前让我们先使用puppet把我们的实验环境部署起来,请根据你的具体环境修改learn\_designate.pp

```
 include '::rabbitmq'

 include '::mysql::server'

＃创建database和user
 class {'::designate::db::mysql':

   password => $designate_db_password,

 }
＃创建designate group 和user,安装openstack-designate-common包,修改配置文件中rabbitmq的相关内容
 class {'::designate':

   rabbit_host     => $rabbit_host,

   rabbit_userid   => $rabbit_userid,

   rabbit_password => $rabbit_password,

 }

 include '::designate::dns'

 ＃配置designate的后端DNS服务器为bind9，安装bind9包，运行named服务，更改rndc的相关配置

 include '::designate::backend::bind9'

 class {'::designate::db':

   database_connection => "mysql://designate:${designate_db_password}@${db_host}/designate"

 }

 ＃populate designate database 

 include '::designate::db::sync'

＃下面四个class对应desigante的api,central,mdns,pool-manager四个服务

 class {'::designate::api':

   auth_strategy => $auth_strategy,

 }

 class {'::designate::central':

   backend_driver => $backend_driver,

 }

 include '::designate::mdns'

 class {'::designate::pool_manager': 

   pool_id => $pool_id, 

 }
```

在终端执行以下命令:

```
puppet apply -v learn_designate.pp
```

ok，接下来快创建一个domain试试吧。

```bash
designate domain-create --name example.com. --email root@example.com

designate domain-list
```

## 核心代码讲解

### backend

Designate backend支持如BIND，PowerDNS等多种类型的DNS服务器，下面只以BIND为例来讲解

Designate backend如果使用应用最为广泛的bind，designate会利用RNDC指令来管理DNS伺服器，所以需要更改rndc的相关配置

```
class designate::backend::bind9 (

 $rndc_host = '127.0.0.1',

 $rndc_port = '953',

 $rndc_config_file = '/etc/rndc.conf',

 $rndc_key_file = '/etc/rndc.key'

) {

 include ::designate
＃安装bind相关的包，更改bind相关配置项
 include ::dns

＃配置rndc监听的host,port,config和key的目录
 designate_config {

 'backend:bind9/rndc_host' : value => $rndc_host;

 'backend:bind9/rndc_port' : value => $rndc_port;

 'backend:bind9/rndc_config_file' : value => $rndc_config_file;

 'backend:bind9/rndc_key_file' : value => $rndc_key_file;

 }


＃更改named.conf(或者named.options)文件，允许创建新的zone
 concat::fragment { 'dns allow-new-zones':

 target => $::dns::optionspath,

 content => 'allow-new-zones yes;',

 order => '20',

 }

}
```

puppet-designate的安装简单来说做了三件事：

* 后端DNS服务器的安装和配置，这一点上面已经有过讲解
* designate相关软件包的安装

```
package { 'designate-common':

 ensure => $package_ensure,

 name => $common_package_name,

 tag => ['openstack', 'designate-package'],

 }

designate::generic_service { 'api':

 enabled => $enabled,

 manage_service => $service_ensure,

 ensure_package => $package_ensure,

 package_name => $api_package_name,

 service_name => $::designate::params::api_service_name,

 }
...
```

* desingate配置文件的管理

  除了权限的相关配置，其它的配置项都在/etc/designate/designate.conf中

  \[oslo\_messaging\_rabbit]下面是rabbitmq的相关参数，由class designate管理：

```
designate_config {

 'oslo_messaging_rabbit/rabbit_userid' : value => $rabbit_userid;

 'oslo_messaging_rabbit/rabbit_password' : value => $rabbit_password, secret => true;

 'oslo_messaging_rabbit/rabbit_virtual_host' : value => $rabbit_virtual_host_real;

 'oslo_messaging_rabbit/rabbit_use_ssl' : value => $rabbit_use_ssl;

 'oslo_messaging_rabbit/kombu_ssl_ca_certs' : value => $kombu_ssl_ca_certs;

 'oslo_messaging_rabbit/kombu_ssl_certfile' : value => $kombu_ssl_certfile;

 'oslo_messaging_rabbit/kombu_ssl_keyfile' : value => $kombu_ssl_keyfile;

 'oslo_messaging_rabbit/kombu_ssl_version' : value => $kombu_ssl_version;

 'oslo_messaging_rabbit/kombu_reconnect_delay' : value => $kombu_reconnect_delay;

 }
```

［service:api］ \[service:central] \[serivce:mdns] \[service:pool\_manager] 中的配置项分别由class designate::api designate::central designate::mdns designate::manager管理

## designate原理

此处以具体的环境为例来介绍designate的原理 实验环境：

* 系统为centos7.2
* designate-api, designate-central, designate-pool-manager, designate-mdns, rabbitmq, mysql, keystone 均部署在10.0.2.250
* bind分别部署在10.0.2.250 10.0.2.249

下面贴出pools.yaml的配置：

```
- also_notifies:
  - host: 10.0.2.249
    port: 53
  attributes: {}
  description: Pool built from configuration on localhost
  id: 794ccc2c-d751-44fe-b57f-8894c9f5c842
  nameservers:
  - host: 10.0.2.250
    port: 53
  - host: 10.0.2.249
    port: 53
  ns_records:
  - hostname: server-250.2.stage.polex.io.
    priority: 1
  - hostname: server-249.2.stage.polex.io.
    priority: 2
  targets:
  - masters:
    - host: 10.0.2.250
      port: 5354
    options:
      rndc_config_file: /etc/rndc.conf
      rndc_host: 127.0.0.1
      rndc_key_file: /etc/rndc.key
      rndc_port: '953'
    type: bind9
  - masters:
    - host: 10.0.2.250
      port: 5354
    options:
      rndc_config_file: /etc/rndc.conf
      rndc_host: 10.0.2.249
      rndc_key_file: /etc/rndc.key
      rndc_port: '953'
    type: bind9
```

Designate工作流程：

* 用户请求designate-api,添加record或者domain &#x20;
* designate-api发送请求至mq中 &#x20;
* designate-central接收到mq请求,写入db,同时通过mq触发pool\_manager进行更新操作 &#x20;
* pool\_manager通过rndc(addzone/delzone/notifyzone)三个操作来通知pool\_targets中定义的bind来进行操作 &#x20;
* bind使用axfr来请求同步mdns &#x20;
* mdns从数据库中读取相应的domain信息来响应axfr请求

### Target vs. Nameserver

当通过designate 增加／修改／删除记录时，会通过target 去write changes。\
当dns客户端去查询记录时，则会通过nameserver.\
以本次实验环境为例，当通过designate创建一个名为example.com的domain时，按照上面的pool.yaml配置，相当于执行了这两条命令：

```
rndc -s 127.0.0.1 -p 953 -c /etc/rndc.conf -k /etc/rndc.key addzone example.com '{ type slave; masters { 10.0.2.250 port 5354; }; file "slave.example.com.75c9e003-a8f4-4771-a94e-4481ee019f1f"; };'
rndc -s 10.0.2.249 -p 953 -c /etc/rndc.conf -k /etc/rndc.key addzone example.com '{ type slave; masters { 10.0.2.250 port 5354; }; file "slave.example.com.75c9e003-a8f4-4771-a94e-4481ee019f1f"; };'
```

可以看到这些配置项都是在target中定义的。 一个要解析的域名就是一个zone,一个zone对应/var/named/目录下的一个zone\_file.在250和249机器上，都能找到新创建的这个文件：

```
[root@server-250.2.stage.polex.io named ]$ ll
total 32
-rw-r--r--. 1 named named  544 Nov  3 17:50 3bf305731dd26307.nzf
drwxrwx---. 3 named named   70 Nov  3 17:35 data
drwxrwx---. 2 named named   58 Nov  4 16:32 dynamic
-rw-r-----. 1 root  named 2076 Jan 28  2013 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
drwxr-x---. 2 root  named    6 Oct 19 14:03 puppetstore
-rw-r--r--. 1 named named  409 Nov  4 19:12 slave.example.com.75c9e003-a8f4-4771-a94e-4481ee019f1f
drwxrwx---. 2 named named    6 Mar 16  2016 slaves
```

通过dig 查询创建的server1.example.com记录时，返回信息为：

```
[root@server-250.2.stage.polex.io ~ ]$ dig server1.example.com @10.0.2.250

; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.3 <<>> server1.example.com @10.0.2.250
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31922
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;server1.example.com.        IN    A

;; ANSWER SECTION:
server1.example.com.    3600    IN    A    1.2.3.4

;; AUTHORITY SECTION:
example.com.        3600    IN    NS    server-249.2.stage.polex.io.
example.com.        3600    IN    NS    server-250.2.stage.polex.io.

;; Query time: 0 msec
;; SERVER: 10.0.2.250#53(10.0.2.250)
;; WHEN: Fri Nov 04 18:45:55 CST 2016
;; MSG SIZE  rcvd: 130
```

### Hidden Master

前面有提到过，当我们创建一个名为example.com的domain时，执行的rndc命令都指定master host：10.0.2.250， port:5354 在designate.conf的定义中，我们可以看到：

```
[service:mdns]
threads = 1000
host = 0.0.0.0
port = 5354
tcp_backlog = 100
tcp_recv_timeout = 0.5
query_enforce_tsig = False
```

5354是service designate-mdns监听的端口。 所以说，250，249两台机器上的bind都是使用axfr来请求同步mdns，它们的记录都是同步过来的（所以某种意义上讲，它们都是slave节点）。 这样的好处就是，如果250，249有公网ip,它的53接口能被访问，那么它的记录是不能通过外网来更改的（外网只能查询），对于dns记录的更改只能通过内网（10.0.2.250）designate api的方式。

## 使用场景

### 解析私有域名

```
＃创建一个domain
designate domain-create --name example03.com. --email root@example.com
＃创建一条记录
designate record-create --name server1.example03.com. --type A --data 1.2.3.4 ec5818c9-c9ca-4bd2-8ad4-4a964a39a24b
＃使用dig测试
[root@server-250.2.stage.polex.io named ]$ dig @10.0.2.250 server1.example03.com

; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.3 <<>> @10.0.2.250 server1.example03.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51643
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;server1.example03.com.        IN    A

;; ANSWER SECTION:
server1.example03.com.    3600    IN    A    1.2.3.4

;; AUTHORITY SECTION:
example03.com.        3600    IN    NS    server-250.2.stage.polex.io.
example03.com.        3600    IN    NS    server-249.2.stage.polex.io.

;; Query time: 0 msec
;; SERVER: 10.0.2.250#53(10.0.2.250)
;; WHEN: Fri Nov 04 19:20:58 CST 2016
;; MSG SIZE  rcvd: 132
```

### 与nova和neutron集成

designate-sink 通过nova handler 和 neutron handler，自动生成域名资源记录，比如当监听到Nova的compute.instance.create.end事件通知后，自动创建一条对应于刚创建的实例的A记录；当监听到Nuetron的floatingip.update.end事件通知后，自动更新一条相应的A记录。 一个domain如下：

```
designate record-list 98775b46-c868-4dd8-94fd-6bd789a5dbaa
+--------------------------------------+------+-----------------+-------------------------------------------------------------------------+
| id                                   | type | name            | data                                                                           |
+--------------------------------------+------+-----------------+--------------------------------------------------------------------------------+
| e61e814f-5bd4-4de8-9c11-5c87fe1b2799 | SOA  | bluesky.edu.au. | hurricane109.in.vpac.org. hostmaster.v3.org.au. 1412735313 3600 600 86400 3600 |
+--------------------------------------+------+-----------------+--------------------------------------------------------------------------------+
```

当创建一个虚拟机后，自动创建一条A记录：

```
designate record-list 98775b46-c868-4dd8-94fd-6bd789a5dbaa
+--------------------------------------+------+------------------------+--------------------------------------------------------------------------------+
| id                                   | type | name                   | data                                                                           |
+--------------------------------------+------+------------------------+--------------------------------------------------------------------------------+
| 680eb3f5-016f-45a3-ac34-e79ff46bf8df | SOA  | bluesky.edu.au.        | hurricane109.in.vpac.org. hostmaster.v3.org.au. 1412739659 3600 600 86400 3600 |
| c66481bd-bd4f-4f90-976a-67b6654c4c60 | A    | phobos.bluesky.edu.au. | 10.0.0.7                                                                       |
+--------------------------------------+------+------------------------+--------------------------------------------------------------------------------+
```

## 小结

puppet-designate需要配置的文件仅有designate.conf，为了方便管理与配置，puppet把使用到的四个服务都分别写为了一个.pp的类，这样也方便我们管理这些配置项。这里讲解到功能没有涉及到跟nova，neutron的集成，集成之后的效果是当创建虚拟机或创建浮动IP后，创建的虚拟机或浮动ip的A记录记录会自动同步相应的zone 中 ，有兴趣的同学可以在官网查看。

## 动手练习

1.部署分布式的backend后端，并使用不同的DNS Server（BIND,PowerDNS,MysqlBIND）作存储后端。

2.手动配置多个pool,不同的pool管理的各自的DNS Server(通过创建yaml文件，使用designate-manage命令实现)。

3.安装designate-sink服务，修改nova.conf和neutron.conf相应配置，创建虚拟机或floating ip ，观察designate record的变化。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://newptone.gitbook.io/deployopenstackwithpuppet/openstack_modules/puppet-designate.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
