Commit d47c70ef by root

Se establece la primera versión estable de la receta de DNS basada en el…

Se establece la primera versión estable de la receta de DNS basada en el software bind para Kit de Servicios. Sus tareas permiten automatizar los procesos de: instalación y configuración de un servidor de nombres bind; actualización de zona mediante incorporación de registros de recursos de tipo NS, MX, A, AAAA y CNAME; y desinstalación del servicio. El diseño inicial de esta receta fue apoyado en los productos liberados por René Moser.
parent ad1a3bc3
File mode changed from 100644 to 100755
This diff is collapsed. Click to expand it.
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
instalacion:
dominio:
name: Nombre de dominio de la institución
default: institucion.gob.ve
description: Nombre de dominio de la institución
type: string
ns:
name: Nombre del primer servidor de nombre
default: ns.{{ dominio }}
description: Nombre del primer servidor de nombre
type: string
ipv4_ns:
name: Direccion IPv4 del primer servidor de nombre
default: ""
description: Direccion IPv4 del primer servidor de nombre
type: string
ipv6_ns:
name: Direccion IPv6 del primer servidor de nombre
default: ""
description: Direccion IPv6 del primer servidor de nombre
type: string
mx:
name: Nombre del servidor de correo asociado al dominio
default: correo.{{ dominio }}
description: Nombre del servidor de correo asociado al dominio
type: string
ip_mx:
name: Direccion IPv4 del servidor de correo
default: ""
description: Direccion IPv4 del servidor de correo
type: string
actualizacion:
dominio:
name: Nombre de dominio de la institución
default: institucion.gob.ve
description: Nombre de dominio de la institución
type: string
ns:
name: Nombre del primer servidor de nombre
default: ns.{{ dominio }}
description: Nombre del primer servidor de nombre
type: string
ipv4_ns:
name: Direccion IPv4 del primer servidor de nombre
default: ""
description: Direccion IPv4 del primer servidor de nombre
type: string
ipv6_ns:
name: Direccion IPv6 del primer servidor de nombre
default: ""
description: Direccion IPv6 del primer servidor de nombre
type: string
mx:
name: Nombre del servidor de correo asociado al dominio
default: correo.{{ dominio }}
description: Nombre del servidor de correo asociado al dominio
type: string
ip_mx:
name: Direccion IPv4 del servidor de correo
default: ""
description: Direccion IPv4 del servidor de correo
type: string
---
bind_service_state: started
bind_service_enabled: yes
bind_pkg_state: installed
ruta_zonas_dns: "/var/lib/bind/zonas"
ruta_log_bind: "/var/log/bind"
ruta_zonas_maestras: "maestras"
ruta_zonas_esclavas: "esclavas"
configuracion_bind_listen_on: any
configuracion_bind_allow_query: []
configuracion_bind_recursion: "no"
# Estas variables serán usadas en versiones ulteriores de la receta KDS
bind_config_master_zones: []
bind_config_master_allow_transfer: []
bind_config_master_forwarders: []
bind_config_recursion: "no"
bind_config_slave_zones: []
bind_config_forward_zones: []
bind_service_state: started
bind_service_enabled: yes
bind_pkg_state: installed
bind_base_zones_path: "/var/lib/bind"
bind_masterzones_path: "masters"
bind_slavezones_path: "slaves"
bind_config_listen_on: any
bind_config_allow_query: []
$TTL 4h
$ORIGIN {{ dominio }}.
@ IN SOA {{ ns }}.{{ dominio }}. administrador.{{ dominio }}. (
{{ serial }} ; serial de la zona
1d ; refrescamiento de los DNS esclavos (1 día)
2h ; tiempo en que un DNS esclavo reintentará en caso de un problema (2 horas)
2w ; tiempo de expiración de DNS esclavos (2 semanas)
2d ; mínimo tiempo para caché en caso de búsquedas fallidas (2 días)
)
; registros esenciales
@ IN NS {{ ns }}
{{ ns }} IN A {{ ipv4_ns }}
{{ ns }} IN AAAA {{ ipv6_ns }}
{{ ruta_log_bind }}/bind.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 {{ usuario_bind }} {{ grupo_bind }}
postrotate
/usr/sbin/invoke-rc.d bind9 reload > /dev/null
endscript
}
$TTL 4h
$ORIGIN example.com.
@ IN SOA ns1.example.com. hostmaster.example.com. (
2013092801 ; Serial
1d ; slave refresh (1 day)
2h ; slave retry time in case of a problem (2 hours)
2w ; slave expiration time (2 weeks)
2d ; minimum caching time in case of failed lookups (2 days)
)
IN NS ns1.example.com.
www IN A 127.0.0.1
......@@ -6,8 +6,20 @@
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local
// configuracion de opciones del servicio bind
include "/etc/bind/named.conf.options";
// TSIG key used for the dynamic update
include "/etc/bind/rndc.key";
// Configure the communication channel for Administrative BIND9 with rndc
// By default, they key is in the rndc.key file and is used by rndc and bind9
// on the localhost
controls {
inet 127.0.0.1 port 953 allow { 127.0.0.1; };
};
// prime the server with knowledge of the root servers
zone "." {
type hint;
......@@ -37,7 +49,11 @@ zone "255.in-addr.arpa" {
file "/etc/bind/db.255";
};
// configuracion del servicio bind
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.local.master";
include "/etc/bind/named.conf.local.slave";
include "/etc/bind/named.conf.local.forward";
// configuracion de zonas maestras
include "/etc/bind/named.conf.local.maestra";
// configuracion del registro de eventos
include "/etc/bind/named.conf.log";
---
#Variables para dns
#Variable de los dominios de los servidores dns y servidor de correo
server_domain: domain.com
server_mail: mail.domain.com
server_reverso: reverso
#Variable de los nombres de los servidores dns, servidor de correo y tres servidores extra
name_server_domain: domain
name_server_mail: mail
name_server1: caracas
#Variable de las IP de los servidores dns, servidor de correo y tres servidores extra
server_ip_ns: 127.0.0.1
server_ip_mail: 127.0.0.4
server_ip_1: 127.0.0.5
#Variable action que permite realizar la tarea
action: ""
#!/bin/bash
# Proposito: con este script deseamos proveer una herramienta para probar
# el funcionamiento de la receta de Kit de Servicios de DNS.
# Autor: Joaquin Muñoz Lucavechi
echo "El objetivo de este script es asistir en la configuración del nombre\n \
de dominio institucional y el servicio de resolución de ese nombre de dominio\n \
a escala global.\n \
Para ello, primero estableceremos el nombre de dominio institucional y así\n \
comenzar a definir el archivo de zona DNS. Seguidamente pasaremos a configurar\n \
el (primer) servidor de nombre de la zona DNS con lo cual se hace operativa\n \
la resolución de nombres."
echo "Introduzca el nombre de dominio de su institucion [por ejemplo: institucion.gob.ve]:"
read dominio
echo "Vamos a configurar el primer servidor de nombre de la zona ${dominio}."
echo "Introduzca el nombre de servidor de DNS que desea configurar inicialmente\n \
[por ejemplo: ns]:"
read nombre
echo "Introduzca el número de IPv4 del servidor de nombre \'${nombre} [por ejemplo: 192.168.1.53]:"\n \
read ipv4
echo
import fileinput
import re
for line in fileinput.input():
#line = re.sub('ns +IN +A +192\.168\.1\.53','bar', line.rstrip())
#line = re.sub('?=(a in ns .)\1MAS\1MASMAS|','MATCH', line.rstrip()
line = re.match("(?('kj')A|B)",line.rstrip())
#print(line.group(1) or line.group(2))
print(line)
\ No newline at end of file
import fileinput
import re
for line in fileinput.input():
#line = re.sub('ns +IN +A +192\.168\.1\.53','bar', line.rstrip())
#line = re.sub('?=(a in ns .)\1MAS\1MASMAS|','MATCH', line.rstrip()
line = re.match("(?(kj)A|B)",line.rstrip())
#print(line.group(1) or line.group(2))
print(line)
\ No newline at end of file
; ns
a
a
b
; aaaa
kj
jk
jk
; mx
correo
\ No newline at end of file
; ns
a
a
b
; aaaa
kj
jk
jk
; mx
correo
$TTL 4h
$ORIGIN institucion.gob.ve.
@ IN SOA ns.institucion.gob.ve. administrador.institucion.gob.ve. (
2016120401 ; serial de la zona
1d ; refrescamiento de los DNS esclavos (1 día)
2h ; tiempo en que un DNS esclavo reintentará en caso de un problema (2 horas)
2w ; tiempo de expiración de DNS esclavos (2 semanas)
2d ; mínimo tiempo para caché en caso de búsquedas fallidas (2 días)
)
; RR tipo NS
@ IN NS ns
; RR tipo MX
; RR tipo A
; RR tipo AAAA
; RR tipo CNAME
---
- name: restart bind
service: name={{ bind_service_name }} state=restarted
- name: reiniciar bind
command: service {{ nombre_servicio }} restart
- name: reload bind
service: name={{ bind_service_name }} state=reloaded
- name: recargar bind
command: service {{ nombre_servicio }} reload
- name: recargar zona
command: rndc reload
---
- name: reiniciar bind
command: service {{ nombre_servicio }} restart
- name: recargar bind
command: service {{ nombre_servicio }} reload
\ No newline at end of file
File mode changed from 100644 to 100755
---
## BLOQUE DE TAREAS DE INSTALACIÓN DEL SERVICIO
- name: Instalación de software bind
apt: pkg={{ item }} state={{ bind_pkg_state }}
with_items: bind_pkgs
when: action == 'Instalar'
- name: Configuración de directorios de zonas DNS
file: dest={{ ruta_zonas_dns }}/{{ item }} state=directory owner={{ usuario_bind }} group={{ grupo_bind }} mode=0755
with_items:
- maestras
- esclavas
when: action == 'Instalar'
- name: Configuración de zona (maestra) DNS
template: src=named.conf.local.{{ item }}.j2 dest={{ ruta_configuracion_base_bind }}/named.conf.local.{{ item }} owner={{ usuario_bind }} group={{ grupo_bind }} mode=0600
with_items:
- maestra
notify: recargar bind
when: action == 'Instalar'
- name: Configuración de bind
copy: src=named.conf dest={{ ruta_configuracion_base_bind }}/named.conf owner={{ usuario_bind }} group={{ grupo_bind }} mode=0600
notify: reiniciar bind
when: action == 'Instalar'
- name: Configuración de opciones de bind
template: src=named.conf.options.j2 dest={{ ruta_configuracion_base_bind }}/named.conf.options owner={{ usuario_bind }} group={{ grupo_bind }} mode=0600
notify: reiniciar bind
when: action == 'Instalar'
- name: Configuración del registro de eventos de bind
template: src=named.conf.log.j2 dest={{ ruta_configuracion_base_bind }}/named.conf.log owner={{ usuario_bind }} group={{ grupo_bind }} mode=0600
notify: reiniciar bind
when: action == 'Instalar'
- name: Configuración para gestionar archivos de eventos de bind
template: src=logrotate.j2 dest=/etc/logrotate.d/bind
notify: reiniciar bind
when: action == 'Instalar'
- name: Configuración de directorio de eventos de bind
file: dest={{ ruta_log_bind }} state=directory owner={{ usuario_bind }} group={{ grupo_bind }} mode=0755
notify: reiniciar bind
when: action == 'Instalar'
- name: Creando primer serial de zona
debug: msg={{ serial }}
when: action == 'Instalar'
- name: Recreación de base de datos bind esencial
template: src=bd.j2 dest={{ ruta_zonas_dns }}/{{ ruta_zonas_maestras }}/{{ dominio }}.bd owner={{ usuario_bind }} group={{ grupo_bind }}
notify: recargar bind
when: action == 'Instalar'
- name: Arrancar el servicio bind
command: service {{ nombre_servicio }} start
when: action == 'Instalar'
## BLOQUE DE TAREAS DE ACTUALIZACIÓN DEL SERVICIO
#regexp: "{{ ns.nombre }}\s+{{ ns.clase }}\s+{{ ns.tipo }}\s+{{ ns.dato }}"
#dest={{ ruta_zonas_dns }}/{{ ruta_zonas_maestras }}/{{ dominio }}.bd
#insertbefore='{{ ns.nombre }}\t\t{{ ns.clase }}\t.*$'
# insertbefore='{{ nombre }}\t\t{{ clase }}\t.*$'
- name: Inserta RR si no existe en zona de DNS
# Nota: mantiene organización del archivo de zona basado, en primer lugar, el tipo de RR, y luego, en la cercanía de las etiquetas
lineinfile:
dest=/zona.test
line='{{ nombre }}\t\t{{ clase }}\t{{ tipo }}\t{{ dato }}'
insertafter='; RR tipo {{ tipo }}$'
state=present
register: zonadns
when: action == 'Actualizar'
#- name: Actualizar serial de zona
# notify: soa
# meta: flush_handlers
# when: action == 'Actualizar' and zonadns.changed == true
#- name: Incrementa version de la zona de DNS
# set_fact: version={{ version | int + 1 }}
# when: action == 'Actualizar' and zonadns.changed == true
#- name: soa
# replace:
# dest=/zona.test
# regexp='(^\s+)\d\d\d\d\d\d\d\d(\d\d)(.*$)'
# replace='\g<1>{{ ansible_date_time.year }}{{ ansible_date_time.month }}{{ ansible_date_time.day }}\g<2>\g<3>'
# when: action == 'Actualizar' and zonadns.changed == true
#- name: Imprime serial de zona actual
# debug: var={{ serial }}
# when: action == 'Actualizar'
- name: Consulta serial de zona actual
command: /bin/sed -nr 's/^.*([0-9]{8})([0-9]{2}).*$/\1\n\2/p' /zona.test
register: soa
when: action == 'Actualizar'
- name: Imprimiendo toda la variable soa
debug: var="{{soa}}"
when: action == 'Actualizar'
#- name: Obteniendo fecha del serial presente en zona de DNS
# set_fact: fechaserial="{{soa.stdout_lines[0]}}"
# when: action == 'Actualizar'
#- name: Obteniendo version del serial presente en zona de DNS
# set_fact: versionserial=soa.stdout_lines[1]
# when: action == 'Actualizar'
#- name: Imprimiendo fecha del serial presente en zona de DNS
# debug: var={{ fechaserial }}
# when: action == 'Actualizar'
- name: Imprimiendo fecha actual
debug: var={{ ansible_date_time.year }}{{ ansible_date_time.month }}{{ ansible_date_time.day }}
when: action == 'Actualizar'
#- name: Imprimiendo version del serial presente en zona de DNS
# debug: var={{ versionserial }}
# when: action == 'Actualizar'
- name: Imprimiendo fecha presente en serial
debug: var="{{soa.stdout_lines[0]}}{{soa.stdout_lines[1]}}"
when: action == 'Actualizar'
- name: Si fechaserial existente es distinto de fecha actual entonces actualiza serial completo
set_fact: nuevoserial='{{ ansible_date_time.year }}{{ ansible_date_time.month }}{{ ansible_date_time.day }}01'
when: action == 'Actualizar' and '{{fechaserial}}' != '{{ ansible_date_time.year }}{{ ansible_date_time.month }}{{ ansible_date_time.day }}' and zonadns.changed == true
- name: Si no entonces actualiza solo version en serial
set_fact: nuevoserial='{{ ansible_date_time.year }}{{ ansible_date_time.month }}{{ ansible_date_time.day }}{{ version | int + 1 }}'
when: action == 'Actualizar' and '{{ ansible_date_time.year }}{{ ansible_date_time.month }}{{ ansible_date_time.day }}' == '{{fechaserial}}' and zonadns.changed == true
- name: Imprimiendo serial resultante
debug: var={{nuevoserial}}
when: action == 'Actualizar'
# A. USAR LA ESTRATEGIA DE REEMPLAZAR EL PATRON CUANDO SEA CONSEGUIDO.
# B. reflexion: esta estrategia no seria suficientemente buena, dado que
# partiendo del principio que todas las actualizaciones son susceptibles
# a un cambio de estado de la zona, entonces cada actualizacion generara
# un serial de zona nuevo, y esto, no representa una solucion con calidad
# Lo que si seria interesante es poder generar, en tiempo real, quiza con
# una combinacion de angular y ansile, es la consulta por el registro que
# se desea actualizar. En caso de estar presente en la zona, advertir al
# usuario.
#- name: Lo que tiene la variable 'existerr'
# debug: var=existerr.changed
# when: action == 'Actualizar'
## BLOQUE DE TAREAS DE DESINSTALACION DEL SERVICIO
- name: detener el servicio bind
command: service bind9 stop
when: action == 'Desinstalar'
- name: eliminación de usuario y grupo bind
command: delgroup {{ bind_group }}
command: deluser {{ bind_user }}
when: action == 'NOOP'
- name: desincorporación del directorio de zonas maestras
file: path={{ bind_base_zones_path }}/{{ item }} state=absent
with_items:
- masters
- slaves
when: action == 'Desinstalar'
- name: desinstalación de los paquetes Debian
apt: pkg={{ item }} state=absent
with_items: bind_pkgs
when: action == 'Desinstalar'
- name: desincorporacion del directorio principal de bind
file: path={{ bind_config_basepath }} state=absent
when: action == 'NOOP'
- name: desincorporación de función para rotación de log
file: path=/etc/logrotate.d/bind state=absent
when: action == 'Desinstalar'
- name: desincorporación del directorio de log
file: path={{ bind_log_basepath }} state=absent
when: action == 'Desinstalar'
## BLOQUE DE TAREAS DE CONSULTA DEL SERVICIO
---
- name: install bind packages
################ #################
## BLOQUE DE TAREAS DE INSTALACIÓN Y ##
## CONFIGURACIÓN DEL SERVICIO BIND ##
################ #################
- name: Instalación de software bind
apt: pkg={{ item }} state={{ bind_pkg_state }}
with_items: bind_pkgs
when: action == 'Instalar'
- name: setup zone directories
file: dest={{ bind_base_zones_path }}/{{ item }} state=directory owner={{ bind_user }} group={{ bind_group }} mode=0755
- name: Configuración de directorios de zonas DNS
file: dest={{ ruta_zonas_dns }}/{{ item }} state=directory owner={{ usuario_bind }} group={{ grupo_bind }} mode=0755
with_items:
- masters
- slaves
- maestras
- esclavas
when: action == 'Instalar'
- name: setup zones
template: src=named.conf.local.{{ item }}.j2 dest={{ bind_config_basepath }}/named.conf.local.{{ item }} owner={{ bind_user }} group={{ bind_group }} mode=0600
- name: Configuración de zona (maestra) DNS
template: src=named.conf.local.{{ item }}.j2 dest={{ ruta_configuracion_base_bind }}/named.conf.local.{{ item }} owner={{ usuario_bind }} group={{ grupo_bind }} mode=0600
with_items:
- master
- slave
- forward
notify: reload bind
- name: configure bind
copy: src=named.conf dest={{ bind_config_basepath }}/named.conf owner={{ bind_user }} group={{ bind_group }} mode=0600
notify: restart bind
- name: configure bind options
template: src=named.conf.options.j2 dest={{ bind_config_basepath }}/named.conf.options owner={{ bind_user }} group={{ bind_group }} mode=0600
notify: restart bind
- name: Copy master zone files
copy: src={{ bind_masterzones_path }}/db.{{ item.name }} dest={{ bind_base_zones_path }}/{{bind_masterzones_path}} owner={{ bind_user }} group={{ bind_group }}
with_items: bind_config_master_zones
notify: reload bind
tags: bind-zones
- name: start/stop bind service
service: name={{ bind_service_name }} state={{ bind_service_state }} enabled={{ bind_service_enabled }}
- maestra
notify: recargar bind
when: action == 'Instalar'
- name: Configuración de bind
copy: src=named.conf dest={{ ruta_configuracion_base_bind }}/named.conf owner={{ usuario_bind }} group={{ grupo_bind }} mode=0600
notify: reiniciar bind
when: action == 'Instalar'
- name: Configuración de opciones de bind
template: src=named.conf.options.j2 dest={{ ruta_configuracion_base_bind }}/named.conf.options owner={{ usuario_bind }} group={{ grupo_bind }} mode=0600
notify: reiniciar bind
when: action == 'Instalar'
- name: Configuración del registro de eventos de bind
template: src=named.conf.log.j2 dest={{ ruta_configuracion_base_bind }}/named.conf.log owner={{ usuario_bind }} group={{ grupo_bind }} mode=0600
notify: reiniciar bind
when: action == 'Instalar'
- name: Configuración para gestionar archivos de eventos de bind
template: src=logrotate.j2 dest=/etc/logrotate.d/bind
notify: reiniciar bind
when: action == 'Instalar'
- name: Configuración de directorio de eventos de bind
file: dest={{ ruta_log_bind }} state=directory owner={{ usuario_bind }} group={{ grupo_bind }} mode=0755
notify: reiniciar bind
when: action == 'Instalar'
- name: Creando primer serial de zona
debug: msg={{ serial }}
when: action == 'Instalar'
- name: Recreación de base de datos bind esencial
template: src=bd.j2 dest={{ ruta_zonas_dns }}/{{ ruta_zonas_maestras }}/{{ dominio }}.bd owner={{ usuario_bind }} group={{ grupo_bind }}
notify: recargar bind
when: action == 'Instalar'
- name: Arrancar el servicio bind
command: service {{ nombre_servicio }} start
when: action == 'Instalar'
################# #####################
## BLOQUE DE TAREAS DE ACTUALIZACIÓN Y ##
## GESTION DE REGISTROS DE RECURSOS (RR) ##
################# #####################
- name: Inserta RR de tipos MX o NS si no existe en zona de DNS
lineinfile:
dest={{ ruta_zonas_dns }}/{{ ruta_zonas_maestras }}/{{ dominio }}.bd
line={{ item.line }}
insertafter={{ item.insertafter }}
state=present
register: zonadns
with_items:
- { line: '@\\t\\t\\t{{ clase }}\\t{{ tipo }}\\t{{ nombre }}', insertafter: ';\ RR\ tipo\ {{ tipo }}$' }
- { line: '{{ nombre }}\\t\\t\\t{{ clase }}\\tA\\t{{ dato }}', insertafter: ';\ RR\ tipo\ A$' }
when: action == 'Actualizar' and ( '{{ tipo }}' == 'MX' or '{{ tipo }}' == 'NS' )
- name: 1. revisa contenido de la variable 'zonadns'
debug: var=zonadns
when: action == 'Actualizar'
- name: Inserta otro tipo de RR (A, AAAA, CNAME) si no existe en zona de DNS
lineinfile:
dest={{ ruta_zonas_dns }}/{{ ruta_zonas_maestras }}/{{ dominio }}.bd
line='{{ nombre }}\t\t\t{{ clase }}\t{{ tipo }}\t{{ dato }}'
insertafter='; RR tipo {{ tipo }}$'
state=present
register: zonadns
when: action == 'Actualizar' and ('{{ tipo }}' != 'MX' and '{{ tipo }}' != 'NS' )
- name: 2. revisa contenido de la variable 'zonadns'
debug: var=zonadns
when: action == 'Actualizar'
- name: Consulta serial de zona actual
command: /bin/sed -nr 's/^.*([0-9]{8})([0-9]{2}).*$/\1\n\2/p' {{ ruta_zonas_dns }}/{{ ruta_zonas_maestras }}/{{ dominio }}.bd
register: soa
when: action == 'Actualizar'
- name: Obteniendo fecha del serial existente en zona de DNS
set_fact: fechaserial="{{soa.stdout_lines[0]}}"
when: action == 'Actualizar'
- name: Obteniendo version del serial existente en zona de DNS
set_fact: versionserial="{{soa.stdout_lines[1]}}"
when: action == 'Actualizar'
- name: Obteniendo fecha actual
set_fact: fechaactual="{{ ansible_date_time.year }}{{ ansible_date_time.month }}{{ ansible_date_time.day }}"
when: action == 'Actualizar'
- name: Si fechaserial existente es distinto de fecha actual entonces actualiza serial completo
set_fact: nuevoserial='{{ fechaactual }}01'
when: action == 'Actualizar' and '{{ fechaserial }}' != '{{ fechaactual }}' and (zonadns.changed or zonadns.skipped)
- name: Si no, si version es menor a 09 actualiza version de la forma 0[2-9]
set_fact: nuevoserial='{{ fechaactual }}0{{ versionserial | int + 1 }}'
when: action == 'Actualizar' and '{{ fechaserial }}' == '{{ fechaactual }}' and {{ versionserial }} < 9 and (zonadns.changed or zonadns.skipped)
- name: Si no, actualiza version de la forma [1-9][0-9]
set_fact: nuevoserial='{{ fechaactual }}{{ versionserial | int + 1 }}'
when: action == 'Actualizar' and '{{ fechaserial }}' == '{{ fechaactual }}' and {{ versionserial }} >= 9 and (zonadns.changed or zonadns.skipped)
- name: Imprimiendo serial resultante
debug: var={{ nuevoserial }}
when: action == 'Actualizar'
- name: 3. revisa contenido de la variable 'zonadns'
debug: var=zonadns
when: action == 'Actualizar'
- name: Actualizando serial
replace:
dest={{ ruta_zonas_dns }}/{{ ruta_zonas_maestras }}/{{ dominio }}.bd
regexp='(^\s+)(\d\d\d\d\d\d\d\d\d\d)(.*$)'
replace='\g<1>{{ nuevoserial }}\g<3>'
when: action == 'Actualizar' and (zonadns.changed or zonadns.skipped)
notify: recargar zona
################# ##################
## BLOQUE DE TAREAS DE DESINSTALACIÓN ##
## DEL SERVICIO ##
################# ##################
- name: Desincorporación del directorio de zonas maestras
file: path={{ ruta_zonas_dns }} state=absent
when: action == 'Desinstalar'
- name: Desinstalación de los paquetes Debian
apt: pkg={{ item }} state=absent
with_items: bind_pkgs
when: action == 'Desinstalar'
- name: Desincorporación de función para rotación de log
file: path=/etc/logrotate.d/bind state=absent
when: action == 'Desinstalar'
- name: desincorporación del directorio de log
file: path={{ ruta_log_bind }} state=absent
when: action == 'Desinstalar'
################# #################
## BLOQUE DE TAREAS DE CONSULTA DEL ##
## SERVICIO ##
################# #################
---
################ #################
## BLOQUE DE TAREAS DE INSTALACIÓN Y ##
## CONFIGURACIÓN DEL SERVICIO BIND ##
################ #################
- name: Instalación de software bind
apt: pkg={{ item }} state={{ bind_pkg_state }}
with_items: bind_pkgs
when: action == 'Instalar'
- name: Configuración de directorios de zonas DNS
file: dest={{ ruta_zonas_dns }}/{{ item }} state=directory owner={{ usuario_bind }} group={{ grupo_bind }} mode=0755
with_items:
- maestras
- esclavas
when: action == 'Instalar'
- name: Configuración de zona (maestra) DNS
template: src=named.conf.local.{{ item }}.j2 dest={{ ruta_configuracion_base_bind }}/named.conf.local.{{ item }} owner={{ usuario_bind }} group={{ grupo_bind }} mode=0600
with_items:
- maestra
notify: recargar bind
when: action == 'Instalar'
- name: Configuración de bind
copy: src=named.conf dest={{ ruta_configuracion_base_bind }}/named.conf owner={{ usuario_bind }} group={{ grupo_bind }} mode=0600
notify: reiniciar bind
when: action == 'Instalar'
- name: Configuración de opciones de bind
template: src=named.conf.options.j2 dest={{ ruta_configuracion_base_bind }}/named.conf.options owner={{ usuario_bind }} group={{ grupo_bind }} mode=0600
notify: reiniciar bind
when: action == 'Instalar'
- name: Configuración del registro de eventos de bind
template: src=named.conf.log.j2 dest={{ ruta_configuracion_base_bind }}/named.conf.log owner={{ usuario_bind }} group={{ grupo_bind }} mode=0600
notify: reiniciar bind
when: action == 'Instalar'
- name: Configuración para gestionar archivos de eventos de bind
template: src=logrotate.j2 dest=/etc/logrotate.d/bind
notify: reiniciar bind
when: action == 'Instalar'
- name: Configuración de directorio de eventos de bind
file: dest={{ ruta_log_bind }} state=directory owner={{ usuario_bind }} group={{ grupo_bind }} mode=0755
notify: reiniciar bind
when: action == 'Instalar'
- name: Creando primer serial de zona
debug: msg={{ serial }}
when: action == 'Instalar'
- name: Recreación de base de datos bind esencial
template: src=bd.j2 dest={{ ruta_zonas_dns }}/{{ ruta_zonas_maestras }}/{{ dominio }}.bd owner={{ usuario_bind }} group={{ grupo_bind }}
notify: recargar bind
when: action == 'Instalar'
- name: Arrancar el servicio bind
command: service {{ nombre_servicio }} start
when: action == 'Instalar'
################# #####################
## BLOQUE DE TAREAS DE ACTUALIZACIÓN Y ##
## GESTION DE REGISTROS DE RECURSOS (RR) ##
################# #####################
- name: Inserta RR de tipos MX o NS si no existe en zona de DNS
lineinfile:
dest={{ ruta_zonas_dns }}/{{ ruta_zonas_maestras }}/{{ dominio }}.bd
line={{ item.line }}
insertafter={{ item.insertafter }}
state=present
register: zonadns
with_items:
- { line: '@\\t\\t\\t{{ clase }}\\t{{ tipo }}\\t{{ nombre }}', insertafter: ';\ RR\ tipo\ {{ tipo }}$' }
- { line: '{{ nombre }}\\t\\t\\t{{ clase }}\\tA\\t{{ dato }}', insertafter: ';\ RR\ tipo\ A$' }
when: action == 'Actualizar' and ( '{{ tipo }}' == 'MX' or '{{ tipo }}' == 'NS' )
- name: 1. revisa contenido de la variable 'zonadns'
debug: var=zonadns
when: action == 'Actualizar'
- name: Inserta otro tipo de RR (A, AAAA, CNAME) si no existe en zona de DNS
lineinfile:
dest={{ ruta_zonas_dns }}/{{ ruta_zonas_maestras }}/{{ dominio }}.bd
line='{{ nombre }}\t\t\t{{ clase }}\t{{ tipo }}\t{{ dato }}'
insertafter='; RR tipo {{ tipo }}$'
state=present
register: zonadns
when: action == 'Actualizar' and ('{{ tipo }}' != 'MX' and '{{ tipo }}' != 'NS' )
- name: 2. revisa contenido de la variable 'zonadns'
debug: var=zonadns
when: action == 'Actualizar'
- name: Consulta serial de zona actual
command: /bin/sed -nr 's/^.*([0-9]{8})([0-9]{2}).*$/\1\n\2/p' {{ ruta_zonas_dns }}/{{ ruta_zonas_maestras }}/{{ dominio }}.bd
register: soa
when: action == 'Actualizar'
- name: Obteniendo fecha del serial existente en zona de DNS
set_fact: fechaserial="{{soa.stdout_lines[0]}}"
when: action == 'Actualizar'
- name: Obteniendo version del serial existente en zona de DNS
set_fact: versionserial="{{soa.stdout_lines[1]}}"
when: action == 'Actualizar'
- name: Obteniendo fecha actual
set_fact: fechaactual="{{ ansible_date_time.year }}{{ ansible_date_time.month }}{{ ansible_date_time.day }}"
when: action == 'Actualizar'
- name: Si fechaserial existente es distinto de fecha actual entonces actualiza serial completo
set_fact: nuevoserial='{{ fechaactual }}01'
when: action == 'Actualizar' and '{{ fechaserial }}' != '{{ fechaactual }}' and (zonadns.changed or zonadns.skipped)
- name: Si no, si version es menor a 09 actualiza version de la forma 0[2-9]
set_fact: nuevoserial='{{ fechaactual }}0{{ versionserial | int + 1 }}'
when: action == 'Actualizar' and '{{ fechaserial }}' == '{{ fechaactual }}' and {{ versionserial }} < 9 and (zonadns.changed or zonadns.skipped)
- name: Si no, actualiza version de la forma [1-9][0-9]
set_fact: nuevoserial='{{ fechaactual }}{{ versionserial | int + 1 }}'
when: action == 'Actualizar' and '{{ fechaserial }}' == '{{ fechaactual }}' and {{ versionserial }} >= 9 and (zonadns.changed or zonadns.skipped)
- name: Imprimiendo serial resultante
debug: var={{ nuevoserial }}
when: action == 'Actualizar'
- name: 3. revisa contenido de la variable 'zonadns'
debug: var=zonadns
when: action == 'Actualizar'
- name: Actualizando serial
replace:
dest={{ ruta_zonas_dns }}/{{ ruta_zonas_maestras }}/{{ dominio }}.bd
regexp='(^\s+)(\d\d\d\d\d\d\d\d\d\d)(.*$)'
replace='\g<1>{{ nuevoserial }}\g<3>'
when: action == 'Actualizar' and (zonadns.changed or zonadns.skipped)
notify: recargar zona
################# ##################
## BLOQUE DE TAREAS DE DESINSTALACIÓN ##
## DEL SERVICIO ##
################# ##################
- name: Desincorporación del directorio de zonas maestras
file: path={{ ruta_zonas_dns }} state=absent
when: action == 'Desinstalar'
- name: Desinstalación de los paquetes Debian
apt: pkg={{ item }} state=absent
with_items: bind_pkgs
when: action == 'Desinstalar'
- name: Desincorporación de función para rotación de log
file: path=/etc/logrotate.d/bind state=absent
when: action == 'Desinstalar'
- name: desincorporación del directorio de log
file: path={{ ruta_log_bind }} state=absent
when: action == 'Desinstalar'
################# #################
## BLOQUE DE TAREAS DE CONSULTA DEL ##
## SERVICIO ##
################# #################
$TTL 4h
$ORIGIN {{ dominio }}.
@ IN SOA {{ ns }}.{{ dominio }}. administrador.{{ dominio }}. (
{{ serial }} ; serial de la zona
1d ; refrescamiento de los DNS esclavos (1 día)
2h ; tiempo en que un DNS esclavo reintentará en caso de un problema (2 horas)
2w ; tiempo de expiración de DNS esclavos (2 semanas)
2d ; mínimo tiempo para caché en caso de búsquedas fallidas (2 días)
)
; registros esenciales
@ IN NS {{ ns }}
{{ ns }} IN A {{ ipv4_ns }}
{{ ns }} IN AAAA {{ ipv6_ns }}
$TTL 4h
$ORIGIN {{ dominio }}.
@ IN SOA {{ ns }}.{{ dominio }}. administrador.{{ dominio }}.(
{{ serial }} ; serial de la zona
1d ; refrescamiento de los DNS esclavos (1 día)
2h ; tiempo en que un DNS esclavo reintentará en caso de un problema (2 horas)
2w ; tiempo de expiración de DNS esclavos (2 semanas)
2d ; mínimo tiempo para caché en caso de búsquedas fallidas (2 días)
)
; RR tipo NS
@ IN NS {{ ns }}
; RR tipo MX
; RR tipo A
{{ ns }} IN A {{ ipv4_ns }}
; RR tipo AAAA
{% if ipv6_ns is not none %}
{{ ns }} IN AAAA {{ ipv6_ns }}
{% endif %}
; RR tipo CNAME
$TTL 4h
$ORIGIN {{ dominio }}.
@ IN SOA {{ ns }}.{{ dominio }}. administrador.{{ dominio }}.(
{{ serial }} ; serial de la zona
1d ; refrescamiento de los DNS esclavos (1 día)
2h ; tiempo en que un DNS esclavo reintentará en caso de un problema (2 horas)
2w ; tiempo de expiración de DNS esclavos (2 semanas)
2d ; mínimo tiempo para caché en caso de búsquedas fallidas (2 días)
)
; RR tipo NS
@ IN NS {{ ns }}
; RR tipo MX
; RR tipo A
{{ ns }} IN A {{ ipv4_ns }}
; RR tipo AAAA
{% if ipv6_ns is not none %}
{{ ns }} IN AAAA {{ ipv6_ns }}
{% endif %}
; RR tipo CNAME
{{ ruta_log_bind }}/bind.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 {{ usuario_bind }} {{ grupo_bind }}
postrotate
/usr/sbin/invoke-rc.d bind9 reload > /dev/null
endscript
}
## {{ ansible_managed }}
{% for fwd_zone in bind_config_forward_zones %}
######## {{ fwd_zone.name }} ({{ fwd_zone.zones|count }} zones)
{% for zone in fwd_zone.zones %}
zone "{{ zone }}" {
type forward;
{% if fwd_zone.forward is defined %}
forward {{ fwd_zone.forward }};
{% else %}
forward only;
{% endif %}
forwarders {
{% for fwder in fwd_zone.forwarders %}
{{ fwder }};
{% endfor %}
};
};
{% endfor %}
{% endfor %}
## {{ ansible_managed }}
zone "{{ dominio }}" {
type master;
file "{{ruta_zonas_dns}}/{{ruta_zonas_maestras}}/{{ dominio }}.bd";
};
## {{ ansible_managed }}
{% for master_zone in bind_config_master_zones %}
zone "{{ master_zone.name }}" {
type master;
file "{{bind_base_zones_path}}/{{bind_masterzones_path}}/db.{{ master_zone.name }}";
{% if master_zone.allow_transfer is defined %}
allow-transfer {
{% for allow_transfer in master_zone.allow_transfer %}
{{ allow_transfer }};
{% endfor %}
};
{% endif %}
{% if master_zone.allow_update is defined %}
allow-update {
{% for allow_update in master_zone.allow_update %}
{{ allow_update }};
{% endfor %}
};
{% endif %}
};
{% endfor %}
## {{ ansible_managed }}
{% for slave_zone in bind_config_slave_zones %}
######## {{ slave_zone.name }} ({{ slave_zone.zones|count }} zones)
{% for zone in slave_zone.zones %}
zone "{{ zone }}" {
type slave;
file "{{bind_base_zones_path}}/{{bind_slavezones_path}}/db.{{ zone }}";
masters {
{% for master in slave_zone.masters %}
{{ master }};
{% endfor %}
};
};
{% endfor %}
{% endfor %}
logging {
channel bind_log {
file "{{ ruta_log_bind }}/bind.log" versions 3 size 5m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default { bind_log; };
category update { bind_log; };
category update-security { bind_log; };
category security { bind_log; };
category queries { bind_log; };
category lame-servers { null; };
};
......@@ -12,53 +12,16 @@ options {
//query-source address * port 53;
query-source address * port *;
transfer-source *;
notify-source *;
allow-transfer {
{% for allow_transfer in bind_config_master_allow_transfer %}
{{ allow_transfer }};
{% endfor %}
};
notify yes;
also-notify {
};
//provide-ixfr no ;
{% if bind_config_master_forwarders %}
// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders.
forwarders {
{% for forwarders in bind_config_master_forwarders %}
{{ forwarders }};
{% endfor %}
};
{% endif %}
//dnssec-enable yes;
//dnssec-validation yes;
auth-nxdomain no; # conform to RFC1035
listen-on { {{ bind_config_listen_on }}; };
listen-on { {{ configuracion_bind_listen_on }}; };
listen-on-v6 { any; };
{% if bind_config_allow_query %}
allow-query {
{% for queries in bind_config_allow_query %}
{{ queries }};
{% endfor %}
};
{% else %}
allow-query { any; }; // This is the default
{% endif %}
recursion {{ bind_config_recursion }}; // Do not provide recursive service
recursion {{ configuracion_bind_recursion }}; // Do not provide recursive service
zone-statistics yes;
};
- hosts: kds
vars:
dominio: {%dominio%}
nombre: {%nombre%}
clase: {%clase%}
tipo: {%tipo%}
dato: {%dato%}
action: 'Actualizar'
roles:
- receta-kds-dns
- hosts: kds
vars:
dominio: institucion.gob.ve
nombre: ju
clase: IN
tipo: CNAME
dato: juliette
action: 'Actualizar'
roles:
- receta-kds-dns
- hosts: kds
vars:
dominio: institucion.gob.ve
nombre: juliette
clase: IN
tipo: NS
dato: 255.255.255.255
action: 'Actualizar'
roles:
- receta-kds-dns
- hosts: kds
vars:
dominio: institucion.gob.ve
action: 'Desinstalar'
roles:
- receta-kds-dns
\ No newline at end of file
- hosts: kds
vars:
dominio: institucion.gob.ve
nombre: ju
clase: IN
tipo: CNAME
dato: juliette
action: 'Actualizar'
roles:
- receta-kds-dns
- hosts: kds
vars:
dominio: institucion.gob.ve
nombre: ju
clase: IN
tipo: CNAME
dato: juliette
action: 'Actualizar'
subaction: 'Eliminar'
roles:
- receta-kds-dns
- hosts: kds
vars:
dominio: institucion.gob.ve
nombre: juliette
clase: IN
tipo: NS
dato: 255.255.255.255
action: 'Actualizar'
subaction: 'Eliminar'
roles:
- receta-kds-dns
- hosts: kds
vars:
dominio: institucion.gob.ve
ns: ns
ipv4_ns: 192.168.1.53
ipv6_ns:
action: 'Instalar'
roles:
- receta-kds-dns
- hosts: localhost
vars:
bind_config_master_zones:
- name: example.com
bind_config_master_allow_transfer:
- 127.0.0.1
- 127.0.0.2
bind_config_slave_zones:
- name: example.net
masters: [ '127.1.0.1', '127.1.0.2' ]
zones:
- example.net
- example.org
bind_config_forward_zones:
- name: domains forwarded to 127.1.0.x nameservers
forwarders: [ '127.1.0.1', '127.1.0.2' ]
forward: only
zones:
- forwarded.example.net
- forwarded.example.org
roles:
- ansible-role-bind
---
bind_config_basepath: /etc/bind
bind_user: bind
bind_group: bind
bind_service_name: bind9
ruta_configuracion_base_bind: /etc/bind
usuario_bind: bind
grupo_bind: bind
nombre_servicio: bind9
bind_pkgs:
- bind9
- dnsutils
#- dnsutils
#- bind9-doc
# Inicialización de variables necesarias a lo largo de los 'tasks'
version: "01"
serial: "{{ ansible_date_time.year }}{{ ansible_date_time.month }}{{ ansible_date_time.day }}{{version}}"
nuevoserial: "1970010101"
fechaactual: "{{ ansible_date_time.year }}{{ ansible_date_time.month }}{{ ansible_date_time.day }}"
fechaserial: "19700101"
versionserial: "00"
nombre:
clase:
tipo:
dato:
action:
subaction:
\ No newline at end of file
---
ruta_configuracion_base_bind: /etc/bind
usuario_bind: bind
grupo_bind: bind
nombre_servicio: bind9
bind_pkgs:
- bind9
#- dnsutils
#- bind9-doc
# Inicialización de variables necesarias a lo largo de los 'tasks'
version: "01"
serial: "{{ ansible_date_time.year }}{{ ansible_date_time.month }}{{ ansible_date_time.day }}{{version}}"
nuevoserial: "1970010101"
fechaactual: "{{ ansible_date_time.year }}{{ ansible_date_time.month }}{{ ansible_date_time.day }}"
fechaserial: "19700101"
versionserial: "00"
nombre:
clase:
tipo:
dato:
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment