4

Chef Solo を使用して Vagrant ボックスに postgresql をセットアップしようとしていますが、いくつかの問題が発生しています。デフォルトの postgres エンコーディング/ロケールを UTF8 にする必要があります。デフォルトでは、precision64 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 .

4

3 に答える 3

3

私にとってうまくいった解決策は、ブートストラップ シェル スクリプトまたはインライン シェルのいずれかで、レシピを実行する前に /etc/default/lang.sh をボックスにコピーすることであることがわかりました。(したがって、ボックス定義の後に Vagrant ファイルで最初に行う必要があります) lang ファイル:

export LANGUAGE=en_US.UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

ここから、データベースは UTF-8 エンコーディングでセットアップされます。これに対する解決策を探すのに何日も費やし、さまざまな議論から断片を思いついたので、これが役立つことを願っていますが、問題は値が設定されるタイミングであることに気付きました...

于 2013-11-14T16:20:32.447 に答える
1

環境変数はシェフのリソースでは機能しません。

postgresql cookbookによるとnode['postgresql']['initdb_locale']、データベースの初期化時にロケールを設定する属性を設定する必要があります。たとえば、次のセクションを親セクションの下で使用name: serverします.kitchen.yml

attributes:
  postgresql:
    initdb_locale: "en_US.UTF_8"
于 2013-10-04T13:30:28.987 に答える
1

postgres テンプレート データベースをドロップして、後で UTF-8 として再作成できます。完全な解決策ではありませんが、Chef のレシピでは機能します。参照: 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
于 2014-01-17T18:10:20.617 に答える