Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 厨师长环境设置不工作_Postgresql_Ubuntu_Chef Infra_Vagrant - Fatal编程技术网

Postgresql 厨师长环境设置不工作

Postgresql 厨师长环境设置不工作,postgresql,ubuntu,chef-infra,vagrant,Postgresql,Ubuntu,Chef Infra,Vagrant,我正在尝试使用Chef solo在一个流浪的盒子上设置postgresql,但遇到了一些问题。我需要默认的postgres编码/区域设置为UTF8。默认情况下,precise64 Ubuntu框的语言环境设置为“C”,因此postgres使用拉丁语1进行编码。这就是我到目前为止所做的: 我有一个厨师食谱,通过执行以下操作来设置区域设置: template "/etc/profile.d/lang.sh" do source "lang.sh.erb" mode "0644" end

我正在尝试使用Chef solo在一个流浪的盒子上设置postgresql,但遇到了一些问题。我需要默认的postgres编码/区域设置为UTF8。默认情况下,precise64 Ubuntu框的语言环境设置为“C”,因此postgres使用拉丁语1进行编码。这就是我到目前为止所做的:

我有一个厨师食谱,通过执行以下操作来设置区域设置:

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)

为了归属起见,我从中获得了所有这些。

环境变量不适用于chef资源

根据,您应该在初始化数据库时设置属性
节点['postgresql']['initdb_locale']
,以设置区域设置。例如,在
.kitchen.yml
中的父节
name:server
下使用此节:

attributes:
  postgresql:
    initdb_locale: "en_US.UTF_8"

我发现对我有效的解决方案是在启动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编码进行设置。
希望这能有所帮助,因为我花了几天时间寻找解决方案,从各种讨论中总结出了一些细节,但意识到问题在于设置值的时间…

您可以在事后删除postgres模板数据库并将其重新创建为UTF-8。这不是一个完美的解决方案,但它确实适用于你的厨师食谱。见:

include_recipe“postgresql::server”
包括“数据库::postgresql”
执行“Psql模板1到UTF8”do
用户“postgres”

不幸的是,这个命令“仅对EL系列发行版(RedHat/Centos/etc.)有效”。@Jake您可以运行
服务postgresql initdb
,在ubuntu上运行。该命令在ubuntu上不存在<代码>vagrant@precise64:~$sudo service postgresql initdb en_US.UTF8用法:/etc/init.d/postgresql{start | stop | restart | reload | force reload | status}[version..
@JonasNielsen No.我基本上编写了一个pg u dropcluster和pg u createcluster脚本,让它正常工作,但我仍然没有解决如何让Ubuntu在安装postgres时使用正确的语言环境进行安装。我想我应该想到这一点。谢谢。@Kevin,你能给我举个例子吗。同样的厨师食谱,我也在为同样的问题而挣扎。@zigomir好的,所以这不是最好的方法,但在初始设置之后,您可以这样做:
config.vm.provision:shell,内联:“cp/vagrant/cookbooks/dbsetup/files/default/lang.sh/etc/profile.d/lang.sh”
在vagrant文件中初始框设置之后。只需将这些行放在主机上cookbooks/dbsetup/files/default文件夹的lang.sh中。有意义吗?我实际上也是这样做的,但是我把它复制到了
/etc/default/lang.sh
(复制自你的答案),但是现在,如果我复制到
/etc/profile.d/lang.sh
,它就可以工作了。非常感谢。我发现这是一个有点黑客,但相当有用
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