2013-07-16 1 views
3

Обратите внимание, что это копия вопроса, который я задал по телефону ServerFault, но не смог получить ответ. Надеюсь, я могу получить здесь несколько отзывов.Как обновить nginx через шеф-повара

Я разработчик, который недавно унаследовал нашу настройку шеф-повара предыдущего персонажа. Я запускаю сервер Chef 10 и понял, что кулинарная книга nginx из opscode по-прежнему использует версию nginx 1.2.6. Поскольку есть много исправлений безопасности, которые были выпущены, я хотел бы перейти к 1.4.1 и почувствовать, что шеф-повар должен сделать это очень просто. Однако это оказалось кошмарным.

Моя первая мысль состояла в том, чтобы просто сделать поваренную книгу nginx «обычай» и изменить атрибут default['nginx']['version'] на 1.4.1, загрузить поваренную книгу и слить тестовый сервер. Я наблюдал, как он извлекал новую версию кулинарной книги (я помню, что обновлял метаданные) и сразу же игнорировал ее, продолжая использовать 1.2.6.

Тогда я думал, что должен переопределить атрибуты в роли, которую я использую (rails_tier_web - это имя роли). Говоря с более опытным шеф-поваром, он предупреждал об этом, поскольку роли не могут быть проверены и закреплены, как могут поваренные книги. Однако чтение документации для поваренной книги, они говорят вам использовать переопределение атрибутов в своей роли, так это то, что я сделал:

override_attributes( 'nginx' => { 'source' => { 'version' => '1.4.1', 'prefix' => '/opt/nginx-1.4.1' }, 'version' => '1.4.1' } )

Однако, когда я сходиться я до сих пор вижу следы 1.2.6 шоу в лог-выход.

