Интерполяция переменной в Jenkinsfile - PullRequest
0 голосов
/ 07 апреля 2020

В следующем скрипте я пытаюсь интерполировать значение i в Jenkinsfile.

host='10.0.0.1 10.0.0.2'
sh 'for i in $host; do echo \"$i\" ; \
sshpass -p root ssh -o StrictHostKeyChecking=no root@${i} \'echo "* * * * * script/test.ksh 6432 \${i} abc xyz" > /var/spool/cron/root\'; \
done'

Он печатает последние $ {i} на консоли, однако корректно интерполирует первые $ {i}. где я делаю что-то не так?

Он печатается как на консоли jenkins

sshpass -p root ssh -o StrictHostKeyChecking=no root@10.0.0.1 'echo " * * * * * scripts/test.ksh 6432 ${i} abc xyz" > /var/spool/cron/root'

1 Ответ

0 голосов
/ 08 апреля 2020

Вы пытаетесь перебрать строку, содержащую значения, а не массив значений.

Обычная оболочка (т. Е. /bin/sh) может оказаться не самым простым способом решения вашей проблемы. Вам также не нужно использовать awk, perl, python или что-то еще. Просто используйте KornShell (/bin/ksh или /usr/bin/ksh в зависимости от вашей среды UNIX). И вы, похоже, действительно создаете скрипт KornShell (test.ksh).

Я буду использовать /bin/ksh в macOS.

Теперь перевернуть строку довольно просто:

typeset host='10.0.0.1 10.0.0.2'
typeset -a hosts=( $host )

Теперь hosts - это массив элементов, которые вы можете перебирать. Вы можете проверить это, набрав:

print -v hosts

, который выдаст:

(
    10.0.0.1
    10.0.0.2
)

Вы можете упростить приведенный выше код, как показано ниже, но я рекомендую придерживаться приведенного выше синтаксиса:

host='10.0.0.1 10.0.0.2'
hosts=( $host )

Итак, теперь мы знаем, как получить доступ к каждому хосту в вашей строке. Это отвечает на ваш первоначальный вопрос. Однако я бы порекомендовал дальнейшие модификации, чтобы избежать кавычек и проблем с глобализацией.

Для этого я бы рекомендовал использовать отдельный скрипт KornShell, скажем update-remote-crontabs.ksh, и вызывать его как:

/path/to/update-remote-crontabs.ksh $host

Содержимое сценария:

#! /bin/ksh

typeset user=root
typeset host

for host in $@; do
    sshpass -p $user ssh -o StrictHostKeyChecking=no  $user@$host \
    $'echo \'* * * * * script/test.ksh 6432 '$host' abc xyz\' > /var/spool/cron/user'
done

Обратите внимание на использование $' для определения строки ANSI C и '$host' для объединения переменной host в нашу литеральную строку.

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

Последний комментарий, > /var/spool/cron/root, насколько мне известно Дурная практика. Вы, вероятно, предпочтете что-то вроде:

(crontab -l; echo '* * * * * script/test.ksh 6432 '$host' abc xyz') | crontab -

Happy KornShell!

...