Я пытаюсь написать сценарий bash для установки сервера PostgreSQL на Debian 6 VPS. Я продолжаю протирать сервер и хочу написать что-нибудь для его автоматической установки.
#!/bin/bash
export PATH=/bin:/usr/bin:/sbin:/usr/sbin
function print_info {
echo -n -e '\e[1;36m'
echo -n $1
echo -e '\e[0m'
}
function print_warn {
echo -n -e '\e[1;33m'
echo -n $1
echo -e '\e[0m'
}
function check_install {
if [ -z "`which "$1" 2>/dev/null`" ]
then
executable=$1
shift
while [ -n "$1" ]
do
DEBIAN_FRONTEND=noninteractive apt-get -q -y install "$1"
print_info "$1 installed for $executable"
shift
done
else
print_warn "$2 already installed"
fi
}
check_install postgresql postgresql
sudo -u postgres psql -c"ALTER user postgres WITH PASSWORD '$1'"
sudo service postgresql restart
Однако это не удается.
root@server:~# bash -x ./pgsql.sh password
+ export PATH=/bin:/usr/bin:/sbin:/usr/sbin
+ PATH=/bin:/usr/bin:/sbin:/usr/sbin
+ check_install postgresql postgresql
++ which postgresql
+ '[' -z '' ']'
+ executable=postgresql
+ shift
+ '[' -n postgresql ']'
+ DEBIAN_FRONTEND=noninteractive
+ apt-get -q -y install postgresql
Reading package lists...
Building dependency tree...
Reading state information...
postgresql is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 7 not upgraded.
+ print_info 'postgresql installed for postgresql'
+ echo -n -e '\e[1;36m'
+ echo -n postgresql installed for postgresql
postgresql installed for postgresql+ echo -e '\e[0m'
+ shift
+ '[' -n '' ']'
+ sudo service postgresql start
+ sudo -u postgres psql '-cALTER user postgres WITH PASSWORD '\''password'\'''
perl: warning: Setting locale failed.
perl: warning: Falling back to the standard locale ("C").
could not change directory to "/root"
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
+ sudo service postgresql restart
Ваш сценарий работает нормально. Я просто выполнил его на чистом debian wheezy, и он работал нормально. Итак, проблема не в вашем скрипте, а в том, что ваша база данных SQL не работает, поэтому вы не можете делать никаких запросов.
psql: could not connect to server: No such file or directory
Ошибка «нет такого файла» возникает из-за того, что вы используете sudoing в корневом каталоге для пользователя, у которого нет разрешений на его присутствие.
root@debian:~# sudo -u postgres ls
ls: cannot open directory .: Permission denied
root@debian:~# sudo -u postgres pwd
/root
Писать сценарии - это хорошо, но нужно думать о сервере как о скоте, а не о домашнем животном. Установленный postgresql с паролем - это состояние, и поскольку скрипт может дать сбой по разным причинам, его нельзя рассматривать как надежный. Когда вы устанавливаете любой инструмент автоматизации, вы можете легко настроить сервер по своему усмотрению и быть уверенным, что результат (состояние сервера) (почти) всегда будет таким, как вы хотели.
Например, марионетка будет выполнять эту работу с модулем postgres с одним вкладышем:
class { 'postgresql::server': postgres_password => 'password' }
В сообщении об ошибке говорится, что невозможно подключиться к серверу; поскольку вы ничего не устанавливаете (в выводе postgres уже установлен), он не будет проверять, что он успешно запустился.
Вы можете добавить следующее:
check_install postgresql postgresql
sudo service postgresql start
sudo -u postgres psql -c"ALTER user postgres WITH PASSWORD '$1'"
sudo service postgresql restart
Как сказал Том Шоу в своих комментариях, вы можете добавить set -x
в ваш скрипт, чтобы он выводил каждую строку вашего скрипта оболочки перед его запуском, чтобы вы могли точно видеть, что он делает. Кроме того, вы можете использовать set -e
чтобы он завершился, если он когда-либо обнаружит ненулевое значение - что может помочь в будущем; то есть, если postgres не удается установить, нет смысла пытаться перезапустить его и т. д.