Вопрос или проблема
#!/bin/bash
# Установка необходимых RPM
yum -y install gcc-c++ git
# Загрузка и компиляция node
wget https://nodejs.org/dist/v0.12.7/node-v0.12.7.tar.gz
tar -xvzf node-v0.12.7.tar.gz
cd node-v0.12.7
./configure
make
sudo make install
# Установка pm2 через npm
/usr/local/bin/npm install pm2 -g
# Запуск processes.json
cd /home/admin/Order-Management/
/usr/local/lib/node_modules/pm2/bin/pm2 start processes.json
Вышеприведённый скрипт отлично работает, когда я запускаю его локально, но когда я пытаюсь выполнить его с помощью puppet на клиентской машине, последняя строка выдаёт следующую ошибку.
/usr/bin/env: node: No such file or directory
Я использую RedHat 6 master и RedHat 6 client. Я увидел решение здесь
https://stackoverflow.com/questions/30281057/node-forever-usr-bin-env-node-no-such-file-or-director Однако это не работает для меня.
Возможно, node не в вашем PATH во время выполнения с puppet. Попробуйте этот скрипт:
#!/bin/bash
# Установка необходимых RPM
yum -y install gcc-c++ git
# Загрузка и компиляция node
wget https://nodejs.org/dist/v0.12.7/node-v0.12.7.tar.gz
tar -xvzf node-v0.12.7.tar.gz
cd node-v0.12.7
./configure
make
sudo make install
# Установка pm2 через npm
/usr/local/bin/node /usr/local/bin/npm install pm2 -g
# Запуск processes.json
cd /home/admin/Order-Management/
/usr/local/bin/node /usr/local/lib/node_modules/pm2/bin/pm2 start processes.json
Ответ или решение
Ошибка, с которой вы сталкиваетесь при использовании PM2 внутри bash-скрипта, развернутого через Puppet на RedHat 6, связана с отсутствием правильной конфигурации окружения PATH для node.js. Когда скрипт выполняется напрямую в оболочке, он наследует переменные окружения текущей сессии. Однако при использовании Puppet подобный контекст окружения может быть потерян или сокрыт.
Причина проблемы
Ошибка /usr/bin/env: node: No such file or directory
обычно указывает на то, что Node.js не найден в $PATH. Это может быть связано с тем, что Puppet выполняется с ограниченным окружением PATH, в котором не найден путь к исполняемым файлам Node.js и PM2.
Решение проблемы
1. Явное указание полного пути
Замените вызов node
на полный путь к Node.js и PM2 в вашем скрипте. Убедитесь, что вы используете /usr/local/bin/node
вместо просто node
. Это часто решает проблему, поскольку вы избегаете зависимости от переменной окружения PATH:
/usr/local/bin/node /usr/local/lib/node_modules/pm2/bin/pm2 start processes.json
2. Настройка переменной PATH в окружении Puppet
Вы можете добавить команду для экспорта пути директории Node.js в PATH. Добавьте следующее в вашем скрипте:
export PATH=/usr/local/bin:$PATH
Поместите эту строку в начале вашего скрипта, после первой строки #!/bin/bash
.
3. Подтверждение установки
После установки Node.js и PM2 убедитесь, что они находятся в правильных каталогах, используя команды:
which node
which pm2
Это поможет вам убедиться в том, что Node.js и PM2 правильно установлены и доступны.
4. Проверка разрешений
Также стоит проверить, имеются ли у пользователя, от имени которого Puppet выполняет команду, все необходимые права доступа к Node.js и директории, где находятся ваши файлы.
Заключение
Использование полного пути к Node.js и настройка переменной PATH помогут Puppet точно определять расположение исполняемых файлов, что обеспечивает запуск PM2 без ошибок. Эти изменения гарантируют, что даже в изолированном или ограниченном окружении менеджера конфигураций все компоненты будут доступны для запуска и выполнения скриптов.