【问题标题】:Chef ENV settings not working厨师 ENV 设置不起作用
【发布时间】:2013-10-10 07:21:09
【问题描述】:

我正在尝试使用 Chef solo 在 Vagrant 盒子上设置 postgresql,但遇到了一些问题。我需要默认的 postgres 编码/语言环境为 UTF8。默认情况下,精确 64 位 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得到了这一切。

【问题讨论】:

标签: postgresql ubuntu chef-infra vagrant


【解决方案1】:

我发现对我有用的解决方案是在引导 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 编码进行设置。 希望这会有所帮助,因为我花了几天时间寻找解决方案,并从各种讨论中提出了一些点点滴滴,但意识到问题在于设置值的时间......

【讨论】:

  • 我想我应该想到这一点。谢谢。
  • @Kevin,你能给我一个例子吗?我也在为同样的厨师食谱而苦苦挣扎。
  • @zigomir 好的,所以这不是最好的方法,但是在初始设置之后,您可以执行以下操作:config.vm.provision :shell, inline: "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,它就可以工作。谢谢!
【解决方案2】:

环境变量不适用于厨师资源。

根据postgresql cookbook,您应该在初始化数据库时设置属性node['postgresql']['initdb_locale'] 来设置语言环境。例如,在您的.kitchen.yml 中使用父部分name: server 下的此部分:

attributes:
  postgresql:
    initdb_locale: "en_US.UTF_8"

【讨论】:

  • 不幸的是,这“仅适用于 EL 系列发行版(RedHat/Centos/etc.)”。
  • @Jake 你可以运行 service postgresql initdb <your-locale> 在 ubuntu 上运行。
  • 该命令在 Ubuntu 上不存在。 vagrant@precise64:~$ sudo service postgresql initdb en_US.UTF8 Usage: /etc/init.d/postgresql {start|stop|restart|reload|force-reload|status} [version ..]
  • @JonasNielsen 不。我最终基本上编写了 pg_dropcluster 和 pg_createcluster 脚本来破解它的工作,但我仍然没有解决如何让 Ubuntu 在安装 postgres 时使用正确的语言环境进行安装。
【解决方案3】:

您可以在事后将 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

【讨论】:

    猜你喜欢
    • 2015-11-02
    • 2014-03-09
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多