Solución 1:
Elegiría un enfoque coherente en todo el entorno. Ambas soluciones funcionan bien y seguirán siendo compatibles con la mayoría de las aplicaciones. Sin embargo, hay una diferencia en la manejabilidad.
Voy con el nombre corto como configuración de NOMBRE DE HOST y configuro el FQDN como la primera columna en /etc/hosts
para la IP del servidor, seguida del nombre corto.
No he encontrado muchos paquetes de software que impongan o muestren una preferencia entre los dos. Encuentro que el nombre corto es más limpio para algunas aplicaciones, específicamente para el registro. Tal vez he tenido mala suerte al ver dominios internos como server.northside.chicago.rizzomanufacturing.com
. ¿Quién quiere ver eso en los registros o en un indicador de shell? ?
A veces, participo en adquisiciones o reestructuraciones de empresas en las que cambian los dominios y/o subdominios internos. Me gusta usar el nombre de host corto en estos casos porque el registro, los inicios rápidos, la impresión, el monitoreo de sistemas, etc. no necesitan una reconfiguración completa para dar cuenta de los nuevos nombres de dominio.
Una configuración de servidor RHEL/CentOS típica para un servidor llamado "rizzo" con el dominio interno "ifp.com", se vería así:
/etc/sysconfig/network:
HOSTNAME=rizzo
...
-
/etc/hosts:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.100.13 rizzo.ifp.com rizzo
-
[[email protected] ~]# hostname
rizzo
-
/var/log/messages snippet:
Dec 15 10:10:13 rizzo proftpd[19675]: 172.16.100.13 (::ffff:206.15.236.182[::ffff:206.15.236.182]) - Preparing to
chroot to directory '/app/upload/GREEK'
Dec 15 10:10:51 rizzo proftpd[20660]: 172.16.100.13 (::ffff:12.28.170.2[::ffff:12.28.170.2]) - FTP session opened.
Dec 15 10:10:51 rizzo proftpd[20660]: 172.16.100.13 (::ffff:12.28.170.2[::ffff:12.28.170.2]) - Preparing to chroot
to directory '/app/upload/ftp/SRRID'
Solución 2:
Prácticamente todo el software es sensible a la configuración correcta del nombre de host. Mientras trabajaba en Digg, una vez detuve todo el sitio durante 2 horas debido a que hice un cambio aparentemente inocente en /etc/hosts
que afectó la noción del sistema de nombre de host. Anda con cuidado. Dicho esto, puede estar un poco confundido aquí. No creo que el HOSTNAME=
la configuración es directamente equivalente a cómo las distribuciones basadas en Debian usan /etc/hostname
.
Lo que funciona para mí en un entorno heterogéneo es:
- Establezca el nombre de host de la manera recomendada por el proveedor, usando un condicional en su software de administración de configuración.
- Utilice el
hostname
comando para establecer el nombre de host utilizado por el kernel, etc. -
En
/etc/hosts
:127.0.0.1 localhost 10.0.0.1 hostname.example.com hostname
Esta configuración aún no me ha fallado.
Solución 3:
Seguramente no tendrá problemas para encontrar referencias en línea que le indiquen que definitivamente lo haga de una forma u otra. Sin embargo, me parece que tener un nombre corto como nombre de host y tener el nombre completo en /etc/hosts es ciertamente mucho más frecuente. Parece la forma más sensata, ya que los servicios que necesitan un nombre completo se pueden adaptar para llamar a hostname --fqdn
en su lugar.
Recientemente, solo me he encontrado con una pieza de software que requiere estrictamente que hostname
devuelva un fqdn. , que era ganeti. Lo documentan aquí. No veo ninguna razón por la que no puedan adaptarse a hostname --fqdn
, sin embargo.
Solución 4:
Algo tangencialmente, mientras investigaba esta pregunta, me volví lo suficientemente loco como para verificar el código fuente de "nombre de host" y escribir un script para imprimir los resultados de la investigación (Fedora 19). Lo que falta es un vistazo a "/etc/hosts", que en mi humilde opinión debería mantenerse fuera de todo esto en primer lugar.
#!/bin/bash
function pad {
if [[ $1 == '?' ]]; then
printf "%-23s" "?"
else
printf "%-23s" "'$1'"
fi
}
# ----- Kernel -----
# Two ways to configure the kernel values:
# 1) Put FQDN into "kernel.hostname" and nothing into "kernel.domainname"
# 2) Put machine name into "kernel.hostname" and DNS domain name into "kernel.domainname" (makes more sense)
echo "== Kernel values =="
echo
H=`/sbin/sysctl -n kernel.hostname`
D=`/sbin/sysctl -n kernel.domainname`
echo "Kernel hostname: '$H'"
echo "Kernel domainname: '$D'"
# ----- What does bash say -----
echo
echo "== According to bash =="
echo
echo "HOSTNAME = '$HOSTNAME'"
# ----- Hostname config file ------
echo
echo "== Hostname config file =="
echo
ETCH="/etc/hostname"
if [[ -f $ETCH ]]; then
CONTENTS=`cat $ETCH`
echo "File '$ETCH' contains: '$CONTENTS'"
else
echo "File '$ETCH' does not exist"
fi
# ----- Network config file ------
echo
echo "== Network config file =="
echo
SYSN="/etc/sysconfig/network"
if [[ -f $SYSN ]]; then
LINE=`grep -e "^HOSTNAME=" $SYSN`
if [[ -n $LINE ]]; then
echo "File '$SYSN' contains: '$LINE'"
else
echo "File '$SYSN' exists but does not contain a line for 'HOSTNAME'"
fi
else
echo "File '$SYSN' does not exist"
fi
# ----- Nodename -------
echo
echo "== Nodename =="
echo
UNAME=`uname --nodename` # On Linux, this is the hostname
echo "The 'nodename' given by 'uname --nodename' is: '$UNAME'"
# ----- The 'hostname' mess ------
THE_HOSTNAME=`hostname`
SHORT_NAME=`hostname --short`
NIS_DNAME=`domainname`
YP_DNAME=`hostname --yp` # Same as `nisdomainname` ; this may fail with "hostname: Local domain name not set"
if [[ $? != 0 ]]; then
YP_DNAME="?"
fi
echo
echo "== 'hostname' directly obtained values =="
echo
echo "The result of gethostname();"
echo "...obtained by running 'hostname'"
echo "Hostname: $(pad $THE_HOSTNAME)"
echo
echo "The part before the first '.' of the value returned by gethostname();"
echo "...obtained by running 'hostname --short'"
echo "Short name: $(pad $SHORT_NAME)"
echo
echo "The result of getdomainname(); the code of 'hostname' seems to call this the 'NIS domain name';"
echo "...on Linux, this is the kernel-configured domainname;"
echo "...obtained by running 'domainname'"
echo "NIS domain name: $(pad $NIS_DNAME)"
echo
echo "The result of yp_get_default_domain(), which may fail;"
echo "...obtained by running 'ĥostname --yp'"
echo "YP default domain: $(pad $YP_DNAME)"
DNS_DNAME=`hostname --domain` # Same as `dnsdomainname`'
FQDN_NAME=`hostname --fqdn`
ALIAS_NAME=`hostname --alias`
echo
echo "== 'hostname' values obtained via DNS =="
echo
echo "The part after the first '.' of the 'canonical name' value returned by getaddrinfo(gethostname());"
echo "...obtained by running 'hostname --domain'"
echo "DNS domain name: $(pad $DNS_DNAME)"
echo
echo "The 'canonical name' value returned by getaddrinfo(gethostname());"
echo "...obtained by running 'hostname --fqdn'"
echo "Fully qualified hostname: $(pad $FQDN_NAME)"
echo
echo "Alias obtained by gethostbyname(gethostname());"
echo "...obtained by running 'hostname --alias'"
echo "Hostname alias: $(pad $ALIAS_NAME)"
BY_IP_ADDR=`hostname --ip-address`
ALL_IP_ADDR=`hostname --all-ip-addresses`
ALL_FQDN_NAMES=`hostname --all-fqdn`
echo
echo "== 'hostname' values obtained by collecting configured network addresses =="
echo
echo "Collect the IP addresses from getaddrinfo(gethostname()), apply getnameinfo(ip) to all those addresses;"
echo "...obtained by running 'hostname --ip-address'"
echo "By IP address: $BY_IP_ADDR"
echo
echo "Call getnameinfo(NI_NUMERICHOST) on all addresses snarfed from active interfaces;"
echo "...obtained by running 'hostname --all-ip-addresses'"
echo "All IP addresses: $ALL_IP_ADDR"
echo
echo "Call getnameinfo(NI_NAMEREQD) on all addresses snarfed from active interfaces (involves lookup in /etc/hosts);"
echo "...obtained by running 'hostname --all-fqdn'"
echo "All fully qualified hostnames: $ALL_FQDN_NAMES"
La salida en una máquina virtual Amazon EC2 que ejecuta Fedora 19 , después de configurar manualmente los valores del kernel y completar /etc/hostname
, pero sin cambios en /etc/hosts
entonces podría ser así:
== Kernel values ==
Kernel hostname: 'kyubee'
Kernel domainname: 'homelinux.org'
== According to bash ==
HOSTNAME = 'ip-172-31-24-249.localdomain'
== Hostname config file ==
File '/etc/hostname' contains: 'kyubee.homelinux.org'
== Network config file ==
File '/etc/sysconfig/network' exists but does not contain a line for 'HOSTNAME'
== Nodename ==
The 'nodename' given by 'uname --nodename' is: 'kyubee'
== 'hostname' directly obtained values ==
The result of gethostname();
...obtained by running 'hostname'
Hostname: 'kyubee'
The part before the first '.' of the value returned by gethostname();
...obtained by running 'hostname --short'
Short name: 'kyubee'
The result of getdomainname(); the code of 'hostname' seems to call this the 'NIS domain name';
...on Linux, this is the kernel-configured domainname;
...obtained by running 'domainname'
NIS domain name: 'homelinux.org'
The result of yp_get_default_domain(), which may fail;
...obtained by running 'ĥostname --yp'
YP default domain: 'homelinux.org'
== 'hostname' values obtained via DNS ==
The part after the first '.' of the 'canonical name' value returned by getaddrinfo(gethostname());
...obtained by running 'hostname --domain'
DNS domain name: ''
The 'canonical name' value returned by getaddrinfo(gethostname());
...obtained by running 'hostname --fqdn'
Fully qualified hostname: 'kyubee'
Alias obtained by gethostbyname(gethostname());
...obtained by running 'hostname --alias'
Hostname alias: ''
== 'hostname' values obtained by collecting configured network addresses ==
Collect the IP addresses from getaddrinfo(gethostname()), apply getnameinfo(ip) to all those addresses;
...obtained by running 'hostname --ip-address'
By IP address: fe80::8f6:8eff:fe49:9e21%eth0 172.31.24.249
Call getnameinfo(NI_NUMERICHOST) on all addresses snarfed from active interfaces;
...obtained by running 'hostname --all-ip-addresses'
All IP addresses: 172.31.24.249
Call getnameinfo(NI_NAMEREQD) on all addresses snarfed from active interfaces (involves lookup in /etc/hosts);
...obtained by running 'hostname --all-fqdn'
All fully qualified hostnames: ip-172-31-24-249.eu-west-1.compute.internal
La forma resiliente de obtener el nombre de host completo en perl sería:
sub getHostname {
my $hostname_short = `/bin/hostname --short`;
if ($? != 0) { print STDERR "Could not execute 'hostname --short' -- exiting\n"; exit 1 }
chomp $hostname_short;
my $hostname_long = `/bin/hostname`;
if ($? != 0) { print STDERR "Could not execute 'hostname' -- exiting\n"; exit 1 }
chomp $hostname_long;
if ($hostname_long =~ /^${hostname_short}\..+$/) {
# "hostname_long" is a qualified version of "hostname_short"
return $hostname_long
}
else {
# both hostnames are "short" (and are equal)
die unless ($hostname_long eq $hostname_short);
my $domainname = `/bin/domainname`;
if ($? != 0) { print STDERR "Could not execute 'domainname' -- exiting\n"; exit 1 }
chomp $domainname;
if ($domainname eq "(none)") {
# Change according to taste
return "${hostname_short}.localdomain"
}
else {
return "${hostname_short}.${domainname}"
}
}
}
y en bash sería:
function getHostname {
local hostname_short=`/bin/hostname --short`
if [ $? -ne 0 ]; then
echo "Could not execute 'hostname --short' -- exiting" >&2; exit 1
fi
local hostname_long=`/bin/hostname`
if [ $? -ne 0 ]; then
echo "Could not execute 'hostname' -- exiting" >&2; exit 1
fi
if [[ $hostname_long =~ ^"$hostname_short"\..+$ ]]; then
# "hostname_long" is a qualified version of "hostname_short"
echo $hostname_long
else
# both hostnames are "short" (and are equal)
if [[ $hostname_long != $hostname_short ]]; then
echo "Cannot happen: '$hostname_long' <> '$hostname_short' -- exiting" >&2; exit 1
fi
local domainname=`/bin/domainname`
if [ $? -ne 0 ]; then
echo "Could not execute 'domainname' -- exiting" >&2; exit 1
fi
if [[ domainname == '(none)' ]]; then
# Change according to taste
echo "${hostname_short}.localdomain"
else
echo "${hostname_short}.${domainname}"
fi
fi
}
Notas
Nota 1:HOSTNAME es una variable de shell que proporciona bash ("Se establece automáticamente en el nombre del host actual"), pero no hay indicación de que bash llegue a ese valor.
Nota 2:nunca olvide /etc/hostname en /boot/initrams-FOO.img ...