Pregunta ¿Cómo generar buenos seriales para zonas DNS con Puppet?


Mi tradición es establecer todas las series de zonas en la marca de tiempo en la modificación. Ahora que Puppet es mi nueva religión, quiero establecer marcas de tiempo de serie al crear archivos de zona a partir de recursos exportados. Un ejemplo algo trivializado puede verse así:

file { "/tmp/dafile": content = inline_template("<%= Time.now.to_i %>"), }

El problema con este enfoque es que el contenido será diferente todo el tiempo, lo que provocará (en última instancia) la reconstrucción de los archivos de zona en cada encuesta de configuración de títere.

¿Hay alguna manera de insertar una marca de tiempo sin que se incluya en los datos que se comparan con el estado anterior?


7
2017-11-29 04:03


origen


¿Cuál es su problema con una serie que cambia con frecuencia? ¿Por qué no aceptar simplemente que cambiará con frecuencia? - Zoredache
Consume recursos del sistema; el reensamblaje del archivo de zona de todos los recursos exportados toma decenas de segundos. Genera spam de registro tanto de títere como de enlace. Requerirá recargas frecuentes de la configuración de enlace, lo que implica un pequeño riesgo. Además, es descortés invalidar la zona esencialmente en cada intervalo de actualización a menos que sea necesario. - Bittrance
Por cierto, ¿qué estás usando para generar tus zonas DNS? - Zoredache


Respuestas:


No use una plantilla, si intenta usar un número de serie, el problema es que seguirá haciendo cambios cada vez.

Tengo dos ideas:

  1. Cree un tipo adecuado que pueda administrar DNS utilizando actualizaciones de DNS a través de la API estándar. Luego deje que BIND haga los incrementos del número de serie.
  2. Use un patrón de fragmento de archivo en cada elemento dentro de su zona DNS, y téngalo para que el archivo de la zona principal solo se actualice cuando cambien. Para ello, debe tener un exec de 'actualización de zona' que cubra sus partes en la zona final, incluido el encabezado. La diferencia entre la mayoría de las soluciones de fragmentos de archivos sería que usted genera su serie de zona a partir de una marca de tiempo o algo así, que solo debería activarse cuando se cambian las partes, evitando así los cambios constantes de número de serie que obtendría de una plantilla.

Algunos ejemplos del patrón de fragmento de archivo están aquí:

http://projects.puppetlabs.com/projects/puppet/wiki/Generating_a_config_file_from_fragments

https://github.com/ripienaar/puppet-concat


3
2017-11-29 12:21





¿Qué hay de usar la marca de tiempo del archivo:

file { "/tmp/dafile": content = inline_template("<%= File.mtime("/tmp/dafile").to_i %>"), }

Lo único es que esto probablemente se ejecutará en cada cliente y puede actualizar la marca de tiempo del archivo para cada ejecución. Si no es así, debe satisfacer sus necesidades.


2
2017-11-29 07:58





¿Qué hay de lo siguiente,

$utime_serial = inline_template("<%= Time.now.to_i %>")

file { "/var/named/$domain.hosts":
          content => template("named/$domain.hosts.erb"),
          owner => root,
          group => named,
          mode => 0640,
}

donde el archivo de plantilla erb contiene,

$TTL 1D
@             IN      SOA       galaxy.example.com.  sysadmin.example.com.  (
                               <%=utime_serial %>       ; Serial
                                8H             ; Refresh
                                2H             ; Retry
                                4W             ; Expire
                                1D )           ; Minimum

1
2018-01-15 07:35





puedes ejecutar comandos externos desde dentro de títere (estoy usando cfengine, no sé títere) Que hay de esto /bin/date '+%Y%m%d00'


0
2017-11-29 09:25



Eso es ciertamente posible y es lo que estoy haciendo con el exec comando (tenga en cuenta el / bin / fecha allí) pero no querría usarlo como una serie, ya que si realiza más de un cambio por día a la misma zona, la serie no se incrementará. - Geoffrey


Utilicé lo siguiente para realizar esto:

file {"${zone['zoneName']}.db":
        name            => "/var/lib/bind/.temp/${zone['zoneName']}.db",
        ensure          => file,
        content         => template('dns/bind/zone.db.erb'),
        owner           => 'root',
        group           => 'bind',
        mode            => 'ug=r,o=',
        require         => File['/var/lib/bind/.temp'],
        notify          => Exec["updateSerial-${zone['zoneName']}"]
}

exec {"updateSerial-${zone['zoneName']}":
        command         => "/bin/sed \"s/#SERIAL#/$(/bin/date '+%s')/\" '/var/lib/bind/.temp/${zone['zoneName']}.db' > '/var/lib/bind/${zone['zoneName']}.db'",
        refreshonly     => true,
        require         => File["${zone['zoneName']}.db"],
        notify          => Service['bind']
}

La plantilla tiene #SERIAL# como marcador de posición, una vez creado el archivo temporal, Exec Se notifica que luego utiliza sed y date para reemplazar el marcador de posición con la marca de tiempo de Unix actual, finalmente escriba el archivo en la ubicación correcta.


0
2018-02-03 06:37





He tendido a usar el tiempo de modificación de El archivo de manifiesto o hiera en el que está declarando las entradas de host. y convertir eso en una marca de tiempo adecuada para la serie. (También puede usar el más reciente de un conjunto de archivos si está dividido en varios archivos, o una marca de tiempo para el cambio más reciente si es a través de alguna otra ruta como una base de datos)

Desafortunadamente, el número de serie máximo es un entero sin signo de 32 bits, por lo que solo puede usar números hasta 2147483647. Esto no nos permite simplemente usar segundos desde la época de Unix como el número de serie, desafortunadamente. En su lugar, el formato predeterminado es usar YYYYMMDDxx, pero esto requiere que tenga el número de serie actual como estado si ya lo configuró en la misma fecha.

Como alternativa, y una que no requiere que lea un archivo e incremente el número, uso la siguiente plantilla en línea:

$serial_mtime_file = '/etc/puppetlabs/code/environments/production/site/profile/manifests/dns_dhcp_pxe.pp'
$serial_secs = inline_template("<%= File.mtime(@serial_mtime_file).strftime(\"%y%j\").to_s + (File.mtime(@serial_mtime_file).to_i % 86400).to_s %>")

notify { "Created magical serial number ${serial_secs}": }
validate_numeric($serial_secs)

Esto le da un formato YYDDDsssss (2 dígitos del año, 3 dígitos del día del año, 5 dígitos del segundo día), que funcionará hasta 2099 (si comienza en 2000 como lo hice anteriormente) y le permite una actualización cada segundo hasta entonces. Esto permite utilizar esta variable como un argumento para cualquier módulo existente que desee utilizar para crear las configuraciones de enlace, en lugar de necesitar una plantilla desde la cual pueda leer la serie existente (para incrementar).

Por lo tanto, las plantillas están bien si le da un poco de creatividad sobre de dónde obtiene el tiempo para configurar el número de serie con :)

He usado lo anterior con el módulo camptocamp / bind puppetforge y esto funciona correctamente


0
2018-03-17 23:05