Question Définition du nom d’hôte: nom de domaine complet ou nom abrégé?


J'ai remarqué que la méthode "préférée" de définition du nom d'hôte système est fondamentalement différente entre les systèmes Red Hat / CentOS et Debian / Ubuntu.

Documentation CentOS et le Guide de déploiement RHEL dire le nom d'hôte devrait être le nom de domaine complet:

HOSTNAME=<value>, où <value> devrait être le domaine pleinement qualifié   Nom (FQDN), tel que hostname.example.com, mais peut être n'importe quoi   Le nom d'hôte est nécessaire.

le Guide d'installation RHEL est légèrement plus ambigu:

Le programme d'installation vous invite à fournir un nom d'hôte pour cet ordinateur, sous forme de    nom de domaine complet (FQDN) dans le format nomhôte.nomdomaine   ou sous la forme d'un nom d'hôte court au format nom d'hôte.

La référence Debian dit le nom d'hôte ne doit pas utiliser le nom de domaine complet:

3.5.5. Le nom d'hôte

Le noyau maintient le système nom d'hôte. Le script d'initialisation au niveau d'exécution   S qui est lié symboliquement à "/etc/init.d/hostname.sh"définit le système   nom d'hôte au démarrage (à l'aide de la nom d'hôte commande) au nom stocké   dans "/ etc / hostname". Ce fichier doit contenir seulement le nom d'hôte du système,   pas un nom de domaine complet.

Je n'ai pas vu de recommandations spécifiques d'IBM à utiliser, mais certains logiciels semble avoir une préférence.

Mes questions:

  • Dans un environnement hétérogène, vaut-il mieux utiliser la recommandation du fournisseur ou en choisir une et rester cohérent sur tous les hôtes?
  • Quel logiciel avez-vous rencontré est-il sensible au fait que le nom d'hôte soit défini sur le nom de domaine complet ou sur le nom abrégé?

164
2017-11-17 13:07


origine




Réponses:


Je choisirais une approche cohérente dans tout l'environnement. Les deux solutions fonctionnent bien et resteront compatibles avec la plupart des applications. Il y a une différence de gestion, cependant.

Je vais avec le nom court en tant que paramètre HOSTNAME et définit le nom de domaine complet comme première colonne de /etc/hosts pour l'adresse IP du serveur, suivi du nom abrégé.

Je n'ai pas rencontré beaucoup de progiciels qui imposent ou affichent une préférence entre les deux. Je trouve le nom abrégé plus propre pour certaines applications, en particulier la journalisation. Peut-être n’ai-je pas eu la chance de voir des domaines internes comme server.northside.chicago.rizzomanufacturing.com. Qui veut voir cela dans les journaux ou un invite du shell?

Parfois, je participe à des acquisitions ou à des restructurations d'entreprises dans lesquelles des domaines internes et / ou des sous-domaines changent. Dans ces cas, j'aime bien utiliser le nom d'hôte abrégé, car la journalisation, les kickstarts, l'impression, la surveillance des systèmes, etc. ne nécessitent pas de reconfiguration complète pour prendre en compte les nouveaux noms de domaine.

Une configuration de serveur RHEL / CentOS typique pour un serveur nommé "rizzo" avec un domaine interne "ifp.com" ressemblerait à ceci:

/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'

96
2017-11-17 13:20



Comme vous, je préfère le nom abrégé, mais j’ai récemment découvert que certaines applications Oracle nécessitent la sortie de hostname être le nom de domaine complet. Juste l'avoir dans /etc/hosts n'est pas assez bon. Cela a foiré avec ma cohérence. - James O'Gorman
La différence de majuscule des noms d’hôtes dans cet exemple n’est sûrement pas une pratique exemplaire. tools.ietf.org/search/rfc1178 - teknopaul
Ne devrait pas /etc/sysconfig/network contient des lignes comme: NETWORKING=yes, NETWORKING_IPV6=no, HOSTNAME=example.com, NISDOMAIN=example ? - Jasmine Lognnes
@JasmineLognnes D'accord, je l'ai corrigé. J'espère que ça ne me dérange pas. - kubanczyk
Ce n'est pas seulement une question de préférence. Voir hostname(1) sur n'importe quelle machine Linux.


Presque tous les logiciels sont sensibles à la définition correcte du nom d’hôte. Pendant que je travaillais chez Digg, j’ai une fois détruit l’ensemble du site pendant 2 heures en raison d’un changement apparemment innocent. /etc/hostscela a affecté la notion de système du nom d'hôte du système. Marchez légèrement. Cela dit, vous pouvez être un peu confus ici. Je ne pense pas le HOSTNAME= paramètre est directement équivalent à la façon dont les distributions basées sur Debian utilisent /etc/hostname.

Ce qui fonctionne pour moi dans un environnement hétérogène est:

  1. Définissez le nom d'hôte de la manière recommandée par le fournisseur, en utilisant une condition dans votre logiciel de gestion de configuration.
  2. Utilisez le hostname commande pour définir le nom d’hôte utilisé par le noyau, etc.
  3. Dans /etc/hosts:

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

Cette configuration ne m'a pas encore échoué.


36
2017-11-21 18:48



C’est à peu près la configuration que j’utilise au travail. Le nom abrégé devrait être correct tant que le nom de domaine se trouve dans le chemin de recherche de l'ADN (/etc/resolv.conf) pour les machines pertinentes de votre environnement. - gWaldo
recommandez-vous spécifiquement une adresse IP de réseau local par opposition à une adresse publique? - code_monk


