неопределенная переменная ansible собрать факты

Некоторые вещи, которые вам не хватает:

  • Переменные оболочки хранятся в памяти оболочки; то есть память процесса оболочки.
  • Большинство команд, запускаемых из оболочки выполняются в дочернем процессе (или процессах ). Единственными исключениями являются «встроенные -в команды».
  • Асинхронные команды всегда выполняются в дочернем процессе. — даже если они не запускают никаких программ. Асинхронная команда, которая не запускает никаких программ — это дочерний процесс, который запускает только оболочку. Это известно как «вспомогательная оболочка -».
  • Вообще говоря, процессы не могут изменять память других процессов. В частности, оболочки sub -не могут изменять переменные в основном процессе оболочки. Итак, когда вы произносите appendnum $no &, функция appendnumне может изменять переменную xв основном процессе оболочки.

Вы можете получить что-то похожее на поведение, которое вы пытаетесь получить с помощью этого:

x=TR007.out
> "$x"
appendnum() {
    echo "$1" >> "$x"
}
for no in {0..10}
do
    appendnum $no &
done
wait

Вы получите числа от 0 до 10, записанные в файл TR007.out.

  • Планирование (последовательности )асинхронных процессов не определено. Таким образом, в приведенном выше примере сценария в то время как вы получите числа от 0 до 10, записанные в файл, они могут быть не в порядке.
  • Как вы, возможно, знаете, waitсам по себе (без аргументов )будет ждать всех дочерних процессов.
  • «Независимо от количества задач мое время отклика должно быть одинаковым». Это очень смелое ожидание/просьба. Разумно ли это, зависит от контекста. Если задача является однопоточной -многопоточной вычислительной -интенсивной задачей, и у вас есть три или более (логических )ЦП, тогда да, может быть разумно ожидать, что три задачи будут выполняться параллельно занять немного больше времени, чем один сам по себе. Но если у вас есть четыре логических процессора, совершеннонеразумноожидать выполнения 50 задач за то же время, которое требуется для запуска одного.
  • Я упомянул, что дочерние (асинхронные )процессы работать в ожидаемом порядке. Поскольку они работают одновременно (, то есть параллельно ), их выполнение, вероятно, будет перекрываться. Итак, если мы изменим приведенный выше скрипт, чтобы он выполнял
    appendnum() {
        echo "$1"a >> "$x"
        echo "$1"b >> "$x"
    }
    for no in {1..3}
    do
        appendnum $no &
    done
    , вы можете получить 1a/ 1b/ 2a/ 2b/ 3a/ 3bв файле — или вы можете получить 2a/ 2b/ 1a/ 1b/ 3a/ 3b, или вы можете получить 2a/ 1a/ 2b/ 3a/ 3b/ 1bили хуже. Запись асинхронных процессов в один и тот же файл — плохая идея.

Вероятно, вам следует сделать что-то вроде

for no in {1..3}
do
    task"$no" > file"$no" &
done
wait
cat file1 file2 file3 > combined_result
Другие примечания :
  • $(command)делает то же самое как `command`. Вам следует придерживаться формы $(command).
  • Нет смысла говорить x=`echo $x$num`или x=$(echo $x$num). Просто скажите x="$x$num".
  • Переменные оболочки всегда следует заключать в кавычки. если у вас нет веской причины не делать этого, и вы уверены, что знаете, что делаете. Так что не делайте appendnum $no; делать appendnum "$no"и т. д.
1
25.01.2021, 18:24
1 ответ

Вы бы использовали {{hostvars['inventory_hostname']['...']}}. Но если вы не хотите получать доступ к информации с других хостов, вы можете изменить свой шаблон (stats.j2 )на

Arch: {{ansible_architecture}}
0
18.03.2021, 22:34

Теги

Похожие вопросы