CentOS 7: Obtendo números IP da interface

1

Estou tentando autopopular o / etc / issue em uma imagem do CentOS 7 (isso será um modelo, e precisa ser fácil identificar rapidamente as VMs resultantes).

Eu tenho o seguinte no meu / sbin / ifup-local:

#!/bin/bash

cd /etc ;
unlink ./issue ;

sleep 1 ;

issue_original="$(cat ./issue-original)" ;
show_ip="$(ip addr show |awk '$1=="inet" && $2 !~ /^127/ {print "\t"$2}')" ;

co -l ./issue ;
echo -e "${issue_original}\n\n\tCurrent IP Numbers:\n\t===================\n${show_ip}\n" >./issue ;
ci -m -u ./issue ;

O / etc / issue-original parece com:


Logging into:

        Node: \n
        Running: \S


Quando executo o script manualmente ( sudo / sbin / ifup-local; cat / etc / issue ), ele preenche corretamente o arquivo / etc / issue. Quando isso é executado automaticamente (por exemplo, quando é resultado de reinicialização da rede de serviço sudo; cat / etc / issue ), o modelo de arquivo e o texto estático estão lá, mas os números IP estão vazios ( nem linhas vazias).

Estou entendendo errado a ordem de execução (o ifup-local é executado antes dos números IP serem atribuídos)? Parece que isso é no final do / etc / sysconfig / network-scripts / ifup-post, então eu diria que é após o cliente DHCP ter definido as interfaces.

Existe um atraso entre quando os números IP da interface são definidos e quando o comando "ip" sabe sobre eles? A declaração "sleep" está lá porque pensei que poderia ser o caso.

Todos os ponteiros na direção certa são muito apreciados.

Feliz domingo!

==========================

Editar:

Aqui está o que eu vi em / etc / issue depois de reiniciar o serviço de rede.

[david@localhost ~]$ sudo service network restart
Restarting network (via systemctl):                        [  OK  ]
[david@localhost ~]$ cat /etc/issue

Logging into:

        Node: \n
        Running: \S

        Current IP Numbers:
        ===================


[david@localhost ~]$

Além disso, eu tenho instrumentado o script com mensagens copiosas de depuração, para descobrir onde as coisas estão e não estão funcionando. Aqui está o que foi registrado na última execução (trunquei o log antes da execução, para remover informações irrelevantes).

[david@localhost conf.d]$ clear
[david@localhost conf.d]$ >/tmp/ifup-local.log
[david@localhost conf.d]$ tail -f /tmp/ifup-local.log

--------------------------------------------------

2014-10-01 18:50:0808   DEBUG:  PATH: /usr/sbin/:/usr/bin/:/sbin:/usr/sbin:/bin:/usr/bin

2014-10-01 18:50:0808   DEBUG:  PWD: /etc

2014-10-01 18:50:0808   DEBUG:  issue file exists

2014-10-01 18:50:0808   DEBUG:  Removing old issue file

2014-10-01 18:50:0808   DEBUG:  issue_original:
 Logging into: Node: \n Running: \S

2014-10-01 18:50:0808   DEBUG:  about to check the IP numbers

2014-10-01 18:50:0808   DEBUG:  0

2014-10-01 18:50:0909   DEBUG:  show_ip:


2014-10-01 18:50:0909   DEBUG:  checking out issue file to lock it

2014-10-01 18:50:0909   DEBUG:  new_issue:
 Logging into: Node: \n Running: \S

        Current IP Numbers:
        ===================



2014-10-01 18:50:0909   DEBUG:  issue file exists

2014-10-01 18:50:0909   DEBUG:  checked back in issue file


--------------------------------------------------

2014-10-01 18:50:0909   DEBUG:  PATH: /usr/sbin/:/usr/bin/:/sbin:/usr/sbin:/bin:/usr/bin

2014-10-01 18:50:0909   DEBUG:  PWD: /etc

2014-10-01 18:50:0909   DEBUG:  issue file exists

2014-10-01 18:50:0909   DEBUG:  Removing old issue file

2014-10-01 18:50:0909   DEBUG:  issue_original:
 Logging into: Node: \n Running: \S

2014-10-01 18:50:0909   DEBUG:  about to check the IP numbers

2014-10-01 18:50:0909   DEBUG:  0

2014-10-01 18:50:0909   DEBUG:  show_ip:


2014-10-01 18:50:0909   DEBUG:  checking out issue file to lock it

2014-10-01 18:50:0909   DEBUG:  new_issue:
 Logging into: Node: \n Running: \S

        Current IP Numbers:
        ===================



2014-10-01 18:50:0909   DEBUG:  issue file exists

2014-10-01 18:50:0909   DEBUG:  checked back in issue file



Aqui está o script revisado, com todas as mensagens de depuração:

#!/bin/bash

function write-debug() {
        msg="$(date +'%Y-%m-%d %H:%M:%S%S')\tDEBUG:\t$1\n" ;
        echo -e ${msg}  >>${LOGFILE} ;
}


################################################
################################################

set -x ;

export LOGFILE='/tmp/ifup-local.log' ;
export PATH="/usr/sbin/:/usr/bin/:${PATH}" ;