[2013-07-15T18:52:03-04:00] INFO: Processing remote_file[http://nginx.org/download/nginx-1.2.6.tar.gz] action create (nginx::source line 56) 
[2013-07-15T18:52:05-04:00] INFO: remote_file[http://nginx.org/download/nginx-1.2.6.tar.gz] updated 

, а затем сразу после этого ...

Mixlib::ShellOut::ShellCommandFailed 
------------------------------------ 
Expected process to exit with [0], but received '1' 
---- Begin output of "bash" "/tmp/chef-script20130715-4790-1m689ee" ---- 
STDOUT: 
STDERR: /tmp/chef-script20130715-4790-1m689ee: line 2: cd: nginx-1.4.1: No such file or directory 
---- End output of "bash" "/tmp/chef-script20130715-4790-1m689ee" ---- 
Ran "bash" "/tmp/chef-script20130715-4790-1m689ee" returned 1 

Resource Declaration: 
--------------------- 
# In /var/chef/cache/cookbooks/nginx/recipes/source.rb 

84: bash "compile_nginx_source" do 
85: cwd ::File.dirname(src_filepath) 
86: code <<-EOH 
87:  tar zxf #{::File.basename(src_filepath)} -C#{::File.dirname(src_filepath)} && 
88:  cd nginx-#{node['nginx']['source']['version']} && 
89:  ./configure #{node.run_state['nginx_configure_flags'].join(" ")} && 
90:  make && make install 
91: EOH 
92: 
93: not_if do 
94:  nginx_force_recompile == false && 
95:  node.automatic_attrs['nginx'] && 
96:  node.automatic_attrs['nginx']['version'] == node['nginx']['source']['version'] && 
97:  node.automatic_attrs['nginx']['configure_arguments'].sort == configure_flags.sort 
98: end 
99: 
100: notifies :restart, "service[nginx]" 
101: end 
102: 

Compiled Resource: 
------------------ 
# Declared in /var/chef/cache/cookbooks/nginx/recipes/source.rb:84:in `from_file' 

bash("compile_nginx_source") do 
    action "run" 
    retries 0 
    retry_delay 2 
    command "\"bash\" \"/tmp/chef-script20130715-4790-1m689ee\"" 
    backup 5 
    cwd "/var/chef/cache" 
    returns 0 
    code " tar zxf nginx-1.4.1.tar.gz -C /var/chef/cache &&\n cd nginx-1.4.1 &&\n ./configure --prefix=/opt/nginx-1.2.6 --conf-path=/etc/nginx/nginx.conf --with-http_gzip_static_module --with-http_realip_module --with-http_ssl_module --with-http_stub_status_module &&\n make && make install\n" 
    interpreter "bash" 
    cookbook_name "nginx" 
    recipe_name "source" 
    not_if { #code block } 
end 

Я действительно в конце остроумия, потому что я надеялся, что я мог бы просто переопределить атрибут версии и иметь его все встало на свои места. Очевидно, что до сих пор это не так, и я действительно не хочу заниматься ручным исправлением и/или редактированием объектов узлов, если я могу ему помочь. Любая помощь будет оценена по достоинству.

+0

Эта поваренная книга nginx вы используете? – cmur2

+0

https://github.com/opscode-cookbooks/nginx – MattC

+0

Не было бы лучше обновить версию кулинарной книги nginx? Теперь в cookbook v2.7 они включают nginx 1.4.4 –

ответ

0

Эта линия:

[2013-07-15T18:52:03-04:00] INFO: Processing remote_file[http://nginx.org/download/nginx-1.2.6.tar.gz] action create (nginx::source line 56)

line 56 Указывает на source рецепт на nginx поваренной книги. Там вы можете увидеть, что URL для архива источника устанавливается с помощью this logic:

nginx_url = node['nginx']['source']['url'] || "http://nginx.org/download/nginx-#{node['nginx']['source']['version']}.tar.gz"

Так что я думаю, что node['nginx']['source']['url'] указывает на версию nginx версии 1.6. Он должен зависеть от атрибута node['nginx']['source']['version'], как можно видеть here, но, возможно, здесь есть некоторый порядок загрузки атрибутов, который мешает.

Попробуйте установить node['nginx']['source']['url'] на http://nginx.org/download/nginx-1.4.1.tar.gz, сохраняя исходную версию также установленной на 1.4.1.

Моя догадка заключается в том, что вы загружаете 1.2.6 при попытке извлечь 1.4.1, чего там нет, поэтому скрипт bash терпит неудачу.

+0

Исправить. Я переопредел версию и исходную версию в роли, и вы можете видеть, что она выбирает это в определенных местах, но другие места по-прежнему ссылаются на 1.2.6. – MattC

+0

Ницца, так что это по крайней мере немного ближе к решению. Не могли бы вы указать, где он все еще не работает (журналы будут в порядке, так же, как вы делали в OP) – cassianoleal

2

Я сталкиваюсь с этой самой проблемой. Лучше всего я могу сказать, корень проблемы заключается в использовании конкатенации строк в файлах атрибутов в кулинарной книге nginx. Если вы посмотрите на атрибуты/источник.rb, вы увидите следующее:

default['nginx']['source']['default_configure_flags'] = [ 
    "--prefix=#{node['nginx']['source']['prefix']}", 
    "--conf-path=#{node['nginx']['dir']}/nginx.conf", 
    "--sbin-path=#{node['nginx']['source']['sbin_path']}" 
] 

Это прекрасные разумные значения по умолчанию. И можно подумать, что если один переопределяет один из ссылочных атрибутов, node ['nginx'] ['source'] ['prefix'], то результирующие default_configure_flags будут отражать это изменение. Однако, похоже, это не так. Похоже, что файлы атрибутов являются одной из первых вещей, загруженных при запуске шеф-повара. Таким образом, значения, назначенные для таких вещей, как default_configure_flags, основаны на значениях по умолчанию, предоставляемых поваренной книгой (т. Е. Строка версии 1.2.6, которая установлена ​​в атрибутах/default.rb).

Недостаточно серьезной работы по очистке кулинарной книги nginx, лучшим решением было переопределить атрибут default_configure_flags в моем собственном файле атрибутов (наряду с рядом других, которые выглядят так, как будто они должны быть прекрасными, но вызывают то же самое вопрос, посмотрите на остальные атрибуты/source.rb для сброса). К сожалению, я переопределяю его так же, как и по умолчанию, он просто получает оценку позже после того, как другие значения, на которые он ссылается, установлены на то, что я хочу.

Смежные вопросы