GNU/Linux >> Znalost Linux >  >> Linux

Nastavení názvu hostitele:FQDN nebo krátký název?

Řešení 1:

Volil bych konzistentní přístup napříč celým prostředím. Obě řešení fungují dobře a zůstanou kompatibilní s většinou aplikací. Existuje však rozdíl ve ovladatelnosti.

Používám krátký název jako nastavení HOSTNAME a nastavuji FQDN jako první sloupec v /etc/hosts pro IP adresu serveru, za kterou následuje krátký název.

Nesetkal jsem se s mnoha softwarovými balíčky, které by vynucovaly nebo zobrazovaly preference mezi těmito dvěma. Krátký název považuji za čistší pro některé aplikace, konkrétně protokolování. Možná jsem měl smůlu, když jsem viděl interní domény jako server.northside.chicago.rizzomanufacturing.com . Kdo to chce vidět v protokolech nebo výzvách shellu ?

Někdy se podílím na akvizicích nebo restrukturalizacích společností, kde se mění interní domény a/nebo subdomény. V těchto případech rád používám krátký název hostitele, protože protokolování, starty, tisk, monitorování systémů atd. nepotřebují úplnou rekonfiguraci, aby odpovídaly novým názvům domén.

Typické nastavení serveru RHEL/CentOS pro server s názvem „rizzo“ s interní doménou „ifp.com“ by vypadalo takto:

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

Řešení 2:

Téměř veškerý software je citlivý na správné nastavení názvu hostitele. Když jsem pracoval v Digg, jednou jsem celý web na 2 hodiny zrušil kvůli zdánlivě nevinné změně v /etc/hosts které ovlivnily systémový pojem názvu hostitele. Zlehka našlapujte. To znamená, že zde můžete být mírně zmateni. Nemyslím si, že HOSTNAME= nastavení je přímo ekvivalentní tomu, jak distribuce založené na Debianu používají /etc/hostname .

Co pro mě funguje v heterogenním prostředí je:

  1. Nastavte název hostitele způsobem doporučeným dodavatelem pomocí podmínky ve vašem softwaru pro správu konfigurace.
  2. Použijte hostname příkaz k nastavení názvu hostitele používaného jádrem atd.
  3. V /etc/hosts :

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

Tato konfigurace mě ještě nezklamala.

Řešení 3:

Určitě nebudete mít problém najít na internetu reference, které vám řeknou, abyste to určitě udělali tak či onak. Zdá se mi však, že mít krátký název jako název hostitele a mít plně kvalifikovaný název v /etc/hosts je určitě mnohem převládající. Zdá se to jako rozumnější způsob, protože služby, které potřebují plně kvalifikovaný název, lze upravit tak, aby volaly hostname --fqdn místo toho.

Nedávno jsem narazil na jeden software, který striktně vyžaduje, aby byl fqdn vrácen pomocí hostname , což bylo ganeti. Dokumentují to zde. Nevidím žádný důvod, proč by se nemohly přizpůsobit hostname --fqdn , nicméně.

Řešení 4:

Poněkud okrajově jsem se při zkoumání této otázky zbláznil natolik, že jsem zkontroloval zdrojový kód "hostname" a napsal skript pro tisk výsledků vyšetřování (Fedora 19). Co chybí, je pohled na "/etc/hosts", který by podle mého skromného názoru měl být v první řadě držen mimo to všechno.

#!/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"

Výstup na virtuálním počítači Amazon EC2 se systémem Fedora 19 , po ručním nastavení hodnot jádra a vyplnění /etc/hostname , ale beze změn na /etc/hosts pak by to mohlo být takto:

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

Odolný způsob, jak získat plně kvalifikovaný název hostitele v perlu, by pak byl:

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

a v bash by to bylo:

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
}

Poznámky

Poznámka 1:HOSTNAME je proměnná shellu, kterou poskytuje bash ("Automaticky nastaveno na jméno aktuálního hostitele."), ale nic nenasvědčuje tomu, že bash dosáhne této hodnoty.

Poznámka 2:Nikdy nezapomeňte /etc/hostname v /boot/initrams-FOO.img ...


Linux
  1. Jak změnit název hostitele na Ubuntu

  2. Změňte název hostitele na Ubuntu pomocí GUI a CommandLine

  3. Jak získat název aktuální větve git do proměnné v shell skriptu?

  1. Linux - změňte název hostitele v CLI

  2. Jak získat název počítače (ne jeho název hostitele)?

  3. Jaký je smysl příkazu hostnamectl?

  1. Linux – jaký je výchozí soubor pro `hostname`?

  2. Jak změnit název hostitele?

  3. Nastavení názvu hostitele v Docker Compose