4

私は現在、コミュニティMySQLクックブックを更新して、Perconaのインストールに使用できるようにしています。これは、ストックMySQLの代わりになりますが、HAとクラスタリングを簡単に有効にする機能がいくつか追加されています。

クックブック内で「ruby」レシピを使用できるようになるまで、すべての追加はうまく機能しました。これは、「chef_gem」プロバイダーを使用して「mysql」rubygemをインストールします。これはネイティブ拡張であるため、コンパイルする必要があります。これを行うには、MySQLの開発ファイルをインストールする必要があります。

通常のMySQLバイナリを使用する場合、MySQLはすでにCentosリポジトリにあるため、すべてが正常に機能します。ただし、Perconaパッケージをインストールできるようにするには、リポジトリが「/etc/yum.repos.d」にあることを確認する必要があります。私が抱えている問題は、mysqlgemをインストールする前にchefにその作業を行わせることができないことです。

したがって、システムはMySQL(Percona)の開発ヘッダーファイルをインストールせずにmysql gemをコンパイルしようとしますが、正しく参照されていても、リポジトリがセットアップされていないため見つかりません。

'yum'プロバイダーを使用してこの作業を行う'percona-repo'レシピを作成しましたが、'chef_gem'が実行する前に実行されません。chefには実行用の2つのフェーズがあることを知っています。また、「chef_gem」は、実行リスト全体のどこにあるかに関係なく、コンパイルフェーズですべてのgemを収集し、最初に要求されたすべてのアイテムをインストールすると想定しています。その後、リポジトリレシピが実行されます。

私は次のようなことをするためにRubyレシピをいじってみました:

include_recipe "mysql::percona_repo"

node['mysql']['client']['packages'].each do |mysql_pack|
    package mysql_pack do
        action :nothing
    end.run_action(:install)
end

chef_gem "mysql" do
   action :nothing
end.run_action(:install)

しかし、これは機能しません。chef_gemは常に私の「precona_repo」レシピの前に実行されるため、パッケージのインストールは失敗します。これまでに到達した場合、rubygemのインストールも失敗することになります。

私がこれをどのように解決できるかについて誰かが何か明るいアイデアを持っているなら、私に知らせてください。

アップデート

Markからの提案のおかげで、「ruby」レシピを更新して、リソースを呼び出して新しいキーとリポジトリをサーバーに追加できるようになりました。

resources(:yum_key => "RPM-GPG-KEY-percona").run_action(:add)
resources(:yum_repository => "Percona").run_action(:add)

そして今、私はこれらがシェフの実行でアクティブ化されているのを見ることができます。ただし、ファイルシステムを見ると、ファイルが存在しないため、mysqlクライアントパッケージのインストールが失敗します。

yumクックブックを調べてみたところ、yum_keyのプロバイダーが「remote_file」を実行してキーをダウンロードしようとしていることがわかりました。ただし、この'remote_file'は実行されていません。そこで、これを上記のようなリソースとして実行しようとしましたが、名前に変数が含まれているため、効果的に呼び出すことができません。例:

remote_file "/etc/pki/rpm-gpg/#{new_resource.key}" do
    ...
end

私はここでうさぎのウォーレンを少し降り始めていると思います。私はそれを機能させるために努力し続けますが、それ以上のアイデアは大歓迎です。私は自分が仕事を知っているものを再利用することを好むので、このレシピのリポジトリに直接コーディングするルートをたどらないようにしています。

4

2 に答える 2

1

レシピから必要なリソースが何であれpercona_repo、その前に手動で目的のアクションを呼び出すだけchef_gemです。

たとえば、必要なものが次のようになっている場合:

yum_repo "percona-repo" do
  action :install
 ...
end

chef_gem次に、宣言の直前にこれを行うことができます。

resources(:yum_repo => 'percona-repo').run_action(:install)

残念ながら、これにより2つのレシピが緊密に結合されますが、「シェフ、このレシピを含めて、後でではなくすぐにすべてを実行する」と言う方法はありません。

于 2012-11-01T02:17:46.133 に答える
1

さて、うさぎの穴をずっと下って行きました。

これは機能しているようです。

include_recipe "percona::client"

resources(:yum_key => "RPM-GPG-KEY-percona").run_action(:add)
begin
  resources(:remote_file => "/etc/pki/rpm-gpg/RPM-GPG-KEY-percona").run_action(:create)
rescue Chef::Exceptions::ResourceNotFound
end

resources("yum_repository[CentOS-Percona]").run_action(:add)
begin
  resources(:template => "/etc/yum.repos.d/CentOS-Percona.repo").run_action(:create)
rescue Chef::Exceptions::ResourceNotFound
end

%w(
  Percona-Server-shared-compat
  Percona-Server-client-55
  Percona-Server-devel-55
).each do |package|
  package(package).run_action(:install)
end

chef_gem "mysql"
于 2013-01-24T01:28:32.563 に答える