Назад | Перейти на главную страницу

CentOS 7: получение IP-адресов интерфейсов

Я пытаюсь автоматически заполнить / etc / issue в образе CentOS 7 (это будет шаблон, и должно быть легко идентифицировать полученные виртуальные машины с первого взгляда).

В моем / 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 ;

Файл / etc / issue-original выглядит так:


Logging into:

        Node: \\n
        Running: \\S


Когда я запускаю скрипт вручную (sudo / sbin / ifup-local; кот / etc / issue), он правильно заполняет / etc / issue. Когда это запускается автоматически (например, когда это результат перезапуск сети службы sudo; кот / etc / issue), файл-шаблон и статический текст есть, но номера IP пусты (даже не пустые строки).

Я неправильно понимаю порядок выполнения (выполняется ли ifup-local до присвоения IP-адресов)? Похоже, это находится в самом конце / etc / sysconfig / network-scripts / ifup-post, поэтому я предполагаю, что это происходит после того, как клиент DHCP установил интерфейсы.

Есть ли задержка между установкой IP-номеров интерфейса и тем, что команда "ip" знает о них? Утверждение "сна" здесь, потому что я думал, что это может быть так.

Приветствуются любые указатели в правильном направлении.

Счастливое воскресенье!

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

Редактировать:

Вот что я увидел в / etc / issue после перезапуска сетевой службы.

[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 ~]$

Кроме того, я снабдил скрипт подробными отладочными сообщениями, чтобы узнать, где что-то работает, а где не работает. Вот что было зарегистрировано при последнем запуске (я обрезал журнал перед запуском, чтобы удалить постороннюю информацию).

[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



Вот исправленный сценарий со всеми отладочными сообщениями:

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

Если вы хотите показать IP-адрес в /etc/issue, тогда вы сможете использовать \4 в файле проблемы. Из man agetty, под ISSUE ESCAPES:

4 or 4{interface}

Вставьте IPv4-адрес указанного сетевого интерфейса (например: \ 4 {eth0}). Если аргумент интерфейса не указан, выберите первый полностью сконфигурированный (UP, non-LOCALBACK, RUNNING)> интерфейс. Если не найдено ни одного настроенного интерфейса, вернитесь к IP-адресу имени хоста машины.

6 or 6{interface}

То же, что \ 4, но для IPv6.

Это agetty from util-linux 2.28.2 из убунту.

Я нашел ответ: информация недоступна команде "ip" до тех пор, пока не будет выполнено изменение сети (от "перезапуска сети службы sudo" или перезагрузки). Поскольку изменение сети приводит к запуску "/ etc / sysconfig / network-scripts / ifup-post" до его завершения, который, в свою очередь, вызывает "/ sbin / ifup-local" для запуска до его завершения, "ip "вызываемый из" / sbin / ifup-local "вызываемый автоматически, никогда не может иметь эту информацию. Чтобы решить эту проблему, я переименовал сценарий из «/ sbin / ifup-local» в «/ sbin / update-issue» и создал новый «/ sbin / ifup-local», который асинхронно вызывает «/ sbin / update-issue». . Теперь это работает.

=====

"/ sbin / ifup-местные":

#!/bin/sh

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

=====

"/ sbin / обновление-проблема":

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

Я думаю, что проблема в пути. Команда ip находится в каталоге / sbin.

Обычно - этот каталог не находится в пути, кроме пользователя root, поэтому - использование его в скриптах может вызвать проблемы.

Попробуйте использовать / sbin / ip вместо команды ip.