Definindo o nome do host: FQDN ou nome abreviado?

164

Eu notei que o método "preferido" de configurar o nome do host do sistema é fundamentalmente diferente entre os sistemas Red Hat / CentOS e Debian / Ubuntu.

documentação do CentOS e o Guia de implantação do RHEL diga o nome do host deve ser o FQDN :

HOSTNAME=<value>, where <value> should be the Fully Qualified Domain Name (FQDN), such as hostname.example.com, but can be whatever hostname is necessary.

O guia de instalação do RHEL é um pouco mais ambíguo:

Setup prompts you to supply a host name for this computer, either as a fully-qualified domain name (FQDN) in the format hostname.domainname or as a short host name in the format hostname.

A referência do Debian diz que o nome do host não deve use o FQDN :

3.5.5. The hostname

The kernel maintains the system hostname. The init script in runlevel S which is symlinked to "/etc/init.d/hostname.sh" sets the system hostname at boot time (using the hostname command) to the name stored in "/etc/hostname". This file should contain only the system hostname, not a fully qualified domain name.

Eu não vi nenhuma recomendação específica da IBM sobre qual usar, mas algum software parece ter uma preferência.

Minhas perguntas:

  • Em um ambiente heterogêneo, é melhor usar a recomendação do fornecedor ou escolher uma e ser consistente em todos os hosts?
  • Qual software você encontrou e que é sensível a se o nome do host está definido como o nome abreviado ou FQDN?
por Cakemox 17.11.2011 / 14:07

7 respostas

96

Eu escolheria uma abordagem consistente em todo o ambiente. Ambas as soluções funcionam bem e permanecerão compatíveis com a maioria dos aplicativos. Há uma diferença na capacidade de gerenciamento, no entanto.

Eu uso o nome abreviado como configuração HOSTNAME e defino o FQDN como a primeira coluna em /etc/hosts para o IP do servidor, seguido pelo nome abreviado.

Eu não encontrei muitos pacotes de software que reforçam ou exibem uma preferência entre os dois. Acho que o nome abreviado é mais limpo para alguns aplicativos, especificamente o log. Talvez eu tenha tido azar em ver domínios internos como server.northside.chicago.rizzomanufacturing.com . Quem quer ver isso nos logs ou em um prompt do shell ?

Às vezes, estou envolvido em aquisições ou reestruturações de empresas, onde domínios internos e / ou subdomínios são alterados. Eu gosto de usar o nome de host curto nesses casos porque o log, kickstarts, impressão, monitoramento de sistemas, etc. não precisam de reconfiguração completa para considerar os novos nomes de domínio.

Uma configuração típica do servidor RHEL / CentOS para um servidor chamado "rizzo" com domínio interno "ifp.com" seria:

/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

-

[root@rizzo ~]# 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'
    
por 17.11.2011 / 14:20
36

Praticamente todo software é sensível para configurar corretamente o nome do host. Enquanto trabalhava no Digg, uma vez eu reduzi o site inteiro por duas horas devido a uma mudança aparentemente inocente em /etc/hosts que afetou a noção de hostname do sistema. Pise levemente. Dito isto, você pode estar um pouco confuso aqui. Eu não acho que a configuração HOSTNAME= seja diretamente equivalente a como as distribuições baseadas no Debian usam /etc/hostname .

O que funciona para mim em um ambiente heterogêneo é:

  1. Defina o nome do host da maneira recomendada pelo fornecedor, usando uma condicional no seu software de gerenciamento de configuração.
  2. Use o comando hostname para definir o nome do host usado pelo kernel, etc.
  3. Em /etc/hosts :

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

Esta configuração ainda não me falhou.

    
por 21.11.2011 / 19:48
29

Você certamente não terá problemas em encontrar referências on-line que lhe dirão para fazê-lo definitivamente de uma forma ou de outra. Parece-me no entanto que ter um nome abreviado como o nome do host e ter o nome totalmente qualificado em / etc / hosts é certamente muito mais prevalente. Parece ser a maneira mais sensata, pois os serviços que precisam de um nome totalmente qualificado podem ser adaptados para chamar hostname --fqdn .

Acabei de encontrar um software recentemente que exige rigidamente que um fqdn seja retornado por hostname , que foi ganeti. Eles documentam este aqui . Eu não vejo nenhum motivo pelo qual eles não possam se adaptar a hostname --fqdn .

    
por 15.12.2011 / 15:45
10

Um tanto quanto tangencial, enquanto pesquisava esta questão, eu fiquei louco o suficiente para checar o código-fonte do "hostname" e escrever um script para imprimir resultados investigativos (Fedora 19). O que está faltando é uma olhada em "/ etc / hosts", que na minha humilde opinião deve ser mantida fora de tudo isso em primeiro 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"

A saída em uma VM do Amazon EC2 executando o Fedora 19 , depois de definir manualmente os valores do kernel e preencher /etc/hostname , mas sem alterações em /etc/hosts pode ser assim:

== 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

A maneira resiliente de obter o nome de host totalmente qualificado no perl seria:

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}"
      }
   }
}

e no bash seria:

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 é uma variável do shell que o bash fornece ("Definido automaticamente para o nome do host atual"), mas não há nenhuma indicação de que o bash chega a esse valor.

Nota 2: Nunca esqueça o / etc / hostname em /boot/initrams-FOO.img ...

    
por 03.10.2013 / 13:39
-4

As opções / etc / hosts funcionam bem.

Mas, para garantir que todos os arquivos corretos sejam atualizados, execute a ferramenta configuração

    
por 25.11.2011 / 12:56
-4

Hm ... Nos hosts linux, se você quiser alterar o HOSTNAME e o FQDN, você deve resolver 3 etapas (por exemplo, o novo host é rizzo.ifp.com ):

Etapa # 1 Altere o valor de HOST na configuração das propriedades de NETWORK:

sudo vi /etc/sysconfig/network

Alterar ou adicionar string:

HOSTNAME=rizzo.ifp.com

Etapa # 2 Edite sua configuração de hosts

sudo vim /etc/hosts
#IPv4
127.0.0.1       localhost localhost.localdomain localhost4 localhost4.localdomain4
[External IP]   rizzo rizzo.ifp.com

Etapa # 3 Reinicialize seu host Muito bem, basta verificar a nova configuração

[rizzo@rizzo]# hostname -f
rizzo.ifp.com
    
por 22.12.2012 / 11:56
-4

O pedido não está certo. Tem que ser:

1.2.3.4 full.example.com full

O exemplo pode ser assim:

[External IP] rizzo.example.com rizzo 
    
por 05.04.2015 / 09:23