在CircleCI中设置Elasticsearch和Ruby on Rails

我试图在我的Rails应用程序中使用Elasticsearch设置CircleCI。 我认为配置了图像,但如何在CI中连接它?

到目前为止我试过……

https://github.com/elastic/elasticsearch/issues/23866

错误信息

Elasticsearch::Transport::Transport::Errors::Unauthorized: [401] 

Circle YAML配置

 version: 2 jobs: build: working_directory: ~/gathrly-smartforms docker: - image: circleci/ruby:2.4.1-node environment: RAILS_ENV: continous_integration PGHOST: 127.0.0.1 PGUSER: rails_test_user - image: circleci/postgres:9.6.3-alpine environment: POSTGRES_USER: rails_test_user POSTGRES_PASSWORD: "" POSTGRES_DB: continous_integration - image: redis:4.0.2 - image: docker.elastic.co/elasticsearch/elasticsearch:5.4.2 steps: - checkout - restore_cache: keys: - my-application-{{ checksum "Gemfile.lock" }} - my-application- - save_cache: key: rails-demo-{{ checksum "Gemfile.lock" }} paths: - vendor/bundle - run: name: Setup Bundler and Gems command: | gem install bundler gem update bundler gem install brakeman gem install rubocop gem install rubocop-rspec gem install scss_lint gem install eslint-rails gem install execjs bundle config without development:test bundle check --path=vendor/bundle || bundle install --without development test --path=vendor/bundle --jobs 4 --retry 3 - run: name: Setup Postgres command: | sudo apt-get install postgresql-client - run: name: Setup Rails Database command: | RAILS_ENV=continous_integration bundle exec rake db:drop RAILS_ENV=continous_integration bundle exec rake db:setup - run: name: Run Rspec command: | RAILS_ENV=continous_integration bundle exec rspec --format RspecJunitFormatter -o /tmp/test-results/rspec.xml - store_test_results: path: /tmp/test-results 

弹性搜索初始化程序

 require 'faraday_middleware/aws_signers_v4' if Rails.env.production? || Rails.env.staging? Elasticsearch::Model.client = Elasticsearch::Client.new(url: ENV["AWS_ELASTICSEARCH_HOST"]) do |f| f.request :aws_signers_v4, credentials: Aws::Credentials.new(ENV['AWS_ACCESS_KEY'], ENV['AWS_ACCESS_SECRET_KEY']), service_name: 'es', region: ENV['AWS_REGION'] f.adapter Faraday.default_adapter end else config = { host: "http://127.0.0.1:9200", transport_options: { request: { timeout: 5 } } } if File.exists?("config/elasticsearch.yml") config.merge!(YAML.load_file("config/elasticsearch.yml")) end Elasticsearch::Model.client = Elasticsearch::Client.new(config) end 

弹性的官方docker图像预装了x-pack。

https://www.elastic.co/guide/en/elasticsearch/reference/5.4/docker.html

这意味着您的elasticsearch实例在启用安全性的情况下运行,但您似乎没有向elasticsearch客户端提供任何安全凭据,因此当您尝试连接时会出现未经授权的( 401 )错误。

您应该通过向xpack.security.enabled: false添加xpack.security.enabled: false来关闭ES实例中的安全性,或者在请求中提供有效的凭据。

(代表作者提问)

从另一个答案提供:

 development: &default host: 'http://localhost:9200/' transport_options: request: timeout: !!integer 300 test: <<: *default staging: <<: *default continous_integration: <<: *default xpack.security.enabled: false 
Interesting Posts