Мова, що залежить від домену, значною мірою залежить від кількості написаного коду. Наприклад, ви можете стверджувати, що різниці між ними немає:
chmod 640 /my/file
і
file { "/my/file":
mode => 640,
}
але є велика різниця між цими:
FILE=/my/file
chmod 640 $FILE
chown foo $FILE
chgrp bar $FILE
wget -O $FILE "http://my.puppet.server/dist/$FILE"
# where the URL contains "Hello world"
і
file { "/my/file":
mode => 640,
owner => foo,
group => bar,
content => "Hello world",
}
Що станеться, якщо wget виходить з ладу? Як ваш сценарій вирішить це? А що станеться, якщо після цього у вашому скрипті є щось, для чого потрібен $ FILE з правильним вмістом?
Ви можете стверджувати, що його можна було просто поставити echo "Hello world" > $FILE
в сценарій, за винятком того, що в першому прикладі сценарій повинен бути запущений на клієнті, тоді як маріонетковий компілює все це на сервері. Отже, якщо ви зміните вміст, вам потрібно змінити його лише на сервері, і він змінить його для стільки систем, скільки ви хочете розмістити на ньому. А лялечка обробляє залежності і переносить проблеми для вас автоматично.
Порівняння просто немає - належні засоби управління конфігурацією економлять ваш час та складність. Чим більше ви намагаєтеся зробити, тим більше сценаріїв оболонок здаються недостатніми, і тим більше зусиль ви заощадите, роблячи це з лялькою.