echo -e "\n--------------------------------------------------\n" >>${LOGFILE} ;
write-debug "PATH: ${PATH}" ;

cd /etc ;

write-debug "PWD: $(pwd)" ;
[[ -a ./issue ]] && write-debug "issue file exists" || write-debug "no existing issue file" ;
write-debug "Removing old issue file" ;

[[ -a ./issue ]] && unlink ./issue || write-debug "no issue file to remove" ;

issue_original="$(cat ./issue-original)" ;
write-debug "issue_original:\n${issue_original}" ;

write-debug "about to check the IP numbers" ;
show_ip="$(ip addr show |awk '$1=="inet" && $2 !~ /^127/ {print "\t"$2}')" ;
#show_ip="$(ip addr show |fgrep 'inet ')" ;
write-debug $? ;
write-debug "show_ip:\n ${show_ip}" ;

write-debug "checking out issue file to lock it" ;

[[ -a ./issue ]] && write-debug "issue file exists" || "no existing issue file" ;
co -l ./issue ;
export new_issue="${issue_original}\n\n\tCurrent IP Numbers:\n\t===================\n${show_ip}\n" ;
write-debug "new_issue:\n${new_issue}" ;
echo -e "${new_issue}" >./issue ;

[[ -a ./issue ]] && write-debug "issue file exists" || "no existing issue file" ;

ci -m -u ./issue ;

write-debug "checked back in issue file" ;

    
por DTK 28.09.2014 / 17:44

3 respostas

0

Eu encontrei a resposta: a informação não está disponível para o comando "ip" até que a mudança de rede (do "sudo service network restart" ou a reinicialização) esteja completa. Como a mudança de rede faz com que "/ etc / sysconfig / network-scripts / ifup-post" seja executado antes de ser concluído, o que por sua vez chama "/ sbin / ifup-local" para ser executado antes de terminar, "ip "chamado dentro de" / sbin / ifup-local "chamado automaticamente nunca pode ter essa informação. Para resolver isso, renomeiei o script de "/ sbin / ifup-local" para "/ sbin / update-issue" e criei um novo "/ sbin / ifup-local" que chama "/ sbin / update-issue" de forma assíncrona . Agora funciona.

=====

" / sbin / ifup-local ":

#!/bin/sh

nohup (sleep 1 ; /sbin/update-issue) &

=====

" / sbin / update-issue ":

#!/bin/bash

function write-debug() {
        msg="$(date +'%Y-%m-%d %H:%M:%S%S')\tDEBUG:\t$1\n" ;
        echo -e ${msg}  >>${LOGFILE} ;
}


################################################
################################################

set -x ;

export LOGFILE='/tmp/ifup-local.log' ;
export PATH="/usr/sbin/:/usr/bin/:${PATH}" ;

echo -e "\n--------------------------------------------------\n" >>${LOGFILE} ;
write-debug "PATH: ${PATH}" ;

cd /etc ;

write-debug "PWD: $(pwd)" ;
[[ -a ./issue ]] && write-debug "issue file exists" || write-debug "no existing issue file" ;
write-debug "Removing old issue file" ;

[[ -a ./issue ]] && unlink ./issue || write-debug "no issue file to remove" ;

issue_original="$(cat ./issue-original)" ;
write-debug "issue_original:\n${issue_original}" ;

write-debug "about to check the IP numbers" ;
show_ip="$(ip addr show |awk '$1=="inet" && $2 !~ /^127/ {print "\t"$2}')" ;
#show_ip="$(ip addr show |fgrep 'inet ')" ;
write-debug $? ;
write-debug "show_ip:\n ${show_ip}" ;

write-debug "checking out issue file to lock it" ;

[[ -a ./issue ]] && write-debug "issue file exists" || "no existing issue file" ;
co -l ./issue ;
export new_issue="${issue_original}\n\n\tCurrent IP Numbers:\n\t===================\n${show_ip}\n" ;
write-debug "new_issue:\n${new_issue}" ;
echo -e "${new_issue}" >./issue ;

[[ -a ./issue ]] && write-debug "issue file exists" || "no existing issue file" ;

ci -m -u ./issue ;

write-debug "checked back in issue file" ;

    
por 04.10.2014 / 16:09
1

Se você quiser mostrar o endereço IP no /etc/issue , poderá usar no arquivo de problemas. De man agetty , sob ISSUE ESCAPES :

4 or 4{interface}

Insert the IPv4 address of the specified network interface (for example: {eth0}). If the interface argument is not specified, then select the first fully configured (UP, non-LOCALBACK, RUNNING) >interface. If not any configured interface is found, fall back to the IP address of the machine's hostname.

6 or 6{interface}

The same as but for IPv6.

Isso é agetty from util-linux 2.28.2 do Ubuntu.

    
por 19.06.2017 / 17:00
0

Eu acho que esse problema está no caminho. O comando ip está no diretório / sbin.

Geralmente - esse diretório não está no caminho, exceto o usuário root, portanto, usá-lo em scripts pode causar problemas.

Tente usar / sbin / ip em vez do comando ip.

    
por 28.09.2014 / 23:13