Vous n'aurez aucun problème à trouver des références en ligne qui vous indiqueront de le faire définitivement d'une manière ou d'une autre. Il me semble cependant que le fait d'avoir un nom abrégé comme nom d'hôte et le nom qualifié complet dans / etc / hosts est certainement beaucoup plus répandu. Cela semble être la solution la plus judicieuse, car les services qui nécessitent un nom complet peuvent être adaptés pour appeler hostname --fqdn au lieu.

Je n’ai rencontré récemment qu’un logiciel qui nécessite rigoureusement le renvoi d’un fqdn par hostname, qui était ganeti. Ils documentent cette ici. Je ne vois aucune raison pour laquelle ils ne peuvent pas s'adapter hostname --fqdn, toutefois.


29
2017-12-15 14:45



Bonus pour donner un exemple! Merci. - Cakemox
"Je ne vois aucune raison pour laquelle ils ne peuvent pas s'adapter hostname --fqdn"répond au premier paragraphe sous" Pourquoi un nom d’hôte qualifié complet "- cela nécessite des conjectures et un résolveur fonctionnel. Demander au noyau est l’option la plus sûre et la plus fiable. - womble♦
@womble - Tant que le fichier / etc / hosts a une entrée pour la machine (10.0.0.1 hostname.example.com hostname) et /etc/nsswitch.conf spécifie la résolution locale avant DNS (hosts: files dns) ayant alors un résolveur fonctionnel est rempli par le fichier des hôtes locaux. En tant que tel, l'argument en faveur de l'utilisation d'un nom de domaine complet au lieu d'un nom d'hôte est rarement valable. En outre, un autre exemple de logiciel qui requiert de manière rigide hostname renvoyer un nom de domaine complet est le package du serveur de messagerie Zimbra. - crashmaxed
@crashmaxed: Il s'agit de plusieurs exigences supplémentaires, dont certaines pourraient ne pas être possibles dans un environnement donné ou être gâchées par erreur. Avoir le nom de domaine complet dans les structures de données du noyau est beaucoup plus simple. - womble♦


De manière un peu tangentielle, en cherchant cette question, je suis devenue assez folle pour vérifier le code source de "hostname" et écrire un script pour imprimer les résultats de l'enquête (Fedora 19). Ce qui manque, c’est un coup d’œil sur "/ etc / hosts", qui, à mon humble avis, devrait être tenu à l’abri de tout cela.

#!/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 sortie sur une machine virtuelle Amazon EC2 exécutant Fedora 19, après avoir défini manuellement les valeurs du noyau et rempli /etc/hostname, mais sans modification de /etc/hosts pourrait alors être comme ceci:

== 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 manière résiliente d’obtenir le nom d’hôte qualifié complet en Perl serait alors:

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

et dans bash ce serait:

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
}

Remarques 

Remarque 1: HOSTNAME est une variable shell fournie par bash ("automatiquement définie sur le nom de l'hôte actuel"), mais rien n'indique que bash arrive à cette valeur.

Note 2: N'oubliez jamais / etc / hostname dans /boot/initrams-FOO.img ...


10
2017-10-03 11:39



Désolé si cela doit être évident, mais qu'est-ce que cela a à voir avec la définition du nom d'hôte? - Chris S
En résumé, les notes que j'ai prises lors de la recherche de définition du nom d'hôte sur mes instances de Fedora 19 EC2. En ce qui concerne le résultat: 1) Définissez le FQHN dans / etc / hostname 2) Ne touchez pas à / etc / hosts 3) Vous pouvez définir le 'nom d’hôte du noyau' sur le FQHN ou le nom d’hôte non qualifié, si non défini, la valeur est prise à partir de / etc / hostname 4) Vous pouvez définir le 'nom de domaine du noyau' sur le nom de domaine, ce qui est plus agréable que simplement '(aucun)'. - David Tonhofer


Les options / etc / hosts fonctionnent bien.

Mais vous voulez vous assurer que tous les fichiers appropriés sont mis à jour, exécutez la installer outil


-4
2017-11-25 11:56



Ma distribution n'a pas d'outil de "configuration"; quelle distribution utilisez-vous qui en a une? - nickgrim
tout système d'exploitation basé sur redhat utilise-t-il l'outil de configuration rhel / centos / fedora whar OS? - Riaan
Puisque la question parle de différences entre les distributions basées sur RHEL et celles basées sur Debian, nous devons supposer que le demandeur utilise les deux. Il n'y a pas d'outil de "configuration" sur les distributions basées sur Debian. - Martijn Heemels


Hm ... Dans les hôtes Linux, si vous souhaitez modifier le nom d'hôte et le nom de domaine complet, vous devez résoudre 3 étapes (par exemple, nouvel hôte rizzo.ifp.com):

Étape 1 Modifiez la valeur de l'hôte dans la configuration des propriétés du réseau:

sudo vi /etc/sysconfig/network

Changer ou ajouter une chaîne:

HOSTNAME=rizzo.ifp.com

Étape 2 Editer la configuration de vos hôtes

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

Étape 3 Redémarrez votre hôte Bien fait, il suffit de vérifier la nouvelle configuration

[rizzo@rizzo]# hostname -f
rizzo.ifp.com

-4
2017-12-22 10:56





La commande n'est pas correcte. Ce doit être:

1.2.3.4 full.example.com full

Ainsi, l'exemple pourrait ressembler à ceci:

[External IP] rizzo.example.com rizzo 

-4
2018-04-05 07:23



Cette question a déjà des réponses vraiment de qualité. Cela n'ajoute rien de nouveau. - Esa Jokinen