我正在尝试使用Chef solo在Vagrant盒子上设置postgresql并遇到一些问题。我需要默认的postgres编码/语言环境为UTF8。默认情况下,exact64 Ubuntu框的语言环境设置为“C”,因此postgres使用LATIN1进行编码。这就是我到目前为止所做的:
我有一个厨师配方,通过执行以下操作来设置区域设置:
template "/etc/profile.d/lang.sh" do
source "lang.sh.erb"
mode "0644"
end
execute "locale-gen" do
command "locale-gen en_US.UTF-8"
end
execute "dpkg-reconfigure-locales" do
command "dpkg-reconfigure locales"
end
其中lang.sh.erb看起来像:
export LANGUAGE="en_US.UTF-8"
export LANG="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"
这会正确设置区域设置,但遗憾的是它不会修改当前环境。所以我有另一个配方,在包括postgresql之前设置ENV
ENV["LANGUAGE"] = ENV["LANG"] = ENV["LC_ALL"] = "en_US.UTF-8"
include_recipe "postgresql::server"
这没有效果。语言环境设置正确:
postgres@precise64:~$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
但是postgres在安装时使用了“C”语言环境。
postgres@precise64:~$ psql -l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+---------+-------+-----------------------
postgres | postgres | LATIN1 | en_US | en_US |
template0 | postgres | LATIN1 | en_US | en_US | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | LATIN1 | en_US | en_US | =c/postgres +
| | | | | postgres=CTc/postgres
(3 rows)
为了归因,我从http://www.softr.li/blog/2012/05/22/chef-recipe-to-install-a-postgresql-server-on-a-machine-configured-with-en_us-locales得到了所有这些。
答案 0 :(得分:3)
我发现对我有用的解决方案是在bootstrap shell脚本中,或者作为内联shell,在运行任何配方之前将/etc/default/lang.sh复制到该框。 (所以应该在框定义后在Vagrant文件中完成第一件事) 郎文件:
export LANGUAGE=en_US.UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
从这里开始,数据库应该使用UTF-8编码进行设置。 希望这有帮助,因为我花了几天时间寻找解决方案,并提出了各种讨论中的点点滴滴,但意识到问题是设置值的时间......
答案 1 :(得分:1)
环境变量不适用于厨师资源。
根据postgresql cookbook,您应该在初始化数据库时设置属性node['postgresql']['initdb_locale']
以设置区域设置。例如,在name: server
:
.kitchen.yml
下使用此部分
attributes:
postgresql:
initdb_locale: "en_US.UTF_8"
答案 2 :(得分:1)
您可以在事后删除并重新创建postgres模板数据库为UTF-8。不是一个完美的解决方案,但它确实适用于您的厨师食谱。请参阅:http://www.pebra.net/blog/2013/06/10/when-struggling-with-postgresql-and-utf8-slash-latin/
include_recipe "postgresql::server"
include_recipe "database::postgresql"
execute "Psql template1 to UTF8" do
user "postgres"
command <<-SQL
echo "
UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';
DROP DATABASE template1;
CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UNICODE' LC_CTYPE='en_US.utf8' LC_COLLATE='en_US.utf8';
UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';
\\c template1
VACUUM FREEZE;" | psql postgres -t
SQL
# only_if '[ $(echo "select count(*) from pg_database where datname = \'template1\' and datcollate = \'en_US.utf8\'" |psql postgres -t) -eq 0 ]'
end