I am trying to setup CircleCI with Elasticsearch in my Rails application. I think have the image configured, but how do I connect to it in CI?
我试图在我的Rails应用程序中使用Elasticsearch设置CircleCI。我认为配置了图像,但如何在CI中连接它?
So far I have tried...
到目前为止我试过......
https://github.com/elastic/elasticsearch/issues/23866
https://github.com/elastic/elasticsearch/issues/23866
Error Message
错误信息
Elasticsearch::Transport::Transport::Errors::Unauthorized: [401]
Circle YAML Config
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
Elastic Search Initializer
弹性搜索初始化程序
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
2 个解决方案
#1
1
The official docker images from elastic come with x-pack preinstalled.
弹性的官方码头图像预装了x-pack。
https://www.elastic.co/guide/en/elasticsearch/reference/5.4/docker.html
https://www.elastic.co/guide/en/elasticsearch/reference/5.4/docker.html
That means that your elasticsearch instance is running with security enabled, but you do not appear to be providing any security credentials to your elasticsearch client, and so you get an unauthorised (401
) error when you try to connect.
这意味着您的elasticsearch实例在启用安全性的情况下运行,但您似乎没有向elasticsearch客户端提供任何安全凭据,因此当您尝试连接时会出现未经授权的(401)错误。
You should either turn off security in your ES instance by adding xpack.security.enabled: false
to your elasticsearch.yml
, or provide valid credentials in your request.
您应该通过向elasticsearch.yml添加xpack.security.enabled:false来关闭ES实例中的安全性,或者在请求中提供有效的凭据。
#2
0
(Posted on behalf of the question author).
(代表作者提问)。
From the other answer provided:
从另一个答案提供:
development: &default
host: 'http://localhost:9200/'
transport_options:
request:
timeout: !!integer 300
test:
<<: *default
staging:
<<: *default
continous_integration:
<<: *default
xpack.security.enabled: false
#1
1
The official docker images from elastic come with x-pack preinstalled.
弹性的官方码头图像预装了x-pack。
https://www.elastic.co/guide/en/elasticsearch/reference/5.4/docker.html
https://www.elastic.co/guide/en/elasticsearch/reference/5.4/docker.html
That means that your elasticsearch instance is running with security enabled, but you do not appear to be providing any security credentials to your elasticsearch client, and so you get an unauthorised (401
) error when you try to connect.
这意味着您的elasticsearch实例在启用安全性的情况下运行,但您似乎没有向elasticsearch客户端提供任何安全凭据,因此当您尝试连接时会出现未经授权的(401)错误。
You should either turn off security in your ES instance by adding xpack.security.enabled: false
to your elasticsearch.yml
, or provide valid credentials in your request.
您应该通过向elasticsearch.yml添加xpack.security.enabled:false来关闭ES实例中的安全性,或者在请求中提供有效的凭据。
#2
0
(Posted on behalf of the question author).
(代表作者提问)。
From the other answer provided:
从另一个答案提供:
development: &default
host: 'http://localhost:9200/'
transport_options:
request:
timeout: !!integer 300
test:
<<: *default
staging:
<<: *default
continous_integration:
<<: *default
xpack.security.enabled: false