ExecShellResult не нравятся мои каналы
Я написал следующее ExecShellResult
фрагмент в cfengine v2.2.1a:
control:
active_interface_mac = ( ExecShellResult(/sbin/ifconfig ${active_interface} | /usr/bin/grep 'ether ' | /usr/bin/cut -f2 -d' ') )
...
time_drift = ( ExecShellResult(/usr/sbin/ntpdate -d pool.ntp.org 2>/dev/null | /usr/bin/grep -o 'offset.*sec' | /usr/bin/cut -f2 -d' ') )
...
shellcommands:
"/bin/echo ${time_drift}" inform=true syslog=true
При запуске вышеизложенного из командной строки, это, очевидно, работает нормально:
$ ntpdate ...
0.183693
Однако, если запустить внутри cfengine, я получаю синтаксическую ошибку:
$ cfagent -qIK
Executing script /bin/echo /usr/bin/cut...(timeout=0,uid=-1,gid=-1)
cfengine:/bin/echo /usr/: /usr/bin/cut
cfengine: Finished script /bin/echo /usr/bin/cut
cfengine:
Executing script /bin/echo option requires an argument -- d usage...(timeout=0,uid=-1,gid=-1)
cfengine:/bin/echo opti: option requires an argument -- d usage
cfengine: Finished script /bin/echo option requires an argument -- d usage
cfengine:
Executing script /bin/echo cut -b list [-n] [file ...] cut -c list [file ...] cut -f list [-s] [-d delim] [file ...]...(timeout=0,uid=-1,gid=-1)
cfengine:/bin/echo cut : cut -b list [-n] [file ...] cut -c list [file ...] cut -f list [-s] [-d delim] [file ...]
cfengine: Finished script /bin/echo cut -b list [-n] [file ...] cut -c list [file ...] cut -f list [-s] [-d delim] [file ...]
Обратите внимание, что ошибка отображается при запуске echo
командование под shellcommands:
, К тому времени ${time_drift}
переменная уже была оценена, и ее результат показывает, что мы вызываем cut
"s -d
неверный вариант, жалуясь, что мы ничего не передали -d
что явно не соответствует действительности.
Это сбивает с толку, потому что ${active_interface_mac}
использует тот же синтаксис и работает отлично.
Я попытался заменить второй grep с | tail -1 | sed 's///'
, другой grep -o [0-9]*.[0-9]
или что-нибудь еще, что я мог придумать, в том числе /usr/bin/cut -f1 -d'${spc}'
, Я, видимо, не могу использовать awk
потому что cfengine интерпретирует $(NF)
в скобках, которые являются частью ExecShellResult
даже когда сбежал.
Какие другие опции мне нужны, чтобы получить из моего фактического значения секунд ntpdate
выход?
1 ответ
Я не уверен насчет cfengine 2, я не вижу, что может привести к путанице в вашем примере, но для cfengine 3:
bundle agent main
{
vars:
"ntpdate_s"
string => execresult( "/usr/sbin/ntpdate -d pool.ntp.org 2> /dev/null | /usr/bin/awk '/offset .* sec/ {print $10}'", useshell ),
if => not( isvariable( offset ) );
reports:
"Mac address of wlan0 $(sys.hardware_mac[wlan0])";
"Offset is $(ntpdate_s)";
}
Выход:
R: Mac address of wlan0 5c:e0:c5:9f:f3:8f
R: Offset is 0.